Module: Persist::TSVAdapter

Included in:
CDBAdapter, FWTAdapter, KCAdapter, LMDBAdapter, PKIAdapter, TCAdapter
Defined in:
lib/rbbt/persist/tsv/adapter.rb

Constant Summary collapse

MAX_CHAR =
255.chr

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#closedObject

Returns the value of attribute closed.



4
5
6
# File 'lib/rbbt/persist/tsv/adapter.rb', line 4

def closed
  @closed
end

#mutexObject

Returns the value of attribute mutex.



4
5
6
# File 'lib/rbbt/persist/tsv/adapter.rb', line 4

def mutex
  @mutex
end

#persistence_pathObject

Returns the value of attribute persistence_path.



4
5
6
# File 'lib/rbbt/persist/tsv/adapter.rb', line 4

def persistence_path
  @persistence_path
end

#writableObject

Returns the value of attribute writable.



4
5
6
# File 'lib/rbbt/persist/tsv/adapter.rb', line 4

def writable
  @writable
end

Instance Method Details

#[](*args) ⇒ Object



155
156
157
158
159
# File 'lib/rbbt/persist/tsv/adapter.rb', line 155

def [](*args)
  self.read_and_close do
    super(*args) #- TSV::ENTRY_KEYS.to_a
  end
end

#[]=(*args) ⇒ Object



161
162
163
164
165
# File 'lib/rbbt/persist/tsv/adapter.rb', line 161

def []=(*args)
  self.write_and_close do
    super(*args) #- TSV::ENTRY_KEYS.to_a
  end
end

#close(*args) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/rbbt/persist/tsv/adapter.rb', line 32

def close(*args)
  begin
    super(*args)
    @closed = true
  rescue NoMethodError
  end
  self
end

#closed?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/rbbt/persist/tsv/adapter.rb', line 12

def closed?
  @closed
end

#collectObject



198
199
200
201
202
203
204
205
206
207
208
# File 'lib/rbbt/persist/tsv/adapter.rb', line 198

def collect
  res = []
  each do |key, value|
    res << if block_given?
             yield key, value
    else
      [key, value]
    end
  end
  res
end

#delete(key) ⇒ Object



48
49
50
# File 'lib/rbbt/persist/tsv/adapter.rb', line 48

def delete(key)
  out(key)
end

#each(*args, &block) ⇒ Object



192
193
194
195
196
# File 'lib/rbbt/persist/tsv/adapter.rb', line 192

def each(*args, &block)
  self.read_and_close do
    super(*args, &block)
  end
end

#get_prefix(key) ⇒ Object



180
181
182
183
# File 'lib/rbbt/persist/tsv/adapter.rb', line 180

def get_prefix(key)
  keys = prefix(key)
  select(:key => keys)
end

#include?(*args) ⇒ Boolean

Returns:

  • (Boolean)


149
150
151
152
153
# File 'lib/rbbt/persist/tsv/adapter.rb', line 149

def include?(*args)
  self.read_and_close do
    super(*args) #- TSV::ENTRY_KEYS.to_a
  end
end

#keys(*args) ⇒ Object



167
168
169
170
171
# File 'lib/rbbt/persist/tsv/adapter.rb', line 167

def keys(*args)
  self.read_and_close do
    super(*args)
  end
end

#lockObject



52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/rbbt/persist/tsv/adapter.rb', line 52

def lock
  return yield if @locked
  lock_filename = Persist.persistence_path(persistence_path, {:dir => TSV.lock_dir})
  Misc.lock(lock_filename) do
    begin
      @locked = true
      yield
    ensure
      @locked = false
    end
  end
end

#lock_and_closeObject



65
66
67
68
69
70
71
72
73
# File 'lib/rbbt/persist/tsv/adapter.rb', line 65

def lock_and_close
  lock do
    begin
      yield
    ensure
      close
    end
  end
end

#merge!(hash) ⇒ Object



137
138
139
140
141
# File 'lib/rbbt/persist/tsv/adapter.rb', line 137

def merge!(hash)
  hash.each do |key,values|
    self[key] = values
  end
end

#prefix(key) ⇒ Object



174
175
176
177
178
# File 'lib/rbbt/persist/tsv/adapter.rb', line 174

def prefix(key)
  self.read_and_close do
    range(key, 1, key + MAX_CHAR, 1)
  end
end

#range(*args) ⇒ Object



143
144
145
146
147
# File 'lib/rbbt/persist/tsv/adapter.rb', line 143

def range(*args)
  self.read_and_close do
    super(*args)
  end
end

#read(*args) ⇒ Object



41
42
43
44
45
46
# File 'lib/rbbt/persist/tsv/adapter.rb', line 41

def read(*args)
  begin
    super(*args)
  rescue NoMethodError
  end
end

#read?Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/rbbt/persist/tsv/adapter.rb', line 20

def read?
  ! (write? || closed?)
end

#read_and_closeObject



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# File 'lib/rbbt/persist/tsv/adapter.rb', line 117

def read_and_close
  #return yield if @locked
  if read? || write?
    begin
      return yield
    ensure
      close unless @locked
    end
  end

  lock do
    read true if closed? || ! read?
    begin
      yield
    ensure
      close
    end
  end
end

#size(*args) ⇒ Object



186
187
188
189
190
# File 'lib/rbbt/persist/tsv/adapter.rb', line 186

def size(*args)
  self.read_and_close do
    super(*args)
  end
end

#values_at(*keys) ⇒ Object



210
211
212
213
214
215
216
# File 'lib/rbbt/persist/tsv/adapter.rb', line 210

def values_at(*keys)
  self.read_and_close do
    keys.collect do |k|
      self[k]
    end
  end
end

#write(*args) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/rbbt/persist/tsv/adapter.rb', line 24

def write(*args)
  begin
    super(*args)
    @writable = true
  rescue NoMethodError
  end
end

#write?Boolean

Returns:

  • (Boolean)


16
17
18
# File 'lib/rbbt/persist/tsv/adapter.rb', line 16

def write?
  @writable
end

#write_and_closeObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/rbbt/persist/tsv/adapter.rb', line 94

def write_and_close
  if write?
    begin
      return yield
    ensure
      close unless @locked
    end
  end

  lock do
    write(true) if closed? || ! write?
    res = begin
            yield
          rescue Exception
            Log.exception $!
            raise $!
          ensure
            close
          end
    res
  end
end

#write_and_readObject



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/rbbt/persist/tsv/adapter.rb', line 75

def write_and_read
  if write?
    begin
      return yield
    ensure
      read
    end
  end

  lock do
    write(true) if closed? || !write?
    begin
      yield
    ensure
      read
    end
  end
end