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



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

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

#[]=(*args) ⇒ Object



217
218
219
220
221
# File 'lib/rbbt/persist/tsv/adapter.rb', line 217

def []=(*args)
  self.write_lock 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



254
255
256
257
258
259
260
261
262
263
264
# File 'lib/rbbt/persist/tsv/adapter.rb', line 254

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



248
249
250
251
252
# File 'lib/rbbt/persist/tsv/adapter.rb', line 248

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

#get_prefix(key) ⇒ Object



236
237
238
239
# File 'lib/rbbt/persist/tsv/adapter.rb', line 236

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

#include?(*args) ⇒ Boolean

Returns:

  • (Boolean)


205
206
207
208
209
# File 'lib/rbbt/persist/tsv/adapter.rb', line 205

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

#keys(*args) ⇒ Object



223
224
225
226
227
# File 'lib/rbbt/persist/tsv/adapter.rb', line 223

def keys(*args)
  self.read_lock 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



189
190
191
192
193
# File 'lib/rbbt/persist/tsv/adapter.rb', line 189

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

#prefix(key) ⇒ Object



230
231
232
233
234
# File 'lib/rbbt/persist/tsv/adapter.rb', line 230

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

#range(*args) ⇒ Object



195
196
197
198
199
200
201
202
203
# File 'lib/rbbt/persist/tsv/adapter.rb', line 195

def range(*args)
  begin
    self.read_lock do
      super(*args)
    end
  rescue
    []
  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



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
# File 'lib/rbbt/persist/tsv/adapter.rb', line 139

def read_and_close
  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

#read_lockObject



158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/rbbt/persist/tsv/adapter.rb', line 158

def read_lock
  read if closed?
  if read? || write?
    return yield
  end

  lock do
    close
    read true
    begin
      yield
    end
  end
end

#size(*args) ⇒ Object



242
243
244
245
246
# File 'lib/rbbt/persist/tsv/adapter.rb', line 242

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

#values_at(*keys) ⇒ Object



266
267
268
269
270
271
272
# File 'lib/rbbt/persist/tsv/adapter.rb', line 266

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

#with_read(&block) ⇒ Object



114
115
116
117
118
119
120
# File 'lib/rbbt/persist/tsv/adapter.rb', line 114

def with_read(&block)
  if read? || write?
    return yield
  else
    read_and_close &block
  end
end

#with_write(&block) ⇒ Object



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

def with_write(&block)
  if write?
    return yield
  else
    if self.read?
      self.write_and_read do
        return yield
      end
    else
      self.write_and_close do
        return yield
      end
    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
# 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
          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

#write_lockObject



173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/rbbt/persist/tsv/adapter.rb', line 173

def write_lock
  write if closed?
  if write?
    return yield
  end

  lock do
    close
    write true
    begin
      yield
    end
  end
end