Class: AlPersistRDB

Inherits:
AlPersist show all
Defined in:
lib/al_persist_rdb.rb

Overview

データ永続化 RDB共通クラス

Direct Known Subclasses

AlPersistMysql, AlPersistPostgres, AlPersistSqlite

Instance Attribute Summary (collapse)

Instance Method Summary (collapse)

Methods inherited from AlPersist

#[], #[]=, #get_next_offset, #get_previous_offset, #pkey

Constructor Details

- (AlPersistRDB) initialize(base, tname, keys = nil)

constructor

Parameters:

  • (AlRdbw) base

    使用する RDB wrapper オブジェクト

  • (String) tname

    テーブル名

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

    プライマリキー



28
29
30
31
# File 'lib/al_persist_rdb.rb', line 28

def initialize( base, tname, keys = nil )
  super( base, keys )
  @table = tname
end

Instance Attribute Details

- (String) table (readonly)

テーブル名

Returns:

  • (String)

    テーブル名



18
19
20
# File 'lib/al_persist_rdb.rb', line 18

def table
  @table
end

Instance Method Details

- (Array<AlPersist>) all

Note:

データ1件を1つのAlPersistオブジェクトとして配列で返す。 一件もデータがない場合は、空の配列を返す。 read()と違って自分は何も変わらず、自分の複製を生産する。

登録データをすべて読み込む。

Returns:

  • (Array<AlPersist>)

    AlPersistオブジェクトの配列



170
171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/al_persist_rdb.rb', line 170

def all()
  rows = @persist_base.select( "select * from #{@table};" )

  ret = []
  rows.each do |row|
    a = self.dup
    a.values = row
    ret << a
  end

  @search_condition = { :total_rows=>ret.size, :num_rows=>ret.size }
  return ret
end

- (Boolean) create(values = nil)

Note:

引数の指定があれば、その値を一旦内部値(@values)にしたうえで、 内部値を新規保存する。

データをRDBへ、新規保存する。

Parameters:

  • (Hash) values (defaults to: nil)

    プライマリキーを含む保存する値のHash

Returns:

  • (Boolean)

    成功/失敗



82
83
84
85
86
87
# File 'lib/al_persist_rdb.rb', line 82

def create( values = nil )
  @values = values  if values

  res = @persist_base.insert( @table, @values )
  return res[:cmdtuples] == 1 ? true : false
end

- (Boolean) delete(values = nil)

Note:

valuesには、プライマリキー以外の値が含まれていてもよく、単に無視される。 引数の指定があれば、その値を一旦内部値(@values)にしたうえで削除する。

キーの合致するRDB内のデータを、削除する。

Parameters:

  • (Hash) values (defaults to: nil)

    プライマリキーを含むHash

Returns:

  • (Boolean)

    成功/失敗



126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/al_persist_rdb.rb', line 126

def delete( values = nil )
  @values = values  if values

  if @pkeys.empty?
    res = @persist_base.delete( @table, @values )
  else
    where_hash = {}

    # exclude keys
    @pkeys.each do |k|
      raise "No key included in value. #{k}"  if ! @values[k]
      where_hash[k] = @values[k]
    end

    res = @persist_base.delete( @table, where_hash )
  end

  return res[:cmdtuples] == 1 ? true : false
end

- (Boolean) entry(values = nil)

Note:

引数の指定があれば、その値を一旦内部値(@values)にしたうえで登録する。

キーの合致するデータがあれば更新し、なければ新規登録する。

Parameters:

  • (Hash) values (defaults to: nil)

    プライマリキーを含む保存する値のHash

Returns:

  • (Boolean)

    成功/失敗



155
156
157
158
# File 'lib/al_persist_rdb.rb', line 155

def entry( values = nil )
  delete( values )
  create()
end

- (Boolean) read(values = nil)

Note:

valuesには、プライマリキー以外の値が含まれていてもよく、単に無視される。

キーを指定してデータを読み込み、内部(@values) に保持する。

Parameters:

  • (Hash) values (defaults to: nil)

    プライマリキーを含むHash

Returns:

  • (Boolean)

    成功/失敗



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/al_persist_rdb.rb', line 42

def read( values = nil )
  @values = values  if values
  @search_condition = {}
  return false  if @values.empty?

  #
  # exclude keys
  #
  val = {}
  if ! @pkeys.empty?
    @pkeys.each do |k|
      return false  if ! @values.key?( k )
      val[k] = @values[k]
    end
  else
    @values.each do |k,v|
      val[k.to_sym] = v
    end
  end

  #
  # run sql
  #
  rows = @persist_base.select( "select * from #{@table} _WHERE_;", val )
  return false  if rows.empty?

  @values = rows[0]
  return true
end

- (Array<AlPersist>) search(param = {})

Note:

データ1件を1つのAlPersistオブジェクトとして配列で返す。 一件もデータがない場合は、空の配列を返す。 read()と違って自分は何も変わらず、自分の複製を生産する。 :total_rowsが指定なき時は、全件数を取得してから結果を取得する。 これが速度的に問題になるときは、ダミー値を入れておく。

登録データを選択的に読み込む。

Parameters:

  • (Hash) param (defaults to: {})

    検索パラメータ

Options Hash (param):

  • (Hash) :where N/A

    検索条件のハッシュ

  • (Hash, Array, String) :order_by N/A

    並べ替え順

  • (Integer) :limit N/A

    最大取得数

  • (Integer) :offset N/A

    オフセット

  • (Integer) :total_rows N/A

    全件数のキャッシュ

Returns:

  • (Array<AlPersist>)

    Persistオブジェクトの配列

See Also:



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
# File 'lib/al_persist_rdb.rb', line 203

def search( param = {} )
  #
  # Where option
  #
  if param[:where]
    @search_condition[:where] = param[:where]
  elsif param.has_key?(:where)
    @search_condition.delete(:where)
  end

  #
  # SQL order by
  #
  sql = ""
  if param[:order_by]
    @search_condition[:order_by] = param[:order_by]
  elsif param.has_key?(:order_by)
    @search_condition.delete(:order_by)
  end
  if @search_condition[:order_by]
    case @search_condition[:order_by]
    when Array
      flag_1st = true
      @search_condition[:order_by].each do |k|
        sql << (flag_1st ? " order by #{k}" : ",#{k}")
        flag_1st = false
      end

    when Hash
      flag_1st = true
      @search_condition[:order_by].each do |k,v|
        next if /^asc|desc$/i !~ v
        sql << (flag_1st ? " order by #{k} #{v}" : ",#{k} #{v}")
        flag_1st = false
      end

    when String
      sql << " order by #{@search_condition[:order_by]}"
    end
  end

  #
  # SQL limit, offset
  #
  if param[:limit]
    limit = param[:limit].to_i
    limit = 1  if limit < 1
    @search_condition[:limit] = limit
  elsif param.has_key?(:limit)
    @search_condition.delete(:limit)
  end
  if param[:offset]
    offset = param[:offset].to_i
    offset = 0  if offset < 0
    @search_condition[:offset] = offset
  elsif param.has_key?(:offset)
    @search_condition.delete(:offset)
  end
  if @search_condition[:limit]
    sql << " limit #{@search_condition[:limit]}"
    if @search_condition[:offset]
      sql << " offset #{@search_condition[:offset]}"
    end
  end

  #
  # 実データ取得
  #
  if @search_condition[:where]
    sql = "select * from #{@table} _WHERE_ #{sql};"
    rows = @persist_base.select( sql, @search_condition[:where] )
  else
    sql = "select * from #{@table} #{sql};"
    rows = @persist_base.select( sql )
  end

  @search_condition[:num_rows] = rows.count
  ret = []
  rows.each do |row|
    a = self.dup
    a.values = row
    ret << a
  end

  #
  # 件数取得
  #
  if param[:total_rows]
    @search_condition[:total_rows] = param[:total_rows]
  elsif param.has_key?(:total_rows)
    @search_condition.delete(:total_rows)
    return ret
  end
  if ! @search_condition[:limit]
    return ret
  end

  # num_rowsに矛盾がないか確認
  if @search_condition[:total_rows]
    num_rows = @search_condition[:total_rows].to_i - @search_condition[:offset].to_i
    if num_rows > param[:limit]
      num_rows = param[:limit]
    end

    if @search_condition[:num_rows] == num_rows
      return ret
    end
  end

  # 件数の取得
  if @search_condition[:where]
    sql = "select count(*) as numrows from #{@table} _WHERE_;"
    rows = @persist_base.select( sql, @search_condition[:where] )
  else
    sql = "select count(*) as numrows from #{@table};"
    rows = @persist_base.select( sql )
  end
  @search_condition[:total_rows] = rows[0][:numrows].to_i

  return ret
end

- (Boolean) update(values = nil)

Note:

引数の指定があれば、その値を一旦内部値(@values)にしたうえで更新する。

キーの合致するRDB内のデータを、更新する。

Parameters:

  • (Hash) values (defaults to: nil)

    プライマリキーを含む更新する値のHash

Returns:

  • (Boolean)

    成功/失敗



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/al_persist_rdb.rb', line 98

def update( values = nil )
  @values = values  if values
  return false  if @pkeys.empty?

  value_hash = @values.dup
  where_hash = {}

  # exclude key
  @pkeys.each do |k|
    raise "No key included in value. #{k}"  if ! value_hash[k]
    where_hash[k] = value_hash[k]
    value_hash.delete( k )
  end

  res = @persist_base.update( @table, value_hash, where_hash )
  return res[:cmdtuples] == 1 ? true : false
end