Class: Heliodor::DB

Inherits:
Object
  • Object
show all
Defined in:
lib/heliodor/db.rb

Overview

Base class for accessing DBs and building queries

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file, tsafe = false) ⇒ DB

Returns a new instance of DB.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/heliodor/db.rb', line 7

def initialize(file, tsafe = false)
  @tsafe = tsafe
  @mutex = Mutex.new
  @dtable = { 'heliodor_data' => {
    'name'            => 'Heliodor',
    'version'         => Heliodor::VERSION,
    'bson_version'    => Gem.loaded_specs['bson'].version.version,
    'last_write'      => DateTime.now.strftime,
    'ruby_version'    => RUBY_VERSION,
    'ruby_patchlevel' => RUBY_PATCHLEVEL.to_s,
    'ruby_platform'   => RUBY_PLATFORM
  } }
  @file = File.expand_path(file.to_s)

  if File.exist?(@file)
    f = Zlib::GzipReader.open(File.expand_path(@file))
    bb = BSON::ByteBuffer.new(f.read)
    @dat = Hash.from_bson(bb)
    f.close
  else
    f = Zlib::GzipWriter.open(File.expand_path(@file))
    f.write(@dtable.to_bson.to_s)
    @dat = @dtable.clone
    f.close
  end
end

Instance Attribute Details

#fileString

Returns the current value of file.

Returns:

  • (String)

    the current value of file



4
5
6
# File 'lib/heliodor/db.rb', line 4

def file
  @file
end

#tsafeBool

When true, uses mutexes for building queries

Returns:

  • (Bool)

    the current value of tsafe



4
5
6
# File 'lib/heliodor/db.rb', line 4

def tsafe
  @tsafe
end

Instance Method Details

#delete(table) ⇒ self

Deletes given table

Parameters:

  • table (String)

Returns:

  • (self)


50
51
52
53
54
55
56
57
58
59
60
# File 'lib/heliodor/db.rb', line 50

def delete(table)
  if @tsafe
    @mutex.synchronize do
      @dat.delete(table)
      write(@dat)
    end
  else
    write(@dat)
    @dat.delete(table)
  end
end

#inspectObject



80
81
82
# File 'lib/heliodor/db.rb', line 80

def inspect
  %(#<Heliodor::DB:#{object_id.to_s(16)} @file='#{@file}'>)
end

#query(table) ⇒ Heliodor::Query

Entry point for building queries

Parameters:

  • table (String)

Returns:



37
38
39
40
41
42
43
44
45
# File 'lib/heliodor/db.rb', line 37

def query(table)
  if @tsafe
    @mutex.synchronize do
      Heliodor::Query.new(self, table, @dat)
    end
  else
    Heliodor::Query.new(self, table, @dat)
  end
end

#tablesArray<String>

Returns array of table names

Returns:

  • (Array<String>)

    Array of table names



64
65
66
# File 'lib/heliodor/db.rb', line 64

def tables
  @dat.keys
end

#write(dat) ⇒ self

Writes database to file

Returns:

  • (self)


70
71
72
73
74
75
76
77
78
# File 'lib/heliodor/db.rb', line 70

def write(dat)
  @dat = dat
  File.truncate(@file, 0) if File.exist?(@file)
  Zlib::GzipWriter.open(File.expand_path(@file)) do |f|
    f.write(dat.merge(@dtable).to_bson.to_s)
    f.close
  end
  self
end