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.
- data/{RELEASE-NOTES → History.txt} +6 -0
- data/{README → README.txt} +26 -17
- data/examples/flat.rb +146 -0
- data/examples/fsdb-example.rb +28 -0
- data/examples/rbformat.rb +17 -0
- data/examples/yaml2.rb +29 -0
- data/junk/OLDRakefile +98 -0
- data/junk/OLDRakefile2 +55 -0
- data/junk/check-cache.rb +18 -0
- data/junk/create-lock.rb +25 -0
- data/junk/doc/old-api/classes/FSDB.html +139 -0
- data/junk/doc/old-api/classes/FSDB/Database.html +953 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000029.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000030.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000031.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000032.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000033.html +33 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000034.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000035.html +22 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000036.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000037.html +22 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000038.html +43 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000039.html +25 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000040.html +43 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000041.html +23 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000042.html +22 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000043.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000044.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000045.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000046.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000047.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000048.html +16 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000049.html +71 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000050.html +43 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000051.html +53 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000052.html +44 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000053.html +39 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000054.html +72 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000055.html +39 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000056.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000057.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000058.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000059.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000060.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000061.html +23 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000062.html +23 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000063.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database.src/M000064.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Database/AbortedTransaction.html +118 -0
- data/junk/doc/old-api/classes/FSDB/Database/CreateFileError.html +120 -0
- data/junk/doc/old-api/classes/FSDB/Database/DirIsImmutableError.html +117 -0
- data/junk/doc/old-api/classes/FSDB/Database/DirNotEmptyError.html +117 -0
- data/junk/doc/old-api/classes/FSDB/Database/FormatError.html +117 -0
- data/junk/doc/old-api/classes/FSDB/Database/MissingFileError.html +117 -0
- data/junk/doc/old-api/classes/FSDB/Database/MissingObjectError.html +117 -0
- data/junk/doc/old-api/classes/FSDB/Database/NotDirError.html +118 -0
- data/junk/doc/old-api/classes/FSDB/Database/PathComponentError.html +120 -0
- data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.html +148 -0
- data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.src/M000005.html +21 -0
- data/junk/doc/old-api/classes/FSDB/DatabaseDebuggable.src/M000007.html +21 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.html +210 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000006.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000007.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000008.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000009.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000010.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000011.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000012.html +22 -0
- data/junk/doc/old-api/classes/FSDB/DirectoryIterators.src/M000013.html +22 -0
- data/junk/doc/old-api/classes/FSDB/ForkSafely.html +126 -0
- data/junk/doc/old-api/classes/FSDB/Modex.html +237 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000024.html +21 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000025.html +30 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000026.html +21 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000027.html +30 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000028.html +44 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000029.html +26 -0
- data/junk/doc/old-api/classes/FSDB/Modex.src/M000030.html +48 -0
- data/junk/doc/old-api/classes/FSDB/Modex/ForkSafely.html +105 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.html +244 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000018.html +19 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000019.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000020.html +19 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000021.html +18 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000022.html +23 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000023.html +30 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000024.html +26 -0
- data/junk/doc/old-api/classes/FSDB/Mutex.src/M000025.html +21 -0
- data/junk/doc/old-api/classes/FSDB/Mutex/ForkSafely.html +105 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.html +257 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000012.html +23 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000013.html +18 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000014.html +23 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000015.html +18 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000016.html +18 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000017.html +22 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000018.html +23 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities.src/M000019.html +18 -0
- data/junk/doc/old-api/classes/FSDB/PathUtilities/InvalidPathError.html +111 -0
- data/junk/doc/old-api/classes/File.html +272 -0
- data/junk/doc/old-api/classes/File.src/M000001.html +17 -0
- data/junk/doc/old-api/classes/File.src/M000002.html +17 -0
- data/junk/doc/old-api/classes/File.src/M000003.html +20 -0
- data/junk/doc/old-api/classes/File.src/M000004.html +20 -0
- data/junk/doc/old-api/classes/File.src/M000005.html +32 -0
- data/junk/doc/old-api/classes/File.src/M000006.html +32 -0
- data/junk/doc/old-api/created.rid +1 -0
- data/junk/doc/old-api/files/README.html +112 -0
- data/junk/doc/old-api/files/RELEASE-NOTES.html +233 -0
- data/junk/doc/old-api/files/fsdb_txt.html +888 -0
- data/junk/doc/old-api/files/lib/fsdb/database_rb.html +115 -0
- data/junk/doc/old-api/files/lib/fsdb/file-lock_rb.html +109 -0
- data/junk/doc/old-api/files/lib/fsdb/modex_rb.html +121 -0
- data/junk/doc/old-api/files/lib/fsdb/mutex_rb.html +108 -0
- data/junk/doc/old-api/files/lib/fsdb/util_rb.html +108 -0
- data/junk/doc/old-api/fr_class_index.html +47 -0
- data/junk/doc/old-api/fr_file_index.html +34 -0
- data/junk/doc/old-api/fr_method_index.html +90 -0
- data/junk/doc/old-api/index.html +24 -0
- data/junk/doc/old-api/rdoc-style.css +208 -0
- data/junk/file-lock-nb.rb +15 -0
- data/junk/fl.rb +144 -0
- data/junk/flock-test.rb +39 -0
- data/junk/fsdb.kateproject +47 -0
- data/junk/fsdb.prj +196 -0
- data/junk/fsdb.sf +46 -0
- data/junk/insert-dir.rb +48 -0
- data/junk/lock-test-bug.rb +150 -0
- data/junk/lock-test-too-simple.rb +136 -0
- data/junk/lock-test.rb +151 -0
- data/{script → junk}/mkrdoc +0 -0
- data/junk/restore-fsdb.rb +37 -0
- data/junk/rf.txt +5 -0
- data/junk/solaris-bug-fixed.rb +184 -0
- data/junk/solaris-bug.rb +182 -0
- data/junk/solaris-bug.txt +43 -0
- data/junk/sync.rb +327 -0
- data/junk/test-file-lock.html +86 -0
- data/junk/test-file-lock.rb +84 -0
- data/junk/test-processes.rb +131 -0
- data/junk/test-threads.rb +113 -0
- data/junk/wiki-mutex.rb +108 -0
- data/lib/fsdb/database.rb +5 -3
- data/lib/fsdb/delegatable.rb +21 -0
- data/lib/fsdb/faster-modex.rb +223 -0
- data/lib/fsdb/faster-mutex.rb +138 -0
- data/lib/fsdb/mutex.rb +4 -1
- data/lib/fsdb/persistent.rb +91 -0
- data/lib/fsdb/read-write-object.rb +36 -0
- data/lib/fsdb/server.rb +44 -0
- data/misc/fsdb-blorubu.txt +47 -0
- data/misc/mtime-and-file-id.txt +23 -0
- data/misc/posixlock.txt +148 -0
- data/rakefile +39 -0
- data/tasks/ann.rake +80 -0
- data/tasks/bones.rake +20 -0
- data/tasks/gem.rake +201 -0
- data/tasks/git.rake +40 -0
- data/tasks/notes.rake +27 -0
- data/tasks/post_load.rake +34 -0
- data/tasks/rdoc.rake +51 -0
- data/tasks/rubyforge.rake +55 -0
- data/tasks/setup.rb +292 -0
- data/tasks/spec.rake +54 -0
- data/tasks/svn.rake +47 -0
- data/tasks/test.rake +40 -0
- data/tasks/zentest.rake +36 -0
- data/test/err.txt +31 -0
- data/test/runs.rb +8 -0
- data/test/test-file-lock.rb +78 -0
- data/test/test-util.rb +1 -0
- data/test/trap.rb +31 -0
- metadata +198 -35
- data/Manifest +0 -36
- data/Rakefile +0 -10
- data/fsdb.gemspec +0 -113
data/{README → README.txt}
RENAMED
|
@@ -12,8 +12,16 @@ FSDB does not yet have any indexing or querying mechanisms, and is probably miss
|
|
|
12
12
|
|
|
13
13
|
== Installation
|
|
14
14
|
|
|
15
|
+
For .gem:
|
|
16
|
+
|
|
15
17
|
gem install fsdb
|
|
16
18
|
|
|
19
|
+
For .tgz, unpack and then:
|
|
20
|
+
|
|
21
|
+
ruby install.rb config
|
|
22
|
+
ruby install.rb setup
|
|
23
|
+
ruby install.rb install
|
|
24
|
+
|
|
17
25
|
== Synopsis
|
|
18
26
|
|
|
19
27
|
require 'fsdb'
|
|
@@ -71,8 +79,8 @@ Keys in the database are path strings, which are simply strings in the usual for
|
|
|
71
79
|
foo//bar
|
|
72
80
|
foo/../foo/bar
|
|
73
81
|
|
|
74
|
-
work correctly, as do paths that denote hard
|
|
75
|
-
the platform.
|
|
82
|
+
work correctly (they access the same objects), as do paths that denote hard
|
|
83
|
+
or soft links, if supported on the platform.
|
|
76
84
|
|
|
77
85
|
Links are subject to the same naming convention as normal files with regard
|
|
78
86
|
to format identification: format is determined by the path within the
|
|
@@ -136,12 +144,11 @@ There are two kinds of transactions:
|
|
|
136
144
|
with one that does not have the <tt>+</tt> method or the <tt>[ ]</tt> method.
|
|
137
145
|
The four operations are atomic by themselves, but the sequence is not.
|
|
138
146
|
|
|
139
|
-
Note that changes to a database object using this kind of transaction
|
|
140
|
-
|
|
141
|
-
assignments of the form <tt>db[<path>] = <data></tt>. Note that
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
147
|
+
Note that changes to a database object using this kind of transaction cannot
|
|
148
|
+
be made using destructive methods (such as <tt><<</tt>) but only by
|
|
149
|
+
assignments of the form <tt>db[<path>] = <data></tt>. Note that <tt>+=</tt>
|
|
150
|
+
and similar "assignment operators" can be used but are not atomic, because
|
|
151
|
+
|
|
145
152
|
db[<path>] += 1
|
|
146
153
|
|
|
147
154
|
is really
|
|
@@ -163,7 +170,7 @@ There are two kinds of transactions:
|
|
|
163
170
|
|
|
164
171
|
This guarantees that, if the object at the path is still <tt>[1, 2, 3]</tt>
|
|
165
172
|
at the time of the #edit call, the value returned by the transaction will be
|
|
166
|
-
|
|
173
|
+
4.
|
|
167
174
|
|
|
168
175
|
Simply put, #edit allows exclusive write access to the object at the path for
|
|
169
176
|
the duration of the block. Other threads or processes that use FSDB methods
|
|
@@ -263,7 +270,7 @@ FSDB has been tested on the following platforms and file systems:
|
|
|
263
270
|
|
|
264
271
|
- Windows ME (single cpu, FAT32)
|
|
265
272
|
|
|
266
|
-
FSDB is currently tested with ruby-1.9.
|
|
273
|
+
FSDB is currently tested with ruby-1.9.1 and ruby-1.8.6.
|
|
267
274
|
|
|
268
275
|
On windows, both the mswin32 and mingw32 builds of ruby have been used with FSDB. It has never been tested with cygwin or bccwin.
|
|
269
276
|
|
|
@@ -304,12 +311,12 @@ FSDB is not very fast. It's useful more for its safety, flexibility, and ease of
|
|
|
304
311
|
|
|
305
312
|
- For speed, avoid using #fetch and its alias #[]. As noted in the API docs,
|
|
306
313
|
these methods cannot safely return the same object that is cached, so must
|
|
307
|
-
clear out the cache's reference to the object so that
|
|
314
|
+
clear out the cache's reference to the object so that it will be loaded
|
|
308
315
|
freshly the next time #fetch is called on the path.
|
|
309
316
|
|
|
310
317
|
The performance hit of #fetch is of course greater with larger objects,
|
|
311
318
|
and with objects that are loaded by a more complex procedure, such as
|
|
312
|
-
|
|
319
|
+
Marshal.load.
|
|
313
320
|
|
|
314
321
|
You can think of #fetch as a "deep copy" of the object. If you call it twice,
|
|
315
322
|
you get different copies that do not share any parts. Or you can think of it
|
|
@@ -372,7 +379,7 @@ FSDB is not very fast. It's useful more for its safety, flexibility, and ease of
|
|
|
372
379
|
- It may be fast enough for many purposes, especially using multiple processes
|
|
373
380
|
rather than multiple threads.
|
|
374
381
|
|
|
375
|
-
- Pure ruby. Ruby license. Free
|
|
382
|
+
- Pure ruby. Ruby license. Free software.
|
|
376
383
|
|
|
377
384
|
|
|
378
385
|
== Applications
|
|
@@ -396,6 +403,8 @@ is:
|
|
|
396
403
|
|
|
397
404
|
=== Features
|
|
398
405
|
|
|
406
|
+
- Should the Format objects be classes instead of just instances of Format?
|
|
407
|
+
|
|
399
408
|
- Default value and proc for Database, like Hash.
|
|
400
409
|
|
|
401
410
|
- FSDB::Reference class:
|
|
@@ -460,6 +469,8 @@ is:
|
|
|
460
469
|
|
|
461
470
|
- more formats
|
|
462
471
|
|
|
472
|
+
- json
|
|
473
|
+
|
|
463
474
|
- tabular data, excel, xml, ascii db, csv
|
|
464
475
|
|
|
465
476
|
- SOAP marshal, XML marshal
|
|
@@ -520,9 +531,7 @@ is:
|
|
|
520
531
|
wipe the reference to the object, and could leave the contents string. But
|
|
521
532
|
this would increase file size and duplicate the file system's own cache.
|
|
522
533
|
|
|
523
|
-
==
|
|
524
|
-
|
|
525
|
-
fsdb 0.5
|
|
534
|
+
== Web site
|
|
526
535
|
|
|
527
536
|
The current version of this software can be found at http://redshift.sourceforge.net/fsdb.
|
|
528
537
|
|
|
@@ -533,4 +542,4 @@ This software is distributed under the Ruby license. See http://www.ruby-lang.or
|
|
|
533
542
|
== Author
|
|
534
543
|
|
|
535
544
|
Joel VanderWerf, mailto:vjoel@users.sourceforge.net
|
|
536
|
-
Copyright (c)
|
|
545
|
+
Copyright (c) 2003-2009, Joel VanderWerf.
|
data/examples/flat.rb
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Fast, flat storage based on Kirk Haines' technique.
|
|
2
|
+
|
|
3
|
+
require 'fsdb'
|
|
4
|
+
require 'digest/md5'
|
|
5
|
+
|
|
6
|
+
class FlatDB < FSDB::Database
|
|
7
|
+
|
|
8
|
+
def initialize(path, depth = 2)
|
|
9
|
+
raise ArgumentError, "Invalid depth #{depth} > 32" if depth > 32
|
|
10
|
+
|
|
11
|
+
@path_from_key = {}
|
|
12
|
+
@path_pat = Regexp.new("^" + "(..)"*depth)
|
|
13
|
+
@depth = depth
|
|
14
|
+
|
|
15
|
+
super(path)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def path_from_key(key)
|
|
19
|
+
path = @path_from_key[key]
|
|
20
|
+
unless path
|
|
21
|
+
if @depth > 0
|
|
22
|
+
path_components = Digest::MD5.hexdigest(key).scan(@path_pat).first
|
|
23
|
+
path_components << key
|
|
24
|
+
path = path_components.join("/")
|
|
25
|
+
else
|
|
26
|
+
path = key
|
|
27
|
+
end
|
|
28
|
+
@path_from_key[key] = path
|
|
29
|
+
end
|
|
30
|
+
path
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def browse(key)
|
|
34
|
+
super path_from_key(key)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def edit(key)
|
|
38
|
+
super path_from_key(key)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def replace(key)
|
|
42
|
+
super path_from_key(key)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def delete(key, load=true)
|
|
46
|
+
@path_from_key.delete key ## should probably purge this hash periodically
|
|
47
|
+
super path_from_key(key), load
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# don't bother with #insert, #fetch, #[], #[]= since they are
|
|
51
|
+
# inherently less efficient
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
db = FlatDB.new('/tmp/fsdb/flat', 2)
|
|
55
|
+
|
|
56
|
+
db.replace 'foo.txt' do
|
|
57
|
+
"this is the foo text"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
db.browse 'foo.txt' do |x|
|
|
61
|
+
p x
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# key names can have '/' in them, in which case they reference deeper subdirs
|
|
65
|
+
db.replace 'sub/foo.txt' do
|
|
66
|
+
"this is the subdir's foo text"
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
db.browse 'sub/foo.txt' do |x|
|
|
70
|
+
p x
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
require 'benchmark'
|
|
74
|
+
|
|
75
|
+
Benchmark.bm(10) do |bm|
|
|
76
|
+
nfiles = 100
|
|
77
|
+
|
|
78
|
+
[0,1,2].each do |depth|
|
|
79
|
+
db = FlatDB.new("/tmp/fsdb/depth_#{depth}", depth)
|
|
80
|
+
|
|
81
|
+
puts "\ndepth=#{depth}"
|
|
82
|
+
|
|
83
|
+
bm.report "create" do
|
|
84
|
+
nfiles.times do |i|
|
|
85
|
+
db.replace i.to_s do # with a filename like that, will use marshal
|
|
86
|
+
i
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
bm.report "access" do
|
|
92
|
+
nfiles.times do |i|
|
|
93
|
+
db.browse i.to_s do |j|
|
|
94
|
+
raise unless i == j
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
__END__
|
|
102
|
+
|
|
103
|
+
N=100_000
|
|
104
|
+
user system total real
|
|
105
|
+
|
|
106
|
+
depth=0
|
|
107
|
+
create 72.680000 1772.030000 1844.710000 (1853.686824)
|
|
108
|
+
access 55.780000 13.090000 68.870000 ( 97.170382)
|
|
109
|
+
|
|
110
|
+
depth=1
|
|
111
|
+
create 125.170000 24.250000 149.420000 (329.576419)
|
|
112
|
+
access 143.210000 12.040000 155.250000 (759.768371)
|
|
113
|
+
|
|
114
|
+
depth=2
|
|
115
|
+
create 263.900000 32.570000 296.470000 (1950.482468)
|
|
116
|
+
access 195.200000 17.250000 212.450000 (1562.214063)
|
|
117
|
+
|
|
118
|
+
# du -sk depth_0
|
|
119
|
+
804236 depth_0
|
|
120
|
+
# du -sk depth_1
|
|
121
|
+
804832 depth_1
|
|
122
|
+
# du -sk depth_2
|
|
123
|
+
1006408 depth_2
|
|
124
|
+
|
|
125
|
+
Output of two successive runs, first without the db files already existing (N=10000, depth=2):
|
|
126
|
+
|
|
127
|
+
$ ruby flat.rb
|
|
128
|
+
user system total real
|
|
129
|
+
create 5.270000 2.520000 7.790000 ( 41.684685)
|
|
130
|
+
access 2.210000 0.380000 2.590000 ( 2.626480)
|
|
131
|
+
$ ruby flat.rb
|
|
132
|
+
user system total real
|
|
133
|
+
create 3.020000 1.930000 4.950000 ( 5.954889)
|
|
134
|
+
access 1.830000 0.280000 2.110000 ( 2.157327)
|
|
135
|
+
|
|
136
|
+
Output of two successive runs, first without the db files already existing (N=10000, depth=0):
|
|
137
|
+
|
|
138
|
+
$ ruby flat.rb
|
|
139
|
+
user system total real
|
|
140
|
+
create 2.780000 18.710000 21.490000 ( 22.292284)
|
|
141
|
+
access 1.800000 0.230000 2.030000 ( 2.044320)
|
|
142
|
+
$ ruby flat.rb
|
|
143
|
+
user system total real
|
|
144
|
+
create 3.280000 2.550000 5.830000 ( 6.105209)
|
|
145
|
+
access 1.790000 0.300000 2.090000 ( 2.200052)
|
|
146
|
+
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'fsdb' # http://redshift.sourceforge.net/fsdb
|
|
2
|
+
|
|
3
|
+
db = FSDB::Database.new("~/tmp")
|
|
4
|
+
|
|
5
|
+
# Tell FSDB to use YAML format when it sees ".yml" and ".yaml" suffixes.
|
|
6
|
+
# It is easy to extend the recognition rules to handle other formats.
|
|
7
|
+
db.formats = [FSDB::YAML_FORMAT] + db.formats
|
|
8
|
+
|
|
9
|
+
# Write (atomically) the initial data to the file.
|
|
10
|
+
db["config.yml"] = { "key1" => 111, "key2" => 222 }
|
|
11
|
+
|
|
12
|
+
# Enter a thread-safe and process-safe transaction to
|
|
13
|
+
# change the state of the file.
|
|
14
|
+
db.edit("config.yml") do |cfg|
|
|
15
|
+
cfg['key1'] = 'aaa'
|
|
16
|
+
cfg['key2'] = 'bbb'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Check that it works.
|
|
20
|
+
puts File.read(File.expand_path("~/tmp/config.yml"))
|
|
21
|
+
|
|
22
|
+
__END__
|
|
23
|
+
|
|
24
|
+
Output:
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
key1: aaa
|
|
28
|
+
key2: bbb
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'fsdb'
|
|
2
|
+
|
|
3
|
+
dir ='~/tmp/fsdb/rb-format'
|
|
4
|
+
db = FSDB::Database.new(dir)
|
|
5
|
+
|
|
6
|
+
RUBY_FORMAT =
|
|
7
|
+
FSDB::Format.new(
|
|
8
|
+
/\.rb$/i,
|
|
9
|
+
:name => "RUBY_FORMAT",
|
|
10
|
+
:load => proc {|f| eval "proc {#{f.read}}"},
|
|
11
|
+
:dump => proc {|string, f| f.syswrite(string)}
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
db.formats = [ RUBY_FORMAT ]
|
|
15
|
+
|
|
16
|
+
db['some-script.rb'] = "|x| 1+2+x"
|
|
17
|
+
p db['some-script.rb'][3]
|
data/examples/yaml2.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'fsdb'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
dir = File.join(ENV['TMPDIR'] || ENV['TMP'] || 'tmp', "my_data")
|
|
5
|
+
|
|
6
|
+
db = FSDB::Database.new dir
|
|
7
|
+
db.formats = [FSDB::YAML_FORMAT] + db.formats
|
|
8
|
+
|
|
9
|
+
3.times do |i|
|
|
10
|
+
db["Cat#{i}.yml"] = %w{
|
|
11
|
+
name1
|
|
12
|
+
name2
|
|
13
|
+
name3
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
path = "Cat1.yml"
|
|
18
|
+
|
|
19
|
+
puts "Here's the object:"
|
|
20
|
+
puts "=================="
|
|
21
|
+
p db[path]
|
|
22
|
+
puts "=================="
|
|
23
|
+
puts
|
|
24
|
+
|
|
25
|
+
puts "Here's the file:"
|
|
26
|
+
puts "=================="
|
|
27
|
+
puts File.read(File.join(db.dir, path))
|
|
28
|
+
puts "=================="
|
|
29
|
+
puts
|
data/junk/OLDRakefile
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
|
|
2
|
+
require 'rake'
|
|
3
|
+
require 'rake/clean'
|
|
4
|
+
require 'rake/contrib/sshpublisher'
|
|
5
|
+
require 'rake/gempackagetask'
|
|
6
|
+
|
|
7
|
+
PKG_VERSION = IO::read 'VERSION'
|
|
8
|
+
PKG_VERSION.strip!
|
|
9
|
+
PKG_NAME = "fsdb"
|
|
10
|
+
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
|
11
|
+
|
|
12
|
+
#-----------------------------------------------------------------------
|
|
13
|
+
desc "Default Task"
|
|
14
|
+
task :default => :package
|
|
15
|
+
|
|
16
|
+
#-----------------------------------------------------------------------
|
|
17
|
+
# cleanup
|
|
18
|
+
#-----------------------------------------------------------------------
|
|
19
|
+
CLOBBER.include(
|
|
20
|
+
"pkg/**",
|
|
21
|
+
"README"
|
|
22
|
+
)
|
|
23
|
+
#-----------------------------------------------------------------------
|
|
24
|
+
# generate README
|
|
25
|
+
#
|
|
26
|
+
# - maybe make a task lib out of the gen_readme.rb code ?
|
|
27
|
+
#
|
|
28
|
+
#-----------------------------------------------------------------------
|
|
29
|
+
desc "Generate README"
|
|
30
|
+
task :readme => [:clobber] do
|
|
31
|
+
File.open('README','w') do |f|
|
|
32
|
+
$stdout = f
|
|
33
|
+
tmpl = IO::read 'gen_readme.rb'
|
|
34
|
+
eval tmpl
|
|
35
|
+
$stdout = STDOUT
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
#-----------------------------------------------------------------------
|
|
41
|
+
# Publish to website
|
|
42
|
+
#-----------------------------------------------------------------------
|
|
43
|
+
desc "Publish the gem on codeforpeople.com"
|
|
44
|
+
|
|
45
|
+
PUBLISH_HOST = "codeforpeople.com"
|
|
46
|
+
PUBLISH_ROOT = "/lib/ruby"
|
|
47
|
+
task :publish => [:package] do
|
|
48
|
+
`ssh #{PUBLISH_HOST} 'mkdir -p #{PUBLISH_ROOT}/#{PKG_NAME}/#{PKG_FILE_NAME}'`
|
|
49
|
+
`scp -rq ./ #{PUBLISH_HOST}:#{PUBLISH_ROOT}/#{PKG_NAME}/#{PKG_FILE_NAME}`
|
|
50
|
+
|
|
51
|
+
# if packages should go somewhere else
|
|
52
|
+
Rake::SshFilePublisher.new(PUBLISH_HOST, "#{PUBLISH_ROOT}/pkg", "pkg", "#{PKG_FILE_NAME}.zip").upload
|
|
53
|
+
Rake::SshFilePublisher.new(PUBLISH_HOST, "#{PUBLISH_ROOT}/pkg", "pkg", "#{PKG_FILE_NAME}.tgz").upload
|
|
54
|
+
Rake::SshFilePublisher.new(PUBLISH_HOST, "#{PUBLISH_ROOT}/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
#-----------------------------------------------------------------------
|
|
59
|
+
# install
|
|
60
|
+
#-----------------------------------------------------------------------
|
|
61
|
+
task :install => [:package] do
|
|
62
|
+
`gem install pkg/#{PKG_FILE_NAME}.gem`
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
#-----------------------------------------------------------------------
|
|
66
|
+
# gem specification for :package
|
|
67
|
+
#-----------------------------------------------------------------------
|
|
68
|
+
task :package => [:clobber, :readme]
|
|
69
|
+
|
|
70
|
+
spec = Gem::Specification.new do |s|
|
|
71
|
+
s.name = PKG_NAME
|
|
72
|
+
s.version = PKG_VERSION
|
|
73
|
+
s.platform = Gem::Platform::RUBY
|
|
74
|
+
s.summary = "better living through metaprogramming:"
|
|
75
|
+
s.description = <<DESC
|
|
76
|
+
traits.rb aims to be a better set of attr_* methods and encourages
|
|
77
|
+
better living through meta-programming and uniform access priciples.
|
|
78
|
+
traits.rb supercedes attributes.rb. why? the name is shorter ;-)
|
|
79
|
+
DESC
|
|
80
|
+
|
|
81
|
+
s.has_rdoc = false
|
|
82
|
+
|
|
83
|
+
# no dependencies
|
|
84
|
+
# s.add_dependency('gem', '>= version')
|
|
85
|
+
|
|
86
|
+
s.files = %w(README VERSION) + Dir['lib/**/*'] + Dir['sample/**/*']
|
|
87
|
+
s.require_path = '.'
|
|
88
|
+
|
|
89
|
+
s.author = "Ara T. Howard"
|
|
90
|
+
s.email = "ara [dot] t [dot] howard [at] noaa [dot] gov"
|
|
91
|
+
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
Rake::GemPackageTask.new(spec) do |p|
|
|
95
|
+
p.gem_spec = spec
|
|
96
|
+
p.need_tar = true
|
|
97
|
+
p.need_zip = true
|
|
98
|
+
end
|