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.

Parameters:

  • db_name (String)

    name of the DB directory

  • options (Hash) (defaults to: {})

    options to customize the behavior. Currently only the following options are supported: :serializer : Can be :marshal, :json, :yaml



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.

Parameters:

  • id (Fixnum/Bignum)

    Object ID

  • repair (TrueClass/FalseClass)

    True if an repair attempt should be made.

Returns:

  • (TrueClass/FalseClass)

    True if the object is OK, otherwise false.



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.message}"
    return false
  end
end

#check_db(repair = false) ⇒ Object

Basic consistency check.

Parameters:

  • repair (TrueClass/FalseClass) (defaults to: false)

    True if found errors should be repaired.



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.



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

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 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.

Returns:

  • (Array)

    List of IDs that have been removed from the DB.



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.

Parameters:

  • name (String)

    Name of the hash.

Returns:

  • (Hash)

    A Hash that maps String objects to strings or numbers.



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.

Parameters:

  • id (Fixnum or Bignum)

    object ID

Returns:

  • (Hash)

    Object as defined by PEROBS::ObjectBase or nil if ID does not exist



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

Parameters:

  • id (Fixnum or Bignum)

Returns:

  • (Boolean)


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.

Parameters:

  • id (Fixnum or Bignum)

    ID of the object to check

  • ignore_errors (Boolean) (defaults to: false)

    If set to true no errors will be raised for non-existing objects.

Returns:

  • (Boolean)


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.

Parameters:

  • id (Fixnum or Bignum)

    ID of the object to mark



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

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 opened"
end

#put_hash(name, hash) ⇒ Object

Store a simple Hash as a JSON encoded file into the DB directory. numbers.

Parameters:

  • name (String)

    Name of the hash. Will be used as file name.

  • hash (Hash)

    A Hash that maps String objects to strings or



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.

Parameters:

  • obj (Hash)

    Object as defined by PEROBS::ObjectBase



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!

Parameters:

  • raw (String)

    Serialized Object as defined by PEROBS::ObjectBase

  • id (Fixnum or Bignum)

    Object ID



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