Class: SQLite3Hash
- Inherits:
-
Object
- Object
- SQLite3Hash
- Defined in:
- lib/sqlite3_hash.rb
Defined Under Namespace
Classes: MissingDBPath
Class Method Summary collapse
Instance Method Summary collapse
- #==(otherHash) ⇒ Object (also: #eql?)
- #[](key) ⇒ Object
- #[]=(key, value) ⇒ Object (also: #set, #write, #hsh, #store)
- #assoc(key) ⇒ Object
- #clear(replaceHash = nil) ⇒ Object (also: #replace)
- #compare_by_identity ⇒ Object
- #compare_by_identity? ⇒ Boolean
- #default(key = nil) ⇒ Object
- #default=(v) ⇒ Object
- #default_proc ⇒ Object
- #del(key) ⇒ Object (also: #delete)
- #delete_if ⇒ Object
-
#dumpTable ⇒ Object
For debug.
- #each ⇒ Object (also: #each_pair)
- #each_key ⇒ Object
- #each_value ⇒ Object
- #empty? ⇒ Boolean
- #fetch(key, default = nil) ⇒ Object
- #flatten(level = 1) ⇒ Object
- #get ⇒ Object
- #has_key?(k) ⇒ Boolean (also: #include?, #key?, #member?)
- #has_value?(v) ⇒ Boolean (also: #value?)
- #hash ⇒ Object
- #index(value) ⇒ Object (also: #key)
-
#initialize(db = nil, init = nil, table = 'sqlite3hash', &default_proc) ⇒ SQLite3Hash
constructor
new(db) new(db, default_obj) new(db, hash) new(db, default_obj, table_name) new(db, hash, table_name) All of the above with block specified (default_proc).
- #inspect ⇒ Object
- #invert ⇒ Object
- #keep_if ⇒ Object
- #keys ⇒ Object
- #merge(otherHash, &block) ⇒ Object
- #merge!(otherHash) ⇒ Object (also: #update)
- #rassoc(value) ⇒ Object
- #read ⇒ Object
-
#rehash ⇒ Object
Not implemented.
- #reject ⇒ Object
- #reject! ⇒ Object
- #select ⇒ Object
- #select! ⇒ Object
- #shift ⇒ Object
- #size ⇒ Object (also: #length)
- #sort ⇒ Object
- #to_a ⇒ Object
- #to_h ⇒ Object (also: #to_hash)
- #to_s ⇒ Object
- #values ⇒ Object
-
#values_at(*keys) ⇒ Object
Values for a given set of keys.
Constructor Details
#initialize(db = nil, init = nil, table = 'sqlite3hash', &default_proc) ⇒ SQLite3Hash
new(db) new(db, default_obj) new(db, hash) new(db, default_obj, table_name) new(db, hash, table_name) All of the above with block specified (default_proc)
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
# File 'lib/sqlite3_hash.rb', line 39 def initialize(db=nil, init=nil, table='sqlite3hash', &default_proc) raise SQLite3Hash::MissingDBPath unless db @db = db @sqldb = SQLite3::Database.open(@db) # Handle args @default = (init.class==Hash) ? nil : init @default_proc = block_given? ? default_proc : nil # Safely quote table @table = table @table = table.gsub( /'/, "''" ) createTable # Init from hash init.each { |k,v| set(k,v) } if init.class==Hash end |
Class Method Details
.[](*a) ⇒ Object
338 339 340 |
# File 'lib/sqlite3_hash.rb', line 338 def self.[](*a) raise NotImplementedError end |
Instance Method Details
#==(otherHash) ⇒ Object Also known as: eql?
269 270 271 |
# File 'lib/sqlite3_hash.rb', line 269 def ==(otherHash) to_hash.==(otherHash) end |
#[](key) ⇒ Object
69 70 71 72 73 |
# File 'lib/sqlite3_hash.rb', line 69 def [](key) return nil unless @sqldb row = @sqldb.get_first_row( "select * from '#{@table}' where key = ?", Marshal.dump(key)) row ? (row2value(row)) : default(key) end |
#[]=(key, value) ⇒ Object Also known as: set, write, hsh, store
93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/sqlite3_hash.rb', line 93 def []=(key,value) return unless @sqldb # Unlike a Hash, can't store with key nil, we could use quoting to change this if needed return unless key rows = { 'valueString' => nil, 'valueSymbol' => nil, 'valueFixnum' => nil, 'valueFloat' => nil, 'valueMarshal' => nil, } rowname,value = rowValue(value) rows[rowname] = value keys = ['key'] # Key is always marshalled - it can be many types and needs to be a unique index values = [Marshal.dump(key)] rows.each { |k,v| keys.push(k) values.push(v) } @sqldb.execute("insert or replace into '#{@table}'(#{keys.join(',')}) VALUES(#{(['?']*values.size).join(',')})",*values) end |
#assoc(key) ⇒ Object
85 86 87 |
# File 'lib/sqlite3_hash.rb', line 85 def assoc(key) has_key?(key) ? [key,get(key)] : nil end |
#clear(replaceHash = nil) ⇒ Object Also known as: replace
228 229 230 231 |
# File 'lib/sqlite3_hash.rb', line 228 def clear(replaceHash = nil) @sqldb.execute("drop table '#{@table}'") createTable(replaceHash) end |
#compare_by_identity ⇒ Object
332 333 334 |
# File 'lib/sqlite3_hash.rb', line 332 def compare_by_identity raise NotImplementedError end |
#compare_by_identity? ⇒ Boolean
335 336 337 |
# File 'lib/sqlite3_hash.rb', line 335 def compare_by_identity? false end |
#default(key = nil) ⇒ Object
76 77 78 |
# File 'lib/sqlite3_hash.rb', line 76 def default(key=nil) (key && @default_proc) ? @default_proc.call(self,key) : @default end |
#default=(v) ⇒ Object
79 80 81 |
# File 'lib/sqlite3_hash.rb', line 79 def default=(v) @default = v end |
#default_proc ⇒ Object
82 83 84 |
# File 'lib/sqlite3_hash.rb', line 82 def default_proc @default_proc end |
#del(key) ⇒ Object Also known as: delete
169 170 171 172 173 |
# File 'lib/sqlite3_hash.rb', line 169 def del(key) #puts "delete key #{key}" return unless @sqldb @sqldb.execute("delete from '#{@table}' where key = ?",Marshal.dump(key)) end |
#delete_if ⇒ Object
183 184 185 186 187 188 189 190 |
# File 'lib/sqlite3_hash.rb', line 183 def delete_if return Enumerator.new { |y| each { |k,v| delete(k) if y.yield(k,v) } self } unless block_given? each { |k,v| delete(k) if yield(k,v) } return self end |
#dumpTable ⇒ Object
For debug
318 319 320 321 322 323 324 325 326 |
# File 'lib/sqlite3_hash.rb', line 318 def dumpTable h = Hash.new return puts "NO CONNECTION" unless @sqldb @sqldb.execute("select * from '#{@table}'") { |row| row[0] = Marshal.load(row[0]) p row } h end |
#each ⇒ Object Also known as: each_pair
129 130 131 132 |
# File 'lib/sqlite3_hash.rb', line 129 def each return Enumerator.new { |y| rows { |row| y.yield(Marshal.load(row[0]),row2value(row)) } } unless block_given? rows { |row| yield(Marshal.load(row[0]),row2value(row)) } end |
#each_key ⇒ Object
135 136 137 138 |
# File 'lib/sqlite3_hash.rb', line 135 def each_key return Enumerator.new { |y| rows { |row| y.yield(Marshal.load(row[0])) } } unless block_given? rows { |row| yield(Marshal.load(row[0])) } end |
#each_value ⇒ Object
139 140 141 142 |
# File 'lib/sqlite3_hash.rb', line 139 def each_value return Enumerator.new { |y| rows { |row| y.yield(row2value(row)) } } unless block_given? rows { |row| yield(row2value(row)) } end |
#empty? ⇒ Boolean
165 166 167 |
# File 'lib/sqlite3_hash.rb', line 165 def empty? size==0 ? true : false end |
#fetch(key, default = nil) ⇒ Object
121 122 123 124 125 126 127 |
# File 'lib/sqlite3_hash.rb', line 121 def fetch(key,default = nil) v = get(key) return v if v return default if default return yield(key) if block_given? return raise KeyError end |
#flatten(level = 1) ⇒ Object
154 155 156 157 158 |
# File 'lib/sqlite3_hash.rb', line 154 def flatten(level=1) arr = [] each { |k,v| arr.push([k,v]) } arr.flatten(level) end |
#get ⇒ Object
74 75 76 77 78 |
# File 'lib/sqlite3_hash.rb', line 74 def [](key) return nil unless @sqldb row = @sqldb.get_first_row( "select * from '#{@table}' where key = ?", Marshal.dump(key)) row ? (row2value(row)) : default(key) end |
#has_key?(k) ⇒ Boolean Also known as: include?, key?, member?
234 235 236 |
# File 'lib/sqlite3_hash.rb', line 234 def has_key?(k) @sqldb.get_first_row( "select * from '#{@table}' where key = ?", Marshal.dump(k)) ? true : false end |
#has_value?(v) ⇒ Boolean Also known as: value?
247 248 249 |
# File 'lib/sqlite3_hash.rb', line 247 def has_value?(v) index(v) ? true : false end |
#hash ⇒ Object
273 274 275 |
# File 'lib/sqlite3_hash.rb', line 273 def hash to_hash.hash end |
#index(value) ⇒ Object Also known as: key
241 242 243 244 245 |
# File 'lib/sqlite3_hash.rb', line 241 def index(value) rowname,value = rowValue(value) row = @sqldb.get_first_row( "select * from '#{@table}' where #{rowname} = ?", value) row ? Marshal.load(row[0]) : nil end |
#inspect ⇒ Object
308 309 310 311 312 |
# File 'lib/sqlite3_hash.rb', line 308 def inspect inspect = "SQLite3Hash[#{@db}:#{@table}]" return "#<#{inspect} - no database connection>" unless @sqldb return "#<#{inspect} #{to_hash.inspect}>" end |
#invert ⇒ Object
276 277 278 |
# File 'lib/sqlite3_hash.rb', line 276 def invert to_hash.invert end |
#keep_if ⇒ Object
175 176 177 178 179 180 181 182 |
# File 'lib/sqlite3_hash.rb', line 175 def keep_if return Enumerator.new { |y| each { |k,v| delete(k) unless y.yield(k,v) } self } unless block_given? each { |k,v| delete(k) unless yield(k,v) } return self end |
#keys ⇒ Object
143 144 145 |
# File 'lib/sqlite3_hash.rb', line 143 def keys rows.map { |row| Marshal.load(row[0]) } end |
#merge(otherHash, &block) ⇒ Object
279 280 281 |
# File 'lib/sqlite3_hash.rb', line 279 def merge(otherHash,&block) to_hash.merge(otherHash,&block) end |
#merge!(otherHash) ⇒ Object Also known as: update
282 283 284 285 286 287 288 289 290 291 |
# File 'lib/sqlite3_hash.rb', line 282 def merge!(otherHash) if block_given? otherHash.each { |key,newval| oldval = get(key) set(key,oldval ? yield(key,oldval,newval) : newval) } else otherHash.each { |k,v| set(k,v) } end end |
#rassoc(value) ⇒ Object
88 89 90 91 |
# File 'lib/sqlite3_hash.rb', line 88 def rassoc(value) key = key(value) key ? [key,value] : nil end |
#read ⇒ Object
75 76 77 78 79 |
# File 'lib/sqlite3_hash.rb', line 75 def [](key) return nil unless @sqldb row = @sqldb.get_first_row( "select * from '#{@table}' where key = ?", Marshal.dump(key)) row ? (row2value(row)) : default(key) end |
#rehash ⇒ Object
Not implemented
329 330 331 |
# File 'lib/sqlite3_hash.rb', line 329 def rehash raise NotImplementedError end |
#reject ⇒ Object
191 192 193 194 195 |
# File 'lib/sqlite3_hash.rb', line 191 def reject hash = Hash.new each { |k,v| hash[k] = v unless yield(k,v) } return hash end |
#reject! ⇒ Object
196 197 198 199 200 201 202 203 204 205 206 207 208 |
# File 'lib/sqlite3_hash.rb', line 196 def reject! changes = 0 en = Enumerator.new { |y| each { |k,v| next unless y.yield(k,v) delete(k) changes += 1 } changes==0 ? nil : self } return en unless block_given? en.each { |k,v| yield(k,v) } end |
#select ⇒ Object
209 210 211 212 213 |
# File 'lib/sqlite3_hash.rb', line 209 def select hash = Hash.new each { |k,v| hash[k] = v if yield(k,v) } return hash end |
#select! ⇒ Object
214 215 216 217 218 219 220 221 222 223 224 225 226 |
# File 'lib/sqlite3_hash.rb', line 214 def select! changes = 0 en = Enumerator.new { |y| each { |k,v| next if y.yield(k,v) delete(k) changes += 1 } changes==0 ? nil : self } return en unless block_given? en.each { |k,v| yield(k,v) } end |
#shift ⇒ Object
252 253 254 255 256 257 258 259 260 |
# File 'lib/sqlite3_hash.rb', line 252 def shift row = @sqldb.get_first_row("select * from '#{@table}'") # TODO - what if we have a default_proc and we shift out? return default(nil) unless row key = Marshal.load(row[0]) value = row2value(row) delete(key) [key,value] end |
#size ⇒ Object Also known as: length
160 161 162 163 |
# File 'lib/sqlite3_hash.rb', line 160 def size got = @sqldb.get_first_row("select count(*) from '#{@table}'") return got && got.class==Array ? got[0] : nil end |
#sort ⇒ Object
304 305 306 |
# File 'lib/sqlite3_hash.rb', line 304 def sort to_a.sort end |
#to_a ⇒ Object
298 299 300 301 302 303 |
# File 'lib/sqlite3_hash.rb', line 298 def to_a a = Array.new return a unless @sqldb each { |k,v| a.push([k,v]) } a end |
#to_h ⇒ Object Also known as: to_hash
262 263 264 265 266 267 |
# File 'lib/sqlite3_hash.rb', line 262 def to_h h = Hash.new return h unless @sqldb each { |k,v| h[k] = v } h end |
#to_s ⇒ Object
313 314 315 |
# File 'lib/sqlite3_hash.rb', line 313 def to_s to_hash.to_s end |
#values ⇒ Object
146 147 148 |
# File 'lib/sqlite3_hash.rb', line 146 def values rows.map { |row| row2value(row) } end |
#values_at(*keys) ⇒ Object
Values for a given set of keys
150 151 152 |
# File 'lib/sqlite3_hash.rb', line 150 def values_at(*keys) keys.map { |key| get(key) } end |