Class: Nostrb::SQLite::Reader

Inherits:
Storage
  • Object
show all
Defined in:
lib/nostrb/sqlite.rb

Constant Summary collapse

PRAGMAS =
Storage::PRAGMAS.merge(query_only: true)

Constants inherited from Storage

Storage::CONFIG, Storage::FILENAME, Storage::GB, Storage::KB, Storage::MB, Storage::SQLITE_USAGE

Instance Attribute Summary

Attributes inherited from Storage

#db, #filename, #pragma

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Storage

#all_index_names, #all_table_names, #compile_options, #database_files, #index_names, #pragma_scalars, #reader, #report, #set_pragmas, #setup, #table_names, #writer

Constructor Details

#initialize(filename = FILENAME, **kwargs) ⇒ Reader

Returns a new instance of Reader.



331
332
333
# File 'lib/nostrb/sqlite.rb', line 331

def initialize(filename = FILENAME, **kwargs)
  super(filename, **kwargs.merge(readonly: true))
end

Class Method Details

.event_clauses(filter) ⇒ Object



301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
# File 'lib/nostrb/sqlite.rb', line 301

def self.event_clauses(filter)
  clauses = []
  if !filter.ids.empty?
    clauses << format("id IN ('%s')", filter.ids.join("','"))
  end
  if !filter.authors.empty?
    clauses << format("pubkey in ('%s')", filter.authors.join("','"))
  end
  if !filter.kinds.empty?
    clauses << format("kind in (%s)", filter.kinds.join(','))
  end
  if filter.since
    clauses << format("created_at >= %i", filter.since)
  end
  if filter.until
    clauses << format("created_at <= %i", filter.until)
  end
  clauses.join(' AND ')
end

.hydrate(hash) ⇒ Object

parse the JSON tags into a Ruby array



296
297
298
299
# File 'lib/nostrb/sqlite.rb', line 296

def self.hydrate(hash)
  hash["tags"] = Nostrb.parse(hash.fetch("tags"))
  hash
end

.tag_clauses(filter_tags) ⇒ Object

filter_tags: { ‘a’ => [String] }



322
323
324
325
326
327
328
329
# File 'lib/nostrb/sqlite.rb', line 322

def self.tag_clauses(filter_tags)
  clauses = []
  filter_tags.each { |tag, values|
    clauses << format("tag = %s", tag)
    clauses << format("value in (%s)", values.join(','))
  }
  clauses.join(' AND ')
end

Instance Method Details

#process_events(filter = nil) ⇒ Object



362
363
364
# File 'lib/nostrb/sqlite.rb', line 362

def process_events(filter = nil)
  process_events_table('events', filter)
end

#process_events_table(table = 'events', filter = nil) ⇒ Object



348
349
350
351
352
353
354
# File 'lib/nostrb/sqlite.rb', line 348

def process_events_table(table = 'events', filter = nil)
  a = []
  select_events_table(table, filter).each_hash { |h|
    a << Reader.hydrate(h)
  }
  a
end

#process_r_events(filter = nil) ⇒ Object



383
384
385
# File 'lib/nostrb/sqlite.rb', line 383

def process_r_events(filter = nil)
  process_events_table('r_events', filter)
end

#select_events(filter = nil) ⇒ Object

these are presumably filtered so cannot be prepared use Database#query to get a ResultSet



358
359
360
# File 'lib/nostrb/sqlite.rb', line 358

def select_events(filter = nil)
  select_events_table('events', filter)
end

#select_events_table(table = 'events', filter = nil) ⇒ Object

Regular Events



339
340
341
342
343
344
345
346
# File 'lib/nostrb/sqlite.rb', line 339

def select_events_table(table = 'events', filter = nil)
  sql = format("SELECT content, kind, tags, pubkey, created_at, id, sig
                FROM %s", table)
  if !filter.nil?
    sql += format(" WHERE %s", Reader.event_clauses(filter))
  end
  @db.query sql
end

#select_r_events(filter = nil) ⇒ Object

Replaceable Events



379
380
381
# File 'lib/nostrb/sqlite.rb', line 379

def select_r_events(filter = nil)
  select_events_table('r_events', filter)
end

#select_r_tags(event_id:, created_at:) ⇒ Object



387
388
389
390
391
392
393
# File 'lib/nostrb/sqlite.rb', line 387

def select_r_tags(event_id:, created_at:)
  @select_r_tags ||= @db.prepare("SELECT tag, value, json
                                  FROM r_tags
                                 WHERE r_event_id = :event_id
                                   AND created_at = :created_at")
  @select_r_tags.execute(event_id: event_id, created_at: created_at)
end

#select_tags(event_id:, created_at:) ⇒ Object

use a prepared statement to get a ResultSet



367
368
369
370
371
372
373
# File 'lib/nostrb/sqlite.rb', line 367

def select_tags(event_id:, created_at:)
  @select_tags ||= @db.prepare("SELECT tag, value, json
                                FROM tags
                               WHERE event_id = :event_id
                                 AND created_at = :created_at")
  @select_tags.execute(event_id: event_id, created_at: created_at)
end