Class: AlPersistRDB
Overview
データ永続化 RDB共通クラス
Direct Known Subclasses
Instance Attribute Summary (collapse)
-
- (String) table
readonly
テーブル名.
Instance Method Summary (collapse)
-
- (Array<AlPersist>) all
登録データをすべて読み込む。.
-
- (Boolean) create(values = nil)
データをRDBへ、新規保存する。.
-
- (Boolean) delete(values = nil)
キーの合致するRDB内のデータを、削除する。.
-
- (Boolean) entry(values = nil)
キーの合致するデータがあれば更新し、なければ新規登録する。.
-
- (AlPersistRDB) initialize(base, tname, keys = nil)
constructor
constructor.
-
- (Boolean) read(values = nil)
キーを指定してデータを読み込み、内部(@values) に保持する。.
-
- (Array<AlPersist>) search(param = {})
登録データを選択的に読み込む。.
-
- (Boolean) update(values = nil)
キーの合致するRDB内のデータを、更新する。.
Methods inherited from AlPersist
#[], #[]=, #get_next_offset, #get_previous_offset, #pkey
Constructor Details
- (AlPersistRDB) initialize(base, tname, keys = nil)
constructor
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)
テーブル名
18 19 20 |
# File 'lib/al_persist_rdb.rb', line 18 def table @table end |
Instance Method Details
- (Array<AlPersist>) all
データ1件を1つのAlPersistオブジェクトとして配列で返す。 一件もデータがない場合は、空の配列を返す。 read()と違って自分は何も変わらず、自分の複製を生産する。
登録データをすべて読み込む。
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)
引数の指定があれば、その値を一旦内部値(@values)にしたうえで、 内部値を新規保存する。
データをRDBへ、新規保存する。
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)
valuesには、プライマリキー以外の値が含まれていてもよく、単に無視される。 引数の指定があれば、その値を一旦内部値(@values)にしたうえで削除する。
キーの合致するRDB内のデータを、削除する。
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)
引数の指定があれば、その値を一旦内部値(@values)にしたうえで登録する。
キーの合致するデータがあれば更新し、なければ新規登録する。
155 156 157 158 |
# File 'lib/al_persist_rdb.rb', line 155 def entry( values = nil ) delete( values ) create() end |
- (Boolean) read(values = nil)
valuesには、プライマリキー以外の値が含まれていてもよく、単に無視される。
キーを指定してデータを読み込み、内部(@values) に保持する。
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 = {})
データ1件を1つのAlPersistオブジェクトとして配列で返す。 一件もデータがない場合は、空の配列を返す。 read()と違って自分は何も変わらず、自分の複製を生産する。 :total_rowsが指定なき時は、全件数を取得してから結果を取得する。 これが速度的に問題になるときは、ダミー値を入れておく。
登録データを選択的に読み込む。
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)
引数の指定があれば、その値を一旦内部値(@values)にしたうえで更新する。
キーの合致するRDB内のデータを、更新する。
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 |