fsdb 0.5 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. data/{RELEASE-NOTES → History.txt} +6 -0
  2. data/{README → README.txt} +26 -17
  3. data/examples/flat.rb +146 -0
  4. data/examples/fsdb-example.rb +28 -0
  5. data/examples/rbformat.rb +17 -0
  6. data/examples/yaml2.rb +29 -0
  7. data/junk/OLDRakefile +98 -0
  8. data/junk/OLDRakefile2 +55 -0
  9. data/junk/check-cache.rb +18 -0
  10. data/junk/create-lock.rb +25 -0
  11. data/junk/doc/old-api/classes/FSDB.html +139 -0
  12. data/junk/doc/old-api/classes/FSDB/Database.html +953 -0
  13. data/junk/doc/old-api/classes/FSDB/Database.src/M000029.html +16 -0
  14. data/junk/doc/old-api/classes/FSDB/Database.src/M000030.html +16 -0
  15. data/junk/doc/old-api/classes/FSDB/Database.src/M000031.html +16 -0
  16. data/junk/doc/old-api/classes/FSDB/Database.src/M000032.html +16 -0
  17. data/junk/doc/old-api/classes/FSDB/Database.src/M000033.html +33 -0
  18. data/junk/doc/old-api/classes/FSDB/Database.src/M000034.html +18 -0
  19. data/junk/doc/old-api/classes/FSDB/Database.src/M000035.html +22 -0
  20. data/junk/doc/old-api/classes/FSDB/Database.src/M000036.html +16 -0
  21. data/junk/doc/old-api/classes/FSDB/Database.src/M000037.html +22 -0
  22. data/junk/doc/old-api/classes/FSDB/Database.src/M000038.html +43 -0
  23. data/junk/doc/old-api/classes/FSDB/Database.src/M000039.html +25 -0
  24. data/junk/doc/old-api/classes/FSDB/Database.src/M000040.html +43 -0
  25. data/junk/doc/old-api/classes/FSDB/Database.src/M000041.html +23 -0
  26. data/junk/doc/old-api/classes/FSDB/Database.src/M000042.html +22 -0
  27. data/junk/doc/old-api/classes/FSDB/Database.src/M000043.html +16 -0
  28. data/junk/doc/old-api/classes/FSDB/Database.src/M000044.html +16 -0
  29. data/junk/doc/old-api/classes/FSDB/Database.src/M000045.html +18 -0
  30. data/junk/doc/old-api/classes/FSDB/Database.src/M000046.html +18 -0
  31. data/junk/doc/old-api/classes/FSDB/Database.src/M000047.html +18 -0
  32. data/junk/doc/old-api/classes/FSDB/Database.src/M000048.html +16 -0
  33. data/junk/doc/old-api/classes/FSDB/Database.src/M000049.html +71 -0
  34. data/junk/doc/old-api/classes/FSDB/Database.src/M000050.html +43 -0
  35. data/junk/doc/old-api/classes/FSDB/Database.src/M000051.html +53 -0
  36. data/junk/doc/old-api/classes/FSDB/Database.src/M000052.html +44 -0
  37. data/junk/doc/old-api/classes/FSDB/Database.src/M000053.html +39 -0
  38. data/junk/doc/old-api/classes/FSDB/Database.src/M000054.html +72 -0
  39. data/junk/doc/old-api/classes/FSDB/Database.src/M000055.html +39 -0
  40. data/junk/doc/old-api/classes/FSDB/Database.src/M000056.html +18 -0
  41. data/junk/doc/old-api/classes/FSDB/Database.src/M000057.html +18 -0
  42. data/junk/doc/old-api/classes/FSDB/Database.src/M000058.html +18 -0
  43. data/junk/doc/old-api/classes/FSDB/Database.src/M000059.html +18 -0
  44. data/junk/doc/old-api/classes/FSDB/Database.src/M000060.html +18 -0
  45. data/junk/doc/old-api/classes/FSDB/Database.src/M000061.html +23 -0
  46. data/junk/doc/old-api/classes/FSDB/Database.src/M000062.html +23 -0
  47. data/junk/doc/old-api/classes/FSDB/Database.src/M000063.html +18 -0
  48. data/junk/doc/old-api/classes/FSDB/Database.src/M000064.html +18 -0
  49. data/junk/doc/old-api/classes/FSDB/Database/AbortedTransaction.html +118 -0
  50. data/junk/doc/old-api/classes/FSDB/Database/CreateFileError.html +120 -0
  51. data/junk/doc/old-api/classes/FSDB/Database/DirIsImmutableError.html +117 -0
  52. data/junk/doc/old-api/classes/FSDB/Database/DirNotEmptyError.html +117 -0
  53. data/junk/doc/old-api/classes/FSDB/Database/FormatError.html +117 -0
  54. data/junk/doc/old-api/classes/FSDB/Database/MissingFileError.html +117 -0
  55. data/junk/doc/old-api/classes/FSDB/Database/MissingObjectError.html +117 -0
  56. data/junk/doc/old-api/classes/FSDB/Database/NotDirError.html +118 -0
  57. data/junk/doc/old-api/classes/FSDB/Database/PathComponentError.html +120 -0
  58. data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.html +148 -0
  59. data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.src/M000005.html +21 -0
  60. data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.src/M000007.html +21 -0
  61. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.html +210 -0
  62. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000006.html +22 -0
  63. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000007.html +22 -0
  64. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000008.html +22 -0
  65. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000009.html +22 -0
  66. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000010.html +22 -0
  67. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000011.html +22 -0
  68. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000012.html +22 -0
  69. data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000013.html +22 -0
  70. data/junk/doc/old-api/classes/FSDB/ForkSafely.html +126 -0
  71. data/junk/doc/old-api/classes/FSDB/Modex.html +237 -0
  72. data/junk/doc/old-api/classes/FSDB/Modex.src/M000024.html +21 -0
  73. data/junk/doc/old-api/classes/FSDB/Modex.src/M000025.html +30 -0
  74. data/junk/doc/old-api/classes/FSDB/Modex.src/M000026.html +21 -0
  75. data/junk/doc/old-api/classes/FSDB/Modex.src/M000027.html +30 -0
  76. data/junk/doc/old-api/classes/FSDB/Modex.src/M000028.html +44 -0
  77. data/junk/doc/old-api/classes/FSDB/Modex.src/M000029.html +26 -0
  78. data/junk/doc/old-api/classes/FSDB/Modex.src/M000030.html +48 -0
  79. data/junk/doc/old-api/classes/FSDB/Modex/ForkSafely.html +105 -0
  80. data/junk/doc/old-api/classes/FSDB/Mutex.html +244 -0
  81. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000018.html +19 -0
  82. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000019.html +18 -0
  83. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000020.html +19 -0
  84. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000021.html +18 -0
  85. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000022.html +23 -0
  86. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000023.html +30 -0
  87. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000024.html +26 -0
  88. data/junk/doc/old-api/classes/FSDB/Mutex.src/M000025.html +21 -0
  89. data/junk/doc/old-api/classes/FSDB/Mutex/ForkSafely.html +105 -0
  90. data/junk/doc/old-api/classes/FSDB/PathUtilities.html +257 -0
  91. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000012.html +23 -0
  92. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000013.html +18 -0
  93. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000014.html +23 -0
  94. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000015.html +18 -0
  95. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000016.html +18 -0
  96. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000017.html +22 -0
  97. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000018.html +23 -0
  98. data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000019.html +18 -0
  99. data/junk/doc/old-api/classes/FSDB/PathUtilities/InvalidPathError.html +111 -0
  100. data/junk/doc/old-api/classes/File.html +272 -0
  101. data/junk/doc/old-api/classes/File.src/M000001.html +17 -0
  102. data/junk/doc/old-api/classes/File.src/M000002.html +17 -0
  103. data/junk/doc/old-api/classes/File.src/M000003.html +20 -0
  104. data/junk/doc/old-api/classes/File.src/M000004.html +20 -0
  105. data/junk/doc/old-api/classes/File.src/M000005.html +32 -0
  106. data/junk/doc/old-api/classes/File.src/M000006.html +32 -0
  107. data/junk/doc/old-api/created.rid +1 -0
  108. data/junk/doc/old-api/files/README.html +112 -0
  109. data/junk/doc/old-api/files/RELEASE-NOTES.html +233 -0
  110. data/junk/doc/old-api/files/fsdb_txt.html +888 -0
  111. data/junk/doc/old-api/files/lib/fsdb/database_rb.html +115 -0
  112. data/junk/doc/old-api/files/lib/fsdb/file-lock_rb.html +109 -0
  113. data/junk/doc/old-api/files/lib/fsdb/modex_rb.html +121 -0
  114. data/junk/doc/old-api/files/lib/fsdb/mutex_rb.html +108 -0
  115. data/junk/doc/old-api/files/lib/fsdb/util_rb.html +108 -0
  116. data/junk/doc/old-api/fr_class_index.html +47 -0
  117. data/junk/doc/old-api/fr_file_index.html +34 -0
  118. data/junk/doc/old-api/fr_method_index.html +90 -0
  119. data/junk/doc/old-api/index.html +24 -0
  120. data/junk/doc/old-api/rdoc-style.css +208 -0
  121. data/junk/file-lock-nb.rb +15 -0
  122. data/junk/fl.rb +144 -0
  123. data/junk/flock-test.rb +39 -0
  124. data/junk/fsdb.kateproject +47 -0
  125. data/junk/fsdb.prj +196 -0
  126. data/junk/fsdb.sf +46 -0
  127. data/junk/insert-dir.rb +48 -0
  128. data/junk/lock-test-bug.rb +150 -0
  129. data/junk/lock-test-too-simple.rb +136 -0
  130. data/junk/lock-test.rb +151 -0
  131. data/{script → junk}/mkrdoc +0 -0
  132. data/junk/restore-fsdb.rb +37 -0
  133. data/junk/rf.txt +5 -0
  134. data/junk/solaris-bug-fixed.rb +184 -0
  135. data/junk/solaris-bug.rb +182 -0
  136. data/junk/solaris-bug.txt +43 -0
  137. data/junk/sync.rb +327 -0
  138. data/junk/test-file-lock.html +86 -0
  139. data/junk/test-file-lock.rb +84 -0
  140. data/junk/test-processes.rb +131 -0
  141. data/junk/test-threads.rb +113 -0
  142. data/junk/wiki-mutex.rb +108 -0
  143. data/lib/fsdb/database.rb +5 -3
  144. data/lib/fsdb/delegatable.rb +21 -0
  145. data/lib/fsdb/faster-modex.rb +223 -0
  146. data/lib/fsdb/faster-mutex.rb +138 -0
  147. data/lib/fsdb/mutex.rb +4 -1
  148. data/lib/fsdb/persistent.rb +91 -0
  149. data/lib/fsdb/read-write-object.rb +36 -0
  150. data/lib/fsdb/server.rb +44 -0
  151. data/misc/fsdb-blorubu.txt +47 -0
  152. data/misc/mtime-and-file-id.txt +23 -0
  153. data/misc/posixlock.txt +148 -0
  154. data/rakefile +39 -0
  155. data/tasks/ann.rake +80 -0
  156. data/tasks/bones.rake +20 -0
  157. data/tasks/gem.rake +201 -0
  158. data/tasks/git.rake +40 -0
  159. data/tasks/notes.rake +27 -0
  160. data/tasks/post_load.rake +34 -0
  161. data/tasks/rdoc.rake +51 -0
  162. data/tasks/rubyforge.rake +55 -0
  163. data/tasks/setup.rb +292 -0
  164. data/tasks/spec.rake +54 -0
  165. data/tasks/svn.rake +47 -0
  166. data/tasks/test.rake +40 -0
  167. data/tasks/zentest.rake +36 -0
  168. data/test/err.txt +31 -0
  169. data/test/runs.rb +8 -0
  170. data/test/test-file-lock.rb +78 -0
  171. data/test/test-util.rb +1 -0
  172. data/test/trap.rb +31 -0
  173. metadata +198 -35
  174. data/Manifest +0 -36
  175. data/Rakefile +0 -10
  176. data/fsdb.gemspec +0 -113
data/junk/OLDRakefile2 ADDED
@@ -0,0 +1,55 @@
1
+ @project = 'fsdb'
2
+
3
+ #==== Tasks
4
+
5
+ desc "make Ruby api docs"
6
+ task :rdoc
7
+
8
+ #==== Utility methods
9
+
10
+ def version
11
+ @version ||= `prcs info | tail -n1`[/^(.*) by \w+/, 1]
12
+ end
13
+
14
+ def ver
15
+ @ver ||= version[/^#{@project} (\S+)/, 1]
16
+ end
17
+
18
+ #==== Definitions
19
+
20
+ ruby_api_doc_dir = "doc/api"
21
+ ruby_doc_index = File.join(ruby_api_doc_dir, "index.html")
22
+ ruby_doc_files = FileList[%w{
23
+ fsdb.txt RELEASE-NOTES README
24
+ lib/fsdb/database.rb lib/fsdb/file-lock.rb lib/fsdb/util.rb
25
+ lib/fsdb/modex.rb lib/fsdb/mutex.rb lib/fsdb/util.rb
26
+ lib/fsdb/formats.rb
27
+ }]
28
+
29
+ project_web = "vjoel@rubyforge.org:/var/www/gforge-projects/#{@project}"
30
+
31
+ #==== Actions
32
+
33
+ file ruby_doc_index => ruby_doc_files do
34
+ sh %{
35
+ rdoc --template=jamis --inline-source -m fsdb.txt \
36
+ -o #{ruby_api_doc_dir} \
37
+ -t 'FSDB' -f html \
38
+ #{ruby_doc_files}
39
+ }
40
+ end
41
+
42
+ task :rdoc => ruby_doc_index
43
+
44
+ task :rubyforge => [:rdoc] do
45
+ ## rdoc still doesn't work on rubyforge?
46
+ sh "scp -r doc/api/* #{project_web}"
47
+ end
48
+
49
+ task :version do
50
+ puts version
51
+ end
52
+
53
+ task :ver do
54
+ puts ver
55
+ end
@@ -0,0 +1,18 @@
1
+ def self.check_cache tester, db, path, thread, who
2
+ unless $solaris # the File.read gives up the flock?
3
+ __x__ = tester.x
4
+
5
+ data = File.read(File.join(db.dir, path))
6
+
7
+ uncached_x = Marshal.load(data).x rescue nil
8
+ if uncached_x
9
+ unless uncached_x == __x__
10
+ fail "#{who} test, process #{Process.pid}," +
11
+ " thread #{thread[:number]}:" +
12
+ " cache is stale:\n" +
13
+ " #{uncached_x} on disk, #{__x__} in cache" +
14
+ " #{tester}"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,25 @@
1
+
2
+ # <b>Windows:</b>
3
+ # Opens path for writing and reading ("w+") with an exclusive lock for the
4
+ # duration of the block.
5
+ # def open_create_lock(path)
6
+ # is_dir = path =~ /\/$/
7
+ # File.open(path, is_dir ? "r" : "w+") do |f|
8
+ # set_binmode(f, path)
9
+ # f.lock_exclusive(is_dir) do
10
+ # yield f
11
+ # end
12
+ # end
13
+ # end
14
+
15
+ # <b>Non-Windows:</b>
16
+ # Opens path for writing and reading ("w+") with an exclusive lock for the
17
+ # duration of the block.
18
+ # def open_create_lock(path)
19
+ # is_dir = path =~ /\/$/
20
+ # File.open(path, is_dir ? "r" : "w+") do |f|
21
+ # f.lock_exclusive(is_dir) do
22
+ # yield f
23
+ # end
24
+ # end
25
+ # end
@@ -0,0 +1,139 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Module: FSDB</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href=".././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Module</strong></td>
53
+ <td class="class-name-in-header">FSDB</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../files/lib/fsdb/database_rb.html">
59
+ lib/fsdb/database.rb
60
+ </a>
61
+ <br />
62
+ <a href="../files/lib/fsdb/util_rb.html">
63
+ lib/fsdb/util.rb
64
+ </a>
65
+ <br />
66
+ <a href="../files/lib/fsdb/modex_rb.html">
67
+ lib/fsdb/modex.rb
68
+ </a>
69
+ <br />
70
+ <a href="../files/lib/fsdb/mutex_rb.html">
71
+ lib/fsdb/mutex.rb
72
+ </a>
73
+ <br />
74
+ </td>
75
+ </tr>
76
+
77
+ </table>
78
+ </div>
79
+ <!-- banner header -->
80
+
81
+ <div id="bodyContent">
82
+
83
+
84
+
85
+ <div id="contextContent">
86
+
87
+
88
+
89
+ </div>
90
+
91
+
92
+ </div>
93
+
94
+
95
+ <!-- if includes -->
96
+ <div id="includes">
97
+ <h3 class="section-bar">Included Modules</h3>
98
+
99
+ <div id="includes-list">
100
+ <span class="include-name">Formats</span>
101
+ <span class="include-name"><a href="FSDB/PathUtilities.html">PathUtilities</a></span>
102
+ <span class="include-name"><a href="FSDB/ForkSafely.html">ForkSafely</a></span>
103
+ <span class="include-name"><a href="FSDB/ForkSafely.html">ForkSafely</a></span>
104
+ </div>
105
+ </div>
106
+
107
+ <div id="section">
108
+
109
+ <div id="class-list">
110
+ <h3 class="section-bar">Classes and Modules</h3>
111
+
112
+ Module <a href="FSDB/DatabaseDebuggable.html" class="link">FSDB::DatabaseDebuggable</a><br />
113
+ Module <a href="FSDB/DirectoryIterators.html" class="link">FSDB::DirectoryIterators</a><br />
114
+ Module <a href="FSDB/ForkSafely.html" class="link">FSDB::ForkSafely</a><br />
115
+ Module <a href="FSDB/PathUtilities.html" class="link">FSDB::PathUtilities</a><br />
116
+ Class <a href="FSDB/Database.html" class="link">FSDB::Database</a><br />
117
+ Class <a href="FSDB/Modex.html" class="link">FSDB::Modex</a><br />
118
+ Class <a href="FSDB/Mutex.html" class="link">FSDB::Mutex</a><br />
119
+
120
+ </div>
121
+
122
+
123
+
124
+
125
+
126
+
127
+
128
+ <!-- if method_list -->
129
+
130
+
131
+ </div>
132
+
133
+
134
+ <div id="validator-badges">
135
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
136
+ </div>
137
+
138
+ </body>
139
+ </html>
@@ -0,0 +1,953 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <!DOCTYPE html
3
+ PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
4
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
5
+
6
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
7
+ <head>
8
+ <title>Class: FSDB::Database</title>
9
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
10
+ <meta http-equiv="Content-Script-Type" content="text/javascript" />
11
+ <link rel="stylesheet" href="../.././rdoc-style.css" type="text/css" media="screen" />
12
+ <script type="text/javascript">
13
+ // <![CDATA[
14
+
15
+ function popupCode( url ) {
16
+ window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
17
+ }
18
+
19
+ function toggleCode( id ) {
20
+ if ( document.getElementById )
21
+ elem = document.getElementById( id );
22
+ else if ( document.all )
23
+ elem = eval( "document.all." + id );
24
+ else
25
+ return false;
26
+
27
+ elemStyle = elem.style;
28
+
29
+ if ( elemStyle.display != "block" ) {
30
+ elemStyle.display = "block"
31
+ } else {
32
+ elemStyle.display = "none"
33
+ }
34
+
35
+ return true;
36
+ }
37
+
38
+ // Make codeblocks hidden by default
39
+ document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
40
+
41
+ // ]]>
42
+ </script>
43
+
44
+ </head>
45
+ <body>
46
+
47
+
48
+
49
+ <div id="classHeader">
50
+ <table class="header-table">
51
+ <tr class="top-aligned-row">
52
+ <td><strong>Class</strong></td>
53
+ <td class="class-name-in-header">FSDB::Database</td>
54
+ </tr>
55
+ <tr class="top-aligned-row">
56
+ <td><strong>In:</strong></td>
57
+ <td>
58
+ <a href="../../files/lib/fsdb/database_rb.html">
59
+ lib/fsdb/database.rb
60
+ </a>
61
+ <br />
62
+ <a href="../../files/lib/fsdb/util_rb.html">
63
+ lib/fsdb/util.rb
64
+ </a>
65
+ <br />
66
+ </td>
67
+ </tr>
68
+
69
+ <tr class="top-aligned-row">
70
+ <td><strong>Parent:</strong></td>
71
+ <td>
72
+ Object
73
+ </td>
74
+ </tr>
75
+ </table>
76
+ </div>
77
+ <!-- banner header -->
78
+
79
+ <div id="bodyContent">
80
+
81
+
82
+
83
+ <div id="contextContent">
84
+
85
+ <div id="description">
86
+ <p>
87
+ A thread-safe, process-safe object database class which uses the native
88
+ file system as its back end and allows multiple file formats.
89
+ </p>
90
+
91
+ </div>
92
+
93
+
94
+ </div>
95
+
96
+ <div id="method-list">
97
+ <h3 class="section-bar">Methods</h3>
98
+
99
+ <div class="name-list">
100
+ <a href="#M000034">[]</a>&nbsp;&nbsp;
101
+ <a href="#M000056">[]</a>&nbsp;&nbsp;
102
+ <a href="#M000053">[]=</a>&nbsp;&nbsp;
103
+ <a href="#M000044">abort</a>&nbsp;&nbsp;
104
+ <a href="#M000043">abort</a>&nbsp;&nbsp;
105
+ <a href="#M000037">absolute</a>&nbsp;&nbsp;
106
+ <a href="#M000038">absolute_path_to</a>&nbsp;&nbsp;
107
+ <a href="#M000049">browse</a>&nbsp;&nbsp;
108
+ <a href="#M000031">cache</a>&nbsp;&nbsp;
109
+ <a href="#M000032">cache_mutex</a>&nbsp;&nbsp;
110
+ <a href="#M000042">clear_cache</a>&nbsp;&nbsp;
111
+ <a href="#M000041">clear_entry</a>&nbsp;&nbsp;
112
+ <a href="#M000045">default_browse</a>&nbsp;&nbsp;
113
+ <a href="#M000046">default_edit</a>&nbsp;&nbsp;
114
+ <a href="#M000048">default_fetch</a>&nbsp;&nbsp;
115
+ <a href="#M000054">delete</a>&nbsp;&nbsp;
116
+ <a href="#M000058">dump</a>&nbsp;&nbsp;
117
+ <a href="#M000050">edit</a>&nbsp;&nbsp;
118
+ <a href="#M000055">fetch</a>&nbsp;&nbsp;
119
+ <a href="#M000062">find_format</a>&nbsp;&nbsp;
120
+ <a href="#M000059">formats</a>&nbsp;&nbsp;
121
+ <a href="#M000060">formats=</a>&nbsp;&nbsp;
122
+ <a href="#M000039">get_file_id</a>&nbsp;&nbsp;
123
+ <a href="#M000061">identify_file_type</a>&nbsp;&nbsp;
124
+ <a href="#M000052">insert</a>&nbsp;&nbsp;
125
+ <a href="#M000036">inspect</a>&nbsp;&nbsp;
126
+ <a href="#M000063">link</a>&nbsp;&nbsp;
127
+ <a href="#M000057">load</a>&nbsp;&nbsp;
128
+ <a href="#M000040">make_file_id</a>&nbsp;&nbsp;
129
+ <a href="#M000033">new</a>&nbsp;&nbsp;
130
+ <a href="#M000047">object_missing</a>&nbsp;&nbsp;
131
+ <a href="#M000051">replace</a>&nbsp;&nbsp;
132
+ <a href="#M000035">subdb</a>&nbsp;&nbsp;
133
+ <a href="#M000064">symlink</a>&nbsp;&nbsp;
134
+ </div>
135
+ </div>
136
+
137
+ </div>
138
+
139
+
140
+ <!-- if includes -->
141
+ <div id="includes">
142
+ <h3 class="section-bar">Included Modules</h3>
143
+
144
+ <div id="includes-list">
145
+ <span class="include-name">Formats</span>
146
+ <span class="include-name"><a href="PathUtilities.html">PathUtilities</a></span>
147
+ <span class="include-name"><a href="DirectoryIterators.html">DirectoryIterators</a></span>
148
+ </div>
149
+ </div>
150
+
151
+ <div id="section">
152
+
153
+ <div id="class-list">
154
+ <h3 class="section-bar">Classes and Modules</h3>
155
+
156
+ Class <a href="Database/AbortedTransaction.html" class="link">FSDB::Database::AbortedTransaction</a><br />
157
+ Class <a href="Database/CreateFileError.html" class="link">FSDB::Database::CreateFileError</a><br />
158
+ Class <a href="Database/DirIsImmutableError.html" class="link">FSDB::Database::DirIsImmutableError</a><br />
159
+ Class <a href="Database/DirNotEmptyError.html" class="link">FSDB::Database::DirNotEmptyError</a><br />
160
+ Class <a href="Database/FormatError.html" class="link">FSDB::Database::FormatError</a><br />
161
+ Class <a href="Database/MissingFileError.html" class="link">FSDB::Database::MissingFileError</a><br />
162
+ Class <a href="Database/MissingObjectError.html" class="link">FSDB::Database::MissingObjectError</a><br />
163
+ Class <a href="Database/NotDirError.html" class="link">FSDB::Database::NotDirError</a><br />
164
+ Class <a href="Database/PathComponentError.html" class="link">FSDB::Database::PathComponentError</a><br />
165
+
166
+ </div>
167
+
168
+ <div id="constants-list">
169
+ <h3 class="section-bar">Constants</h3>
170
+
171
+ <div class="name-list">
172
+ <table summary="Constants">
173
+ <tr class="top-aligned-row context-row">
174
+ <td class="context-item-name">MTIME_RESOLUTION</td>
175
+ <td>=</td>
176
+ <td class="context-item-value">2.1</td>
177
+ <td width="3em">&nbsp;</td>
178
+ <td class="context-item-desc">
179
+ On windows, FAT mtime granularity is 2 sec, NTFS is 1 sec.
180
+
181
+ </td>
182
+ </tr>
183
+ <tr class="top-aligned-row context-row">
184
+ <td class="context-item-name">MTIME_RESOLUTION</td>
185
+ <td>=</td>
186
+ <td class="context-item-value">1.1</td>
187
+ <td width="3em">&nbsp;</td>
188
+ <td class="context-item-desc">
189
+ Even when linux mounts FAT, the mtime granularity is 1 sec.
190
+
191
+ </td>
192
+ </tr>
193
+ <tr class="top-aligned-row context-row">
194
+ <td class="context-item-name">CLOCK_SKEW</td>
195
+ <td>=</td>
196
+ <td class="context-item-value">0.0</td>
197
+ <td width="3em">&nbsp;</td>
198
+ <td class="context-item-desc">
199
+ in seconds, adjust as needed for stability on NFS
200
+
201
+ </td>
202
+ </tr>
203
+ <tr class="top-aligned-row context-row">
204
+ <td class="context-item-name">DEFAULT_META_PREFIX</td>
205
+ <td>=</td>
206
+ <td class="context-item-value">'..fsdb.meta.'</td>
207
+ <td width="3em">&nbsp;</td>
208
+ <td class="context-item-desc">
209
+ Subclasses can change the defaults.
210
+
211
+ </td>
212
+ </tr>
213
+ <tr class="top-aligned-row context-row">
214
+ <td class="context-item-name">DEFAULT_LOCK_TYPE</td>
215
+ <td>=</td>
216
+ <td class="context-item-value">:flock</td>
217
+ <td width="3em">&nbsp;</td>
218
+ <td class="context-item-desc">
219
+ if RUBY_PLATFORM =~ /darwin/
220
+
221
+ <pre>
222
+ DEFAULT_LOCK_TYPE = :fcntl_lock
223
+ </pre>
224
+ <p>
225
+ else
226
+ </p>
227
+ </td>
228
+ </tr>
229
+ <tr class="top-aligned-row context-row">
230
+ <td class="context-item-name">LOCK_TYPES</td>
231
+ <td>=</td>
232
+ <td class="context-item-value">[:flock, :fcntl_lock]</td>
233
+ <td width="3em">&nbsp;</td>
234
+ <td class="context-item-desc">
235
+ These must be methods of <a href="../File.html">File</a>.
236
+
237
+ </td>
238
+ </tr>
239
+ <tr class="top-aligned-row context-row">
240
+ <td class="context-item-name">FORMATS</td>
241
+ <td>=</td>
242
+ <td class="context-item-value">[TEXT_FORMAT, MARSHAL_FORMAT].freeze</td>
243
+ <td width="3em">&nbsp;</td>
244
+ <td class="context-item-desc">
245
+ Subclasses can define their own list of formats, with specified search
246
+ order
247
+
248
+ </td>
249
+ </tr>
250
+ </table>
251
+ </div>
252
+ </div>
253
+
254
+
255
+
256
+ <div id="attribute-list">
257
+ <h3 class="section-bar">Attributes</h3>
258
+
259
+ <div class="name-list">
260
+ <table>
261
+ <tr class="top-aligned-row context-row">
262
+ <td class="context-item-name">dir</td>
263
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
264
+ <td class="context-item-desc">
265
+ The root directory of the db, to which paths are relative.
266
+
267
+ </td>
268
+ </tr>
269
+ <tr class="top-aligned-row context-row">
270
+ <td class="context-item-name">lock_type</td>
271
+ <td class="context-item-value">&nbsp;[R]&nbsp;</td>
272
+ <td class="context-item-desc">
273
+ The lock type of the db, by default <tt>:flock</tt>, optionally
274
+ <tt>:fcntl_lock</tt>.
275
+
276
+ </td>
277
+ </tr>
278
+ </table>
279
+ </div>
280
+ </div>
281
+
282
+
283
+
284
+ <!-- if method_list -->
285
+ <div id="methods">
286
+ <h3 class="section-bar">Public Class methods</h3>
287
+
288
+ <div id="method-M000034" class="method-detail">
289
+ <a name="M000034"></a>
290
+
291
+ <div class="method-heading">
292
+ <a href="Database.src/M000034.html" target="Code" class="method-signature"
293
+ onclick="popupCode('Database.src/M000034.html');return false;">
294
+ <span class="method-name">[]</span><span class="method-args">(path)</span>
295
+ </a>
296
+ </div>
297
+
298
+ <div class="method-description">
299
+ <p>
300
+ Shortcut to create a new database at <tt>path</tt>.
301
+ </p>
302
+ </div>
303
+ </div>
304
+
305
+ <div id="method-M000044" class="method-detail">
306
+ <a name="M000044"></a>
307
+
308
+ <div class="method-heading">
309
+ <a href="Database.src/M000044.html" target="Code" class="method-signature"
310
+ onclick="popupCode('Database.src/M000044.html');return false;">
311
+ <span class="method-name">abort</span><span class="method-args">()</span>
312
+ </a>
313
+ </div>
314
+
315
+ <div class="method-description">
316
+ <p>
317
+ Same as <a href="Database.html#M000043">abort</a>.
318
+ </p>
319
+ </div>
320
+ </div>
321
+
322
+ <div id="method-M000033" class="method-detail">
323
+ <a name="M000033"></a>
324
+
325
+ <div class="method-heading">
326
+ <a href="Database.src/M000033.html" target="Code" class="method-signature"
327
+ onclick="popupCode('Database.src/M000033.html');return false;">
328
+ <span class="method-name">new</span><span class="method-args">(dir, opts = {})</span>
329
+ </a>
330
+ </div>
331
+
332
+ <div class="method-description">
333
+ <p>
334
+ Create a new database object that accesses <tt>dir</tt>. Makes sure that
335
+ the directory exists on disk, but doesn&#8217;t create or open any other
336
+ files. The <tt>opts</tt> hash can include:
337
+ </p>
338
+ <table>
339
+ <tr><td valign="top"><tt>:lock_type</tt>:</td><td><tt>:flock</tt> by default, or <tt>:fcntl_lock</tt>
340
+
341
+ </td></tr>
342
+ <tr><td valign="top"><tt>:meta_prefix</tt>:</td><td><tt>&#8217;..fsdb.meta.&#8217;</tt> by default
343
+
344
+ </td></tr>
345
+ <tr><td valign="top"><tt>:formats</tt>:</td><td>nil by default, so the class&#8217;s FORMATS is used
346
+
347
+ </td></tr>
348
+ </table>
349
+ </div>
350
+ </div>
351
+
352
+ <h3 class="section-bar">Public Instance methods</h3>
353
+
354
+ <div id="method-M000056" class="method-detail">
355
+ <a name="M000056"></a>
356
+
357
+ <div class="method-heading">
358
+ <span class="method-name">[]</span><span class="method-args">(path = &quot;/&quot;)</span>
359
+ </div>
360
+
361
+ <div class="method-description">
362
+ <p>
363
+ Alias for <a href="Database.html#M000055">fetch</a>
364
+ </p>
365
+ </div>
366
+ </div>
367
+
368
+ <div id="method-M000053" class="method-detail">
369
+ <a name="M000053"></a>
370
+
371
+ <div class="method-heading">
372
+ <span class="method-name">[]=</span><span class="method-args">(path, object)</span>
373
+ </div>
374
+
375
+ <div class="method-description">
376
+ <p>
377
+ Alias for <a href="Database.html#M000052">insert</a>
378
+ </p>
379
+ </div>
380
+ </div>
381
+
382
+ <div id="method-M000043" class="method-detail">
383
+ <a name="M000043"></a>
384
+
385
+ <div class="method-heading">
386
+ <a href="Database.src/M000043.html" target="Code" class="method-signature"
387
+ onclick="popupCode('Database.src/M000043.html');return false;">
388
+ <span class="method-name">abort</span><span class="method-args">()</span>
389
+ </a>
390
+ </div>
391
+
392
+ <div class="method-description">
393
+ <p>
394
+ Abort the current transaction (<a href="Database.html#M000049">browse</a>,
395
+ <a href="Database.html#M000050">edit</a>, <a
396
+ href="Database.html#M000051">replace</a>, or <a
397
+ href="Database.html#M000054">delete</a>, roll back the state of the object,
398
+ and return nil from the transaction.
399
+ </p>
400
+ <p>
401
+ In the <a href="Database.html#M000049">browse</a> case, the only effect is
402
+ to end the transaction.
403
+ </p>
404
+ <p>
405
+ Note that any exception that breaks out of the transaction will also abort
406
+ the transaction, and be re-raised.
407
+ </p>
408
+ </div>
409
+ </div>
410
+
411
+ <div id="method-M000037" class="method-detail">
412
+ <a name="M000037"></a>
413
+
414
+ <div class="method-heading">
415
+ <a href="Database.src/M000037.html" target="Code" class="method-signature"
416
+ onclick="popupCode('Database.src/M000037.html');return false;">
417
+ <span class="method-name">absolute</span><span class="method-args">(path)</span>
418
+ </a>
419
+ </div>
420
+
421
+ <div class="method-description">
422
+ <p>
423
+ Convert a relative path (relative to the db dir) to an absolute path.
424
+ </p>
425
+ </div>
426
+ </div>
427
+
428
+ <div id="method-M000038" class="method-detail">
429
+ <a name="M000038"></a>
430
+
431
+ <div class="method-heading">
432
+ <span class="method-name">absolute_path_to</span><span class="method-args">(path)</span>
433
+ </div>
434
+
435
+ <div class="method-description">
436
+ <p>
437
+ Alias for <a href="Database.html#M000037">absolute</a>
438
+ </p>
439
+ </div>
440
+ </div>
441
+
442
+ <div id="method-M000049" class="method-detail">
443
+ <a name="M000049"></a>
444
+
445
+ <div class="method-heading">
446
+ <a href="Database.src/M000049.html" target="Code" class="method-signature"
447
+ onclick="popupCode('Database.src/M000049.html');return false;">
448
+ <span class="method-name">browse</span><span class="method-args">(path = &quot;/&quot;) {|object| ...}</span>
449
+ </a>
450
+ </div>
451
+
452
+ <div class="method-description">
453
+ <p>
454
+ Browse the object. Yields the object to the caller&#8217;s block, and
455
+ returns the value of the block.
456
+ </p>
457
+ <p>
458
+ Changes to the object are not persistent, but should be avoided (they
459
+ <b>will</b> be seen by other threads, but only in the current process, and
460
+ only until the cache is cleared). If you return the object from the block,
461
+ or keep a reference to it in some other way, the object will no longer be
462
+ protected from concurrent writers.
463
+ </p>
464
+ </div>
465
+ </div>
466
+
467
+ <div id="method-M000031" class="method-detail">
468
+ <a name="M000031"></a>
469
+
470
+ <div class="method-heading">
471
+ <a href="Database.src/M000031.html" target="Code" class="method-signature"
472
+ onclick="popupCode('Database.src/M000031.html');return false;">
473
+ <span class="method-name">cache</span><span class="method-args">()</span>
474
+ </a>
475
+ </div>
476
+
477
+ <div class="method-description">
478
+ </div>
479
+ </div>
480
+
481
+ <div id="method-M000032" class="method-detail">
482
+ <a name="M000032"></a>
483
+
484
+ <div class="method-heading">
485
+ <a href="Database.src/M000032.html" target="Code" class="method-signature"
486
+ onclick="popupCode('Database.src/M000032.html');return false;">
487
+ <span class="method-name">cache_mutex</span><span class="method-args">()</span>
488
+ </a>
489
+ </div>
490
+
491
+ <div class="method-description">
492
+ </div>
493
+ </div>
494
+
495
+ <div id="method-M000042" class="method-detail">
496
+ <a name="M000042"></a>
497
+
498
+ <div class="method-heading">
499
+ <a href="Database.src/M000042.html" target="Code" class="method-signature"
500
+ onclick="popupCode('Database.src/M000042.html');return false;">
501
+ <span class="method-name">clear_cache</span><span class="method-args">()</span>
502
+ </a>
503
+ </div>
504
+
505
+ <div class="method-description">
506
+ <p>
507
+ Can be called occasionally to reduce memory footprint, esp. if cached
508
+ objects are large and infrequently used.
509
+ </p>
510
+ </div>
511
+ </div>
512
+
513
+ <div id="method-M000041" class="method-detail">
514
+ <a name="M000041"></a>
515
+
516
+ <div class="method-heading">
517
+ <a href="Database.src/M000041.html" target="Code" class="method-signature"
518
+ onclick="popupCode('Database.src/M000041.html');return false;">
519
+ <span class="method-name">clear_entry</span><span class="method-args">(file_id)</span>
520
+ </a>
521
+ </div>
522
+
523
+ <div class="method-description">
524
+ <p>
525
+ For housekeeping, so that stale entries don&#8217;t result in unused, but
526
+ uncollectable, CacheEntry objects.
527
+ </p>
528
+ </div>
529
+ </div>
530
+
531
+ <div id="method-M000045" class="method-detail">
532
+ <a name="M000045"></a>
533
+
534
+ <div class="method-heading">
535
+ <a href="Database.src/M000045.html" target="Code" class="method-signature"
536
+ onclick="popupCode('Database.src/M000045.html');return false;">
537
+ <span class="method-name">default_browse</span><span class="method-args">(path) {|x| ...}</span>
538
+ </a>
539
+ </div>
540
+
541
+ <div class="method-description">
542
+ <p>
543
+ Called when <a href="Database.html#M000049">browse</a> doesn&#8217;t find
544
+ anything at the path. The original caller&#8217;s block is available to be
545
+ yielded to.
546
+ </p>
547
+ </div>
548
+ </div>
549
+
550
+ <div id="method-M000046" class="method-detail">
551
+ <a name="M000046"></a>
552
+
553
+ <div class="method-heading">
554
+ <a href="Database.src/M000046.html" target="Code" class="method-signature"
555
+ onclick="popupCode('Database.src/M000046.html');return false;">
556
+ <span class="method-name">default_edit</span><span class="method-args">(path) {|x| ...}</span>
557
+ </a>
558
+ </div>
559
+
560
+ <div class="method-description">
561
+ <p>
562
+ Called when <a href="Database.html#M000050">edit</a> doesn&#8217;t find
563
+ anything at the path. The original caller&#8217;s block is available to be
564
+ yielded to.
565
+ </p>
566
+ </div>
567
+ </div>
568
+
569
+ <div id="method-M000048" class="method-detail">
570
+ <a name="M000048"></a>
571
+
572
+ <div class="method-heading">
573
+ <a href="Database.src/M000048.html" target="Code" class="method-signature"
574
+ onclick="popupCode('Database.src/M000048.html');return false;">
575
+ <span class="method-name">default_fetch</span><span class="method-args">(path)</span>
576
+ </a>
577
+ </div>
578
+
579
+ <div class="method-description">
580
+ <p>
581
+ Called when <a href="Database.html#M000055">fetch</a> doesn&#8217;t find
582
+ anything at the path. Default definition just returns nil.
583
+ </p>
584
+ </div>
585
+ </div>
586
+
587
+ <div id="method-M000054" class="method-detail">
588
+ <a name="M000054"></a>
589
+
590
+ <div class="method-heading">
591
+ <a href="Database.src/M000054.html" target="Code" class="method-signature"
592
+ onclick="popupCode('Database.src/M000054.html');return false;">
593
+ <span class="method-name">delete</span><span class="method-args">(path, load=true) {|object| ...}</span>
594
+ </a>
595
+ </div>
596
+
597
+ <div class="method-description">
598
+ <p>
599
+ Delete the object from the db. If a block is given, yields the object (or
600
+ nil if none) before deleting it from the db (but before releasing the lock
601
+ on the path), and returns the value of the block. Otherwise, just returns
602
+ the object (or nil, if none). Raises <a
603
+ href="Database/DirNotEmptyError.html">DirNotEmptyError</a> if path refers
604
+ to a non-empty dir. If the dir is empty, it is deleted, and the returned
605
+ value is <tt>true</tt>. The block is not yielded to. If the <em>load</em>
606
+ argument is <tt>false</tt>, delete the object from the db without loading
607
+ it or yielding, returning <tt>true</tt>.
608
+ </p>
609
+ </div>
610
+ </div>
611
+
612
+ <div id="method-M000058" class="method-detail">
613
+ <a name="M000058"></a>
614
+
615
+ <div class="method-heading">
616
+ <a href="Database.src/M000058.html" target="Code" class="method-signature"
617
+ onclick="popupCode('Database.src/M000058.html');return false;">
618
+ <span class="method-name">dump</span><span class="method-args">(object, f)</span>
619
+ </a>
620
+ </div>
621
+
622
+ <div class="method-description">
623
+ <p>
624
+ Writes object to f (must be open for writing).
625
+ </p>
626
+ </div>
627
+ </div>
628
+
629
+ <div id="method-M000050" class="method-detail">
630
+ <a name="M000050"></a>
631
+
632
+ <div class="method-heading">
633
+ <a href="Database.src/M000050.html" target="Code" class="method-signature"
634
+ onclick="popupCode('Database.src/M000050.html');return false;">
635
+ <span class="method-name">edit</span><span class="method-args">(path = &quot;/&quot;) {|object if block_given?| ...}</span>
636
+ </a>
637
+ </div>
638
+
639
+ <div class="method-description">
640
+ <p>
641
+ Edit the object in place. Changes to the yielded object made within the
642
+ caller&#8217;s block become persistent. Returns the value of the block.
643
+ Note that assigning to the block argument variable does not change the
644
+ state of the object. Use destructive methods on the object.
645
+ </p>
646
+ </div>
647
+ </div>
648
+
649
+ <div id="method-M000055" class="method-detail">
650
+ <a name="M000055"></a>
651
+
652
+ <div class="method-heading">
653
+ <a href="Database.src/M000055.html" target="Code" class="method-signature"
654
+ onclick="popupCode('Database.src/M000055.html');return false;">
655
+ <span class="method-name">fetch</span><span class="method-args">(path = &quot;/&quot;)</span>
656
+ </a>
657
+ </div>
658
+
659
+ <div class="method-description">
660
+ <p>
661
+ Fetch a <b>copy</b> of the object at the path for private use by the
662
+ current thread/process. (The copy is a <b>deep</b> copy.)
663
+ </p>
664
+ <p>
665
+ Note that this is inherently less efficient than <a
666
+ href="Database.html#M000049">browse</a>, because <a
667
+ href="Database.html#M000049">browse</a> leaves the object in the cache,
668
+ but, for safety, <a href="Database.html#M000055">fetch</a> can only return
669
+ a copy and wipe the cache, since the copy is going to be used outside of
670
+ any transaction. Subsequent transactions will have to read the object
671
+ again.
672
+ </p>
673
+ </div>
674
+ </div>
675
+
676
+ <div id="method-M000062" class="method-detail">
677
+ <a name="M000062"></a>
678
+
679
+ <div class="method-heading">
680
+ <a href="Database.src/M000062.html" target="Code" class="method-signature"
681
+ onclick="popupCode('Database.src/M000062.html');return false;">
682
+ <span class="method-name">find_format</span><span class="method-args">(path, abs_path = absolute(path))</span>
683
+ </a>
684
+ </div>
685
+
686
+ <div class="method-description">
687
+ </div>
688
+ </div>
689
+
690
+ <div id="method-M000059" class="method-detail">
691
+ <a name="M000059"></a>
692
+
693
+ <div class="method-heading">
694
+ <a href="Database.src/M000059.html" target="Code" class="method-signature"
695
+ onclick="popupCode('Database.src/M000059.html');return false;">
696
+ <span class="method-name">formats</span><span class="method-args">()</span>
697
+ </a>
698
+ </div>
699
+
700
+ <div class="method-description">
701
+ </div>
702
+ </div>
703
+
704
+ <div id="method-M000060" class="method-detail">
705
+ <a name="M000060"></a>
706
+
707
+ <div class="method-heading">
708
+ <a href="Database.src/M000060.html" target="Code" class="method-signature"
709
+ onclick="popupCode('Database.src/M000060.html');return false;">
710
+ <span class="method-name">formats=</span><span class="method-args">(fmts)</span>
711
+ </a>
712
+ </div>
713
+
714
+ <div class="method-description">
715
+ </div>
716
+ </div>
717
+
718
+ <div id="method-M000039" class="method-detail">
719
+ <a name="M000039"></a>
720
+
721
+ <div class="method-heading">
722
+ <a href="Database.src/M000039.html" target="Code" class="method-signature"
723
+ onclick="popupCode('Database.src/M000039.html');return false;">
724
+ <span class="method-name">get_file_id</span><span class="method-args">(abs_path)</span>
725
+ </a>
726
+ </div>
727
+
728
+ <div class="method-description">
729
+ <p>
730
+ Convert an absolute path to a unique key for the cache, raising <a
731
+ href="Database/MissingFileError.html">MissingFileError</a> if the file does
732
+ not exist.
733
+ </p>
734
+ </div>
735
+ </div>
736
+
737
+ <div id="method-M000061" class="method-detail">
738
+ <a name="M000061"></a>
739
+
740
+ <div class="method-heading">
741
+ <a href="Database.src/M000061.html" target="Code" class="method-signature"
742
+ onclick="popupCode('Database.src/M000061.html');return false;">
743
+ <span class="method-name">identify_file_type</span><span class="method-args">(f, path, abs_path = absolute(path))</span>
744
+ </a>
745
+ </div>
746
+
747
+ <div class="method-description">
748
+ <p>
749
+ <tt>path</tt> is relative to the database, and initial &#8217;/&#8217; is
750
+ ignored
751
+ </p>
752
+ </div>
753
+ </div>
754
+
755
+ <div id="method-M000052" class="method-detail">
756
+ <a name="M000052"></a>
757
+
758
+ <div class="method-heading">
759
+ <a href="Database.src/M000052.html" target="Code" class="method-signature"
760
+ onclick="popupCode('Database.src/M000052.html');return false;">
761
+ <span class="method-name">insert</span><span class="method-args">(path, object)</span>
762
+ </a>
763
+ </div>
764
+
765
+ <div class="method-description">
766
+ <p>
767
+ Insert the object, replacing anything at the path. Returns the object. (The
768
+ object remains a <em>local copy</em>, distinct from the one which will be
769
+ returned when accessing the path through database transactions.)
770
+ </p>
771
+ <p>
772
+ If <tt>path</tt> ends in &quot;/&quot;, then object is treated as a
773
+ collection of key-value pairs, and each value is inserted at the
774
+ corresponding key under <tt>path</tt>. (You can omit the &quot;/&quot; if
775
+ the dir already exists.)
776
+ </p>
777
+ <pre>
778
+ is this still true?
779
+ </pre>
780
+ </div>
781
+ </div>
782
+
783
+ <div id="method-M000036" class="method-detail">
784
+ <a name="M000036"></a>
785
+
786
+ <div class="method-heading">
787
+ <a href="Database.src/M000036.html" target="Code" class="method-signature"
788
+ onclick="popupCode('Database.src/M000036.html');return false;">
789
+ <span class="method-name">inspect</span><span class="method-args">()</span>
790
+ </a>
791
+ </div>
792
+
793
+ <div class="method-description">
794
+ </div>
795
+ </div>
796
+
797
+ <div id="method-M000063" class="method-detail">
798
+ <a name="M000063"></a>
799
+
800
+ <div class="method-heading">
801
+ <a href="Database.src/M000063.html" target="Code" class="method-signature"
802
+ onclick="popupCode('Database.src/M000063.html');return false;">
803
+ <span class="method-name">link</span><span class="method-args">(old_name, new_name)</span>
804
+ </a>
805
+ </div>
806
+
807
+ <div class="method-description">
808
+ <p>
809
+ Create a hard link, using File.link. The names are relative to the
810
+ database&#8217;s path.
811
+ </p>
812
+ </div>
813
+ </div>
814
+
815
+ <div id="method-M000057" class="method-detail">
816
+ <a name="M000057"></a>
817
+
818
+ <div class="method-heading">
819
+ <a href="Database.src/M000057.html" target="Code" class="method-signature"
820
+ onclick="popupCode('Database.src/M000057.html');return false;">
821
+ <span class="method-name">load</span><span class="method-args">(f)</span>
822
+ </a>
823
+ </div>
824
+
825
+ <div class="method-description">
826
+ <p>
827
+ Returns object read from f (must be open for reading).
828
+ </p>
829
+ </div>
830
+ </div>
831
+
832
+ <div id="method-M000040" class="method-detail">
833
+ <a name="M000040"></a>
834
+
835
+ <div class="method-heading">
836
+ <a href="Database.src/M000040.html" target="Code" class="method-signature"
837
+ onclick="popupCode('Database.src/M000040.html');return false;">
838
+ <span class="method-name">make_file_id</span><span class="method-args">(abs_path)</span>
839
+ </a>
840
+ </div>
841
+
842
+ <div class="method-description">
843
+ <p>
844
+ Convert an absolute path to a unique key for the cache, creating the file
845
+ if it does not exist. Raises <a
846
+ href="Database/CreateFileError.html">CreateFileError</a> if it can&#8217;t
847
+ be created.
848
+ </p>
849
+ </div>
850
+ </div>
851
+
852
+ <div id="method-M000047" class="method-detail">
853
+ <a name="M000047"></a>
854
+
855
+ <div class="method-heading">
856
+ <a href="Database.src/M000047.html" target="Code" class="method-signature"
857
+ onclick="popupCode('Database.src/M000047.html');return false;">
858
+ <span class="method-name">object_missing</span><span class="method-args">(path)</span>
859
+ </a>
860
+ </div>
861
+
862
+ <div class="method-description">
863
+ <p>
864
+ The default behavior of both <a
865
+ href="Database.html#M000046">default_edit</a> and <a
866
+ href="Database.html#M000045">default_browse</a>. Raises <a
867
+ href="Database/MissingObjectError.html">MissingObjectError</a> by default,
868
+ but it can yield to the original block.
869
+ </p>
870
+ </div>
871
+ </div>
872
+
873
+ <div id="method-M000051" class="method-detail">
874
+ <a name="M000051"></a>
875
+
876
+ <div class="method-heading">
877
+ <a href="Database.src/M000051.html" target="Code" class="method-signature"
878
+ onclick="popupCode('Database.src/M000051.html');return false;">
879
+ <span class="method-name">replace</span><span class="method-args">(path) {|old_object if block_given?| ...}</span>
880
+ </a>
881
+ </div>
882
+
883
+ <div class="method-description">
884
+ <p>
885
+ Replace the yielded object (or nil) with the return value of the block.
886
+ Returns the object that was replaced. No object need exist at
887
+ <tt>path</tt>.
888
+ </p>
889
+ <p>
890
+ Use replace instead of edit when accessing db over a drb connection. Use
891
+ replace instead of insert if the path needs to be protected while the
892
+ object is prepared for insertion.
893
+ </p>
894
+ <p>
895
+ Note that (unlike <a href="Database.html#M000050">edit</a>) destructive
896
+ methods on the object do not persistently change the state of the object,
897
+ unless the object is the return value of the block.
898
+ </p>
899
+ </div>
900
+ </div>
901
+
902
+ <div id="method-M000035" class="method-detail">
903
+ <a name="M000035"></a>
904
+
905
+ <div class="method-heading">
906
+ <a href="Database.src/M000035.html" target="Code" class="method-signature"
907
+ onclick="popupCode('Database.src/M000035.html');return false;">
908
+ <span class="method-name">subdb</span><span class="method-args">(path)</span>
909
+ </a>
910
+ </div>
911
+
912
+ <div class="method-description">
913
+ <p>
914
+ Create a new database object that accesses <tt>path</tt> relative to the
915
+ database directory. A process can have any number of dbs accessing
916
+ overlapping dirs. The cost of creating an additional db is very low; its
917
+ state is just the dir and some options. Caching is done in structures owned
918
+ by the <a href="Database.html">Database</a> class itself.
919
+ </p>
920
+ </div>
921
+ </div>
922
+
923
+ <div id="method-M000064" class="method-detail">
924
+ <a name="M000064"></a>
925
+
926
+ <div class="method-heading">
927
+ <a href="Database.src/M000064.html" target="Code" class="method-signature"
928
+ onclick="popupCode('Database.src/M000064.html');return false;">
929
+ <span class="method-name">symlink</span><span class="method-args">(old_name, new_name)</span>
930
+ </a>
931
+ </div>
932
+
933
+ <div class="method-description">
934
+ <p>
935
+ Create a symbolic link, using File.symlink. The names are relative to the
936
+ database&#8217;s path.
937
+ </p>
938
+ </div>
939
+ </div>
940
+
941
+
942
+ </div>
943
+
944
+
945
+ </div>
946
+
947
+
948
+ <div id="validator-badges">
949
+ <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
950
+ </div>
951
+
952
+ </body>
953
+ </html>