class CArray
Public Class Methods
load_sqlite3(expr, *args)
click to toggle source
# File lib/carray-io-sqlite3/core.rb, line 5 def self.load_sqlite3 (expr, *args) case expr when String file = expr sql, *vars = *args db = SQLite3::Database.new(file) names, *table = db.execute2(sql, *vars) db.close when SQLite3::Database db = expr sql, *vars = *args names, *table = db.execute2(sql, *vars) when SQLite3::Statement stmt = expr vars = args names = stmt.columns table = stmt.execute!(*vars) else raise "invalid 1st arg" end table = table.to_ca table.extend(CA::TableMethods) table.column_names = names return table end
Public Instance Methods
to_sqlite3(database: nil, table:, datatype: "numeric", schema: nil, transaction: true)
click to toggle source
# File lib/carray-io-sqlite3/core.rb, line 31 def to_sqlite3 (database: nil, table:, datatype: "numeric", schema: nil, transaction: true) unless rank <= 2 raise "to_sqlite3 is valid only for 2-dim array (table)" end case database when SQLite3::Database when String if File.exist? database database = SQLite3::Database.open(database) else database = SQLite3::Database.new(database) end else database = SQLite3::Database.new ":memory:" end if respond_to?(:column_names) and column_names vars = column_names else if rank == 1 vars = ["c0"] else vars = CArray.object(dim1).seq.map{|s| "c#{s}" } end end if schema database.execute "create table if not exists #{table} (" + schema + ")" else database.execute "create table if not exists #{table} (" + vars.map{|s| s + " " + datatype }.join(",") + ")" end insert = database.prepare %{ insert or replace into #{table} values (#{(["?"]*vars.size).join(",")}) } database.transaction if transaction if rank == 1 dim0.times do |i| insert.execute [self[i]] end else begin dim0.times do |i| begin insert.execute self[i,nil].to_a rescue puts self[i,nil].to_a raise $! end end end end database.commit if transaction insert.close return database end
unblob(type, subdim = nil)
click to toggle source
# File lib/carray-io-sqlite3/core.rb, line 85 def unblob (type, subdim = nil) bytes = CArray.sizeof(type) elem = nil self.each do |e| unless e.nil? elem = e break end end if elem == nil and subdim == nil raise "all element is nil, please specify dimension." end unless subdim subdim = [elem.bytesize/bytes] end out = CArray.new(type, dim + subdim) needed_bytes = out.elements/self.elements*bytes ref = out.refer(:fixlen, dim, :bytes=>needed_bytes) if elem and needed_bytes != elem.bytesize self.each_addr do |addr| if self[addr].nil? ref[[addr]] = UNDEF else ref[[addr]].load_binary self[addr] end end elsif self.any_equal?(nil) copy = self.to_ca sel = self.eq(nil) copy[sel] = "\0" * needed_bytes ref.load_binary copy.join ref[sel] = UNDEF else ref.load_binary self.join end return out end