Class: PEROBS::FlatFileDB
Overview
The FlatFileDB is a storage backend that uses a single flat file to store the value blobs.
Constant Summary collapse
- VERSION =
This version number increases whenever the on-disk format changes in a way that requires conversion actions after an update.
2
Instance Attribute Summary collapse
-
#max_blob_size ⇒ Object
readonly
Returns the value of attribute max_blob_size.
Class Method Summary collapse
Instance Method Summary collapse
-
#check(id, repair) ⇒ TrueClass/FalseClass
Check if the stored object is syntactically correct.
-
#check_db(repair = false) ⇒ Object
Basic consistency check.
-
#clear_marks ⇒ Object
This method must be called to initiate the marking process.
-
#close ⇒ Object
Close the FlatFileDB.
-
#delete_database ⇒ Object
Delete the entire database.
-
#delete_unmarked_objects ⇒ Array
Permanently delete all objects that have not been marked.
-
#get_hash(name) ⇒ Hash
Load the Hash with the given name.
-
#get_object(id) ⇒ Hash
Load the given object from the filesystem.
-
#include?(id) ⇒ Boolean
Return true if the object with given ID exists.
-
#initialize(db_name, options = {}) ⇒ FlatFileDB
constructor
Create a new FlatFileDB object.
-
#is_marked?(id, ignore_errors = false) ⇒ Boolean
Check if the object is marked.
-
#mark(id) ⇒ Object
Mark an object.
-
#open ⇒ Object
Open the FlatFileDB for transactions.
-
#put_hash(name, hash) ⇒ Object
Store a simple Hash as a JSON encoded file into the DB directory.
-
#put_object(obj, id) ⇒ Object
Store the given object into the cluster files.
-
#put_raw_object(raw, id) ⇒ Object
Store the given serialized object into the cluster files.
Methods inherited from DataBase
#check_option, #deserialize, #serialize
Constructor Details
#initialize(db_name, options = {}) ⇒ FlatFileDB
Create a new FlatFileDB object.
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
# File 'lib/perobs/FlatFileDB.rb', line 53 def initialize(db_name, = {}) super([:serializer] || :json) @db_dir = db_name # Create the database directory if it doesn't exist yet. ensure_dir_exists(@db_dir) PEROBS.log.open(File.join(@db_dir, 'log')) check_version_and_upgrade # Read the existing DB config. @config = get_hash('config') check_option('serializer') put_hash('config', @config) end |
Instance Attribute Details
#max_blob_size ⇒ Object (readonly)
Returns the value of attribute max_blob_size.
46 47 48 |
# File 'lib/perobs/FlatFileDB.rb', line 46 def max_blob_size @max_blob_size end |
Class Method Details
.delete_db(db_name) ⇒ Object
89 90 91 |
# File 'lib/perobs/FlatFileDB.rb', line 89 def FlatFileDB::delete_db(db_name) FileUtils.rm_rf(db_name) end |
Instance Method Details
#check(id, repair) ⇒ TrueClass/FalseClass
Check if the stored object is syntactically correct.
185 186 187 188 189 190 191 192 |
# File 'lib/perobs/FlatFileDB.rb', line 185 def check(id, repair) begin return get_object(id) != nil rescue => e PEROBS.log.warn "Cannot read object with ID #{id}: #{e.}" return false end end |
#check_db(repair = false) ⇒ Object
Basic consistency check.
175 176 177 |
# File 'lib/perobs/FlatFileDB.rb', line 175 def check_db(repair = false) @flat_file.check(repair) end |
#clear_marks ⇒ Object
This method must be called to initiate the marking process.
147 148 149 |
# File 'lib/perobs/FlatFileDB.rb', line 147 def clear_marks @flat_file.clear_all_marks end |
#close ⇒ Object
Close the FlatFileDB.
77 78 79 80 81 |
# File 'lib/perobs/FlatFileDB.rb', line 77 def close @flat_file.close @flat_file = nil PEROBS.log.info "FlatFile closed" end |
#delete_database ⇒ Object
Delete the entire database. The database is no longer usable after this method was called.
85 86 87 |
# File 'lib/perobs/FlatFileDB.rb', line 85 def delete_database FileUtils.rm_rf(@db_dir) end |
#delete_unmarked_objects ⇒ Array
Permanently delete all objects that have not been marked. Those are orphaned and are no longer referenced by any actively used object.
154 155 156 |
# File 'lib/perobs/FlatFileDB.rb', line 154 def delete_unmarked_objects @flat_file.delete_unmarked_objects end |
#get_hash(name) ⇒ Hash
Load the Hash with the given name.
115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/perobs/FlatFileDB.rb', line 115 def get_hash(name) file_name = File.join(@db_dir, name + '.json') return ::Hash.new unless File.exist?(file_name) begin json = File.read(file_name) rescue => e PEROBS.log.fatal "Cannot read hash file '#{file_name}': #{e.}" end JSON.parse(json, :create_additions => true) end |
#get_object(id) ⇒ Hash
Load the given object from the filesystem.
138 139 140 141 142 143 144 |
# File 'lib/perobs/FlatFileDB.rb', line 138 def get_object(id) if (raw_obj = @flat_file.read_obj_by_id(id)) return deserialize(raw_obj) else nil end end |
#include?(id) ⇒ Boolean
Return true if the object with given ID exists
95 96 97 |
# File 'lib/perobs/FlatFileDB.rb', line 95 def include?(id) !@flat_file.find_obj_addr_by_id(id).nil? end |
#is_marked?(id, ignore_errors = false) ⇒ Boolean
Check if the object is marked.
168 169 170 |
# File 'lib/perobs/FlatFileDB.rb', line 168 def is_marked?(id, ignore_errors = false) @flat_file.is_marked_by_id?(id) end |
#mark(id) ⇒ Object
Mark an object.
160 161 162 |
# File 'lib/perobs/FlatFileDB.rb', line 160 def mark(id) @flat_file.mark_obj_by_id(id) end |
#open ⇒ Object
Open the FlatFileDB for transactions.
70 71 72 73 74 |
# File 'lib/perobs/FlatFileDB.rb', line 70 def open @flat_file = FlatFile.new(@db_dir) @flat_file.open PEROBS.log.info "FlatFile opened" end |
#put_hash(name, hash) ⇒ Object
Store a simple Hash as a JSON encoded file into the DB directory. numbers.
103 104 105 106 107 108 109 110 |
# File 'lib/perobs/FlatFileDB.rb', line 103 def put_hash(name, hash) file_name = File.join(@db_dir, name + '.json') begin RobustFile.write(file_name, hash.to_json) rescue IOError => e PEROBS.log.fatal "Cannot write hash file '#{file_name}': #{e.}" end end |
#put_object(obj, id) ⇒ Object
Store the given object into the cluster files.
129 130 131 132 |
# File 'lib/perobs/FlatFileDB.rb', line 129 def put_object(obj, id) @flat_file.delete_obj_by_id(id) @flat_file.write_obj_by_id(id, serialize(obj)) end |
#put_raw_object(raw, id) ⇒ Object
Store the given serialized object into the cluster files. This method is for internal use only!
198 199 200 201 |
# File 'lib/perobs/FlatFileDB.rb', line 198 def put_raw_object(raw, id) @flat_file.delete_obj_(id) @flat_file.write_obj_by_id(id, raw) end |