Class: PEROBS::FlatFileDB

Inherits:
DataBase show all
Defined in:
lib/perobs/FlatFileDB.rb

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

Class Method Summary collapse

Instance Method Summary collapse

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, options = {})
  super(options[: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_sizeObject (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
193
194
195
196
197
198
199
200
# File 'lib/perobs/FlatFileDB.rb', line 185

def check(id, repair)
  begin
    return get_object(id) != nil
  rescue PEROBS::FatalError => e
    PEROBS.log.error "Cannot read object with ID #{id}: #{e.message}"
    if repair
      begin
        PEROBS.log.error "Discarding broken object with ID #{id}"
        @flat_file.delete_obj_by_id(id)
      rescue PEROBS::FatalError
      end
    end
  end

  return false
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_marksObject

This method must be called to initiate the marking process.



146
147
148
# File 'lib/perobs/FlatFileDB.rb', line 146

def clear_marks
  @flat_file.clear_all_marks
end

#closeObject

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 '#{@db_dir}' closed"
end

#delete_databaseObject

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_objectsArray

Permanently delete all objects that have not been marked. Those are orphaned and are no longer referenced by any actively used object.



153
154
155
# File 'lib/perobs/FlatFileDB.rb', line 153

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.message}"
  end
  JSON.parse(json, :create_additions => true)
end

#get_object(id) ⇒ Hash

Load the given object from the filesystem.



137
138
139
140
141
142
143
# File 'lib/perobs/FlatFileDB.rb', line 137

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.



167
168
169
# File 'lib/perobs/FlatFileDB.rb', line 167

def is_marked?(id, ignore_errors = false)
  @flat_file.is_marked_by_id?(id)
end

#mark(id) ⇒ Object

Mark an object.



159
160
161
# File 'lib/perobs/FlatFileDB.rb', line 159

def mark(id)
  @flat_file.mark_obj_by_id(id)
end

#openObject

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 '#{@db_dir}' 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.message}"
  end
end

#put_object(obj, id) ⇒ Object

Store the given object into the cluster files.



129
130
131
# File 'lib/perobs/FlatFileDB.rb', line 129

def put_object(obj, 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!



206
207
208
# File 'lib/perobs/FlatFileDB.rb', line 206

def put_raw_object(raw, id)
  @flat_file.write_obj_by_id(id, raw)
end