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