Class: AlRdbwSqlite

Inherits:
AlRdbw show all
Defined in:
lib/al_rdbw_sqlite.rb,
lib/al_persist_sqlite.rb

Overview

リレーショナルデータベースラッパー SQLite版

Constant Summary

@@suitable_dbms =

Returns connectメソッドが生成するオブジェクトのためのクラス (継承アトリビュート)

Returns:

  • (Object)

    connectメソッドが生成するオブジェクトのためのクラス (継承アトリビュート)

self

Instance Attribute Summary

Attributes inherited from AlRdbw

#conn_info, #flag_transaction, #handle

Instance Method Summary (collapse)

Methods inherited from AlRdbw

#close, connect, #get_handle, #initialize, #purge, #transaction_active?

Constructor Details

This class inherits a constructor from AlRdbw

Instance Method Details

- (AlPersistSqlite) [](tname)

tableを指定して、Persistオブジェクトを生成 syntax sugar

Parameters:

  • tname (String)

    テーブル名

Returns:



52
53
54
# File 'lib/al_persist_sqlite.rb', line 52

def []( tname )
  return AlPersistSqlite.new( self, tname )
end

- (Boolean) commit

TODO:

トランザクションコミット

実装中。トランザクションがSQLレベルで失敗する条件をテストして返り値に反映する

Returns:

  • (Boolean)

    成否



220
221
222
223
224
225
# File 'lib/al_rdbw_sqlite.rb', line 220

def commit()
  return false  if ! @flag_transaction
  get_handle().execute( "commit transaction;" )
  @flag_transaction = false
  return true
end

- (Hash) delete(table, where_cond)

delete文の発行ヘルパー

Parameters:

  • table (String)

    テーブル名

  • where_cond (Hash)

    where条件

Returns:

  • (Hash)

    結果のHash



192
193
194
195
196
197
198
# File 'lib/al_rdbw_sqlite.rb', line 192

def delete( table, where_cond )
  (where, wval) = make_where_condition( where_cond )
  sql = "delete from #{table} where #{where};"
  get_handle().execute( sql, wval )

  return { :cmdtuples=>handle.changes() }
end

- (Hash) execute(sql, var = []) Also known as: exec

Note:

任意SQLの実行

アクションクエリの実行用。selectは、select()メソッドを使う。

Parameters:

  • sql (String)

    SQL文

  • var (Array) (defaults to: [])

    パラメータクエリ用変数

Returns:

  • (Hash)

    結果



52
53
54
55
56
57
# File 'lib/al_rdbw_sqlite.rb', line 52

def execute( sql, var = [] )
  get_handle().execute( sql, var )
  ret = { :cmdtuples=>handle.changes(), 
          :insert_id=>handle.last_insert_row_id() }
  return ret
end

- (Hash) insert(table, values)

insert文の発行ヘルパー

Parameters:

  • table (String)

    テーブル名

  • values (Hash)

    insertする値のhash

Returns:

  • (Hash)

    結果のHash



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/al_rdbw_sqlite.rb', line 125

def insert( table, values )
  col = ""
  plh = ""
  val = []
  values.each do |k,v|
    col << "#{k},"
    plh << "?,"
    case v
    when Array
      val << v.join( ',' )
    when String, Fixnum, NilClass
      val << v
    else
      val << v.to_s
    end
  end
  col.chop!
  plh.chop!

  sql = "insert into #{table} (#{col}) values (#{plh});"
  handle = get_handle()
  handle.execute( sql, val )

  return { :cmdtuples=>handle.changes(), :insert_id=>handle.last_insert_row_id() }
end

- (Object) open_connection

TODO:

RDBとのコネクションを開始する

コネクションエラー時のエラー処理をどこでするかを明確化して実装しなければならない。 下請けにするライブラリの都合などを鑑みて、全体統一を図る必要があるだろう。 それには、現在のSQLiteとPostgreSQLだけでは、サンプルが足りないように思う。



33
34
35
36
37
38
39
40
# File 'lib/al_rdbw_sqlite.rb', line 33

def open_connection()
  return false  if ! @conn_info

  @handle = SQLite3::Database.new( @conn_info )
  @handle.type_translation = true
  @handle.busy_timeout( 1000000 )
  @conn_info = nil
end

- (Boolean) rollback

トランザクションロールバック

Returns:

  • (Boolean)

    成否



233
234
235
236
237
238
# File 'lib/al_rdbw_sqlite.rb', line 233

def rollback()
  return false  if ! @flag_transaction
  get_handle().execute( "rollback transaction;" )
  @flag_transaction = false
  return true
end

- (Array<Hash>) select(sql, where_cond = nil)

select文の発行ヘルパー

Examples:

where condition
 use Array
  select( "select * from t1 where id=?;", [2] )
 use Hash
  select( "select * from t1 _WHERE_;",
    { :id=>2, :age=>nil, "name like"=>"a%" } )

Parameters:

  • sql (String)

    SQL文

  • where_cond (Array, Hash) (defaults to: nil)

    where条件

Returns:

  • (Array<Hash>)

    結果の配列



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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/al_rdbw_sqlite.rb', line 75

def select( sql, where_cond = nil )
  case where_cond
  when NilClass
    result = get_handle().prepare( sql ).execute()

  when Array
    result = get_handle().prepare( sql ).execute( where_cond )

  when Hash
    s = sql.split( '_WHERE_' )
    raise "SQL error in select()"  if s.size != 2
    (where, val) = make_where_condition( where_cond )
    result = get_handle().prepare( "#{s[0]} where #{where} #{s[1]}" ).execute( val )

  when String
    sql.sub!( '_WHERE_', "where #{where_cond}" )
    result = get_handle().prepare( sql ).execute()

  else
    raise "where_cond error in select()"
  end

  # アトリビュート用キーの準備
  keys = []
  result.columns.each { |k| keys << k.to_sym }

  # 戻り値用Hashの生成
  ret = []
  result.each do |r|
    a = {}
    keys.each do |k|
      v = r.shift
      v.force_encoding( AL_CHARSET ) if v.respond_to?('force_encoding')
      a[k] = v
    end
    ret << a
  end
  result.close

  return ret
end

- (AlPersistSqlite) table(tname, pkey = nil)

tableを指定して、Persistオブジェクトを生成

Parameters:

  • tname (String)

    テーブル名

  • pkey (Array<String,Symbol>, String, Symbol) (defaults to: nil)

    プライマリキー

Returns:



42
43
44
# File 'lib/al_persist_sqlite.rb', line 42

def table( tname, pkey = nil )
  return AlPersistSqlite.new( self, tname, pkey )
end

- (Boolean) transaction

トランザクション開始

Returns:

  • (Boolean)

    成否



206
207
208
209
210
# File 'lib/al_rdbw_sqlite.rb', line 206

def transaction()
  return false  if @flag_transaction
  get_handle().execute( "begin transaction;" )
  return @flag_transaction = true
end

- (Hash) update(table, values, where_cond)

update文の発行ヘルパー

Parameters:

  • table (String)

    テーブル名

  • values (Hash)

    updateする値のhash

  • where_cond (Hash)

    where条件

Returns:

  • (Hash)

    結果のHash



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/al_rdbw_sqlite.rb', line 160

def update( table, values, where_cond )
  columns = ""
  val = []
  values.each do |k,v|
    columns << "#{k}=?,"
    case v
    when Array
      val << v.join( ',' )
    when String, Fixnum, NilClass
      val << v
    else
      val << v.to_s
    end
  end
  columns.chop!

  (where, wval) = make_where_condition( where_cond )

  sql = "update #{table} set #{columns} where #{where};"
  get_handle().execute( sql, val + wval )

  return { :cmdtuples=>handle.changes() }
end