Class: Nostrb::SQLite::Storage

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

Direct Known Subclasses

Reader, Setup, Writer, Nostrb::Sequel::Storage

Constant Summary collapse

KB =
1024
MB =
KB * 1024
GB =
MB * 1024
FILENAME =
'sqlite.tmp.db'
CONFIG =
{
  default_transaction_mode: :immediate,
}
SQLITE_USAGE =
/\Asqlite_/
PRAGMAS =
{
  foreign_keys: true,          # enable FK constraints
  mmap_size: 128 * MB,         # enable mmap I/O, 128 MB

  # Write Ahead Log, append-only so safe for infrequent fsync
  journal_mode: 'wal',         # enable WAL, less read/write contention
  journal_size_limit: 64 * MB, # enable, 64 MB
  synchronous: 1,              # 1=normal, default, good for WAL
  wal_autocheckpoint: 1000,    # default, pages per fsync
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(filename = FILENAME, set_pragmas: true, **kwargs) ⇒ Storage

Returns a new instance of Storage.



134
135
136
137
138
139
140
# File 'lib/nostrb/sqlite.rb', line 134

def initialize(filename = FILENAME, set_pragmas: true, **kwargs)
  @filename = filename
  @db = SQLite3::Database.new(@filename, **CONFIG.merge(kwargs))
  @db.busy_handler_timeout = 5000 # 5 seconds, release GVL every ms
  @pragma = Pragma.new(@db)
  self.set_pragmas if set_pragmas
end

Instance Attribute Details

#dbObject (readonly)

Returns the value of attribute db.



132
133
134
# File 'lib/nostrb/sqlite.rb', line 132

def db
  @db
end

#filenameObject (readonly)

Returns the value of attribute filename.



132
133
134
# File 'lib/nostrb/sqlite.rb', line 132

def filename
  @filename
end

#pragmaObject (readonly)

Returns the value of attribute pragma.



132
133
134
# File 'lib/nostrb/sqlite.rb', line 132

def pragma
  @pragma
end

Instance Method Details

#all_index_names(table_name) ⇒ Object



167
168
169
# File 'lib/nostrb/sqlite.rb', line 167

def all_index_names(table_name)
  @pragma.list(:index_list, table_name).map { |a| a[1] }
end

#all_table_namesObject



161
# File 'lib/nostrb/sqlite.rb', line 161

def all_table_names = @pragma.list(:table_list).map { |a| a[1] }

#compile_optionsObject

below methods all return an array of strings



159
# File 'lib/nostrb/sqlite.rb', line 159

def compile_options = @pragma.list(:compile_options).map { |a| a[0] }

#database_filesObject



160
# File 'lib/nostrb/sqlite.rb', line 160

def database_files = @pragma.list(:database_list).map { |a| a[2] }

#index_names(table_name) ⇒ Object



171
172
173
# File 'lib/nostrb/sqlite.rb', line 171

def index_names(table_name)
  all_index_names(table_name).select { |name| !SQLITE_USAGE.match name }
end

#pragma_scalarsObject



175
176
177
178
179
180
181
# File 'lib/nostrb/sqlite.rb', line 175

def pragma_scalars
  Pragma::SCALAR.map { |pragma|
    val, enum = @pragma.get(pragma), Pragma::ENUM[pragma]
    val = format("%i (%s)", val, enum[val]) if enum
    format("%s: %s", pragma, val)
  }
end

#readerObject



150
151
152
# File 'lib/nostrb/sqlite.rb', line 150

def reader
  Reader.new(@filename)
end

#reportObject



183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/nostrb/sqlite.rb', line 183

def report
  lines = ['compile_options', '---']
  lines += self.compile_options

  lines += ['', 'database_files', '---']
  lines += self.database_files

  lines += ['', "table_names", '---']
  tables = self.table_names
  lines += tables

  tables.each { |tbl|
    lines += ['', "table_info(#{tbl})", '---']
    lines += @pragma.table_info(tbl).map(&:inspect)

    fks = @pragma.foreign_key_list(tbl).map(&:inspect)
    if fks.length > 1
      lines += ['', "foreign_key_list(#{tbl})", '---']
      lines += fks
    end

    idxs = self.index_names(tbl)
    if !idxs.empty?
      lines += ['', "index_names(#{tbl})", '---']
      lines += idxs
    end

    idxs.each { |idx|
      lines += ['', "index_info(#{idx})", '---']
      lines += @pragma.index_info(idx).map(&:inspect)
    }
  }

  lines += ['', "pragma values", '---']
  lines += self.pragma_scalars
  lines
end

#set_pragmasObject



142
143
144
# File 'lib/nostrb/sqlite.rb', line 142

def set_pragmas
  PRAGMAS.each { |name, val| @pragma.set(name, val) }
end

#setupObject



146
147
148
# File 'lib/nostrb/sqlite.rb', line 146

def setup
  Setup.new(@filename)
end

#table_namesObject



163
164
165
# File 'lib/nostrb/sqlite.rb', line 163

def table_names
  all_table_names().select { |name| !SQLITE_USAGE.match name }
end

#writerObject



154
155
156
# File 'lib/nostrb/sqlite.rb', line 154

def writer
  Writer.new(@filename)
end