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



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

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

#[]=(*args) ⇒ Object



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

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



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

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



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

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

#get_prefix(key) ⇒ Object



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

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

#include?(*args) ⇒ Boolean

Returns:

  • (Boolean)


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

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

#keys(*args) ⇒ Object



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

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
64
# 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})
  Log.stack caller if $LOG
  Misc.lock(lock_filename) do
    begin
      @locked = true
      yield
    ensure
      @locked = false
    end
  end
end

#lock_and_closeObject



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

def lock_and_close
  lock do
    begin
      yield
    ensure
      close
    end
  end
end

#merge!(hash) ⇒ Object



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

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

#prefix(key) ⇒ Object



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

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

#range(*args) ⇒ Object



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

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



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

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



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

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

#values_at(*keys) ⇒ Object



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

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



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

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



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

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