simple_record 2.1.12 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/simple_record/active_sdb.rb +352 -335
  2. metadata +2 -2
@@ -99,23 +99,23 @@ module SimpleRecord
99
99
  @connection || raise(ActiveSdbError.new('Connection to SDB is not established'))
100
100
  end
101
101
 
102
- # Create a new handle to an Sdb account. All handles share the same per process or per thread
103
- # HTTP connection to Amazon Sdb. Each handle is for a specific account.
104
- # The +params+ are passed through as-is to Aws::SdbInterface.new
105
- # Params:
106
- # { :server => 'sdb.amazonaws.com' # Amazon service host: 'sdb.amazonaws.com'(default)
107
- # :port => 443 # Amazon service port: 80 or 443(default)
108
- # :protocol => 'https' # Amazon service protocol: 'http' or 'https'(default)
109
- # :signature_version => '2' # The signature version : '0', '1' or '2' (default)
110
- # DEPRECATED :multi_thread => true|false # Multi-threaded (connection per each thread): true or false(default)
111
- # :connection_mode => :default # options are :default (will use best known option, may change in the future)
112
- # :per_request (opens and closes a connection on every request to SDB)
113
- # :single (same as old multi_thread=>false)
114
- # :per_thread (same as old multi_thread=>true)
115
- # :pool (uses a connection pool with a maximum number of connections - NOT IMPLEMENTED YET)
116
- # :logger => Logger Object # Logger instance: logs to STDOUT if omitted
117
- # :nil_representation => 'mynil'} # interpret Ruby nil as this string value; i.e. use this string in SDB to represent Ruby nils (default is the string 'nil')
118
- # :service_endpoint => '/' # Set this to /mdb/request.mgwsi for usage with M/DB
102
+ # Create a new handle to an Sdb account. All handles share the same per process or per thread
103
+ # HTTP connection to Amazon Sdb. Each handle is for a specific account.
104
+ # The +params+ are passed through as-is to Aws::SdbInterface.new
105
+ # Params:
106
+ # { :server => 'sdb.amazonaws.com' # Amazon service host: 'sdb.amazonaws.com'(default)
107
+ # :port => 443 # Amazon service port: 80 or 443(default)
108
+ # :protocol => 'https' # Amazon service protocol: 'http' or 'https'(default)
109
+ # :signature_version => '2' # The signature version : '0', '1' or '2' (default)
110
+ # DEPRECATED :multi_thread => true|false # Multi-threaded (connection per each thread): true or false(default)
111
+ # :connection_mode => :default # options are :default (will use best known option, may change in the future)
112
+ # :per_request (opens and closes a connection on every request to SDB)
113
+ # :single (same as old multi_thread=>false)
114
+ # :per_thread (same as old multi_thread=>true)
115
+ # :pool (uses a connection pool with a maximum number of connections - NOT IMPLEMENTED YET)
116
+ # :logger => Logger Object # Logger instance: logs to STDOUT if omitted
117
+ # :nil_representation => 'mynil'} # interpret Ruby nil as this string value; i.e. use this string in SDB to represent Ruby nils (default is the string 'nil')
118
+ # :service_endpoint => '/' # Set this to /mdb/request.mgwsi for usage with M/DB
119
119
 
120
120
  def establish_connection(aws_access_key_id=nil, aws_secret_access_key=nil, params={})
121
121
  @connection = Aws::SdbInterface.new(aws_access_key_id, aws_secret_access_key, params)
@@ -132,28 +132,28 @@ module SimpleRecord
132
132
  class << self
133
133
  include ActiveSdbConnect
134
134
 
135
- # Retreive a list of domains.
136
- #
137
- # put Aws::ActiveSdb.domains #=> ['co-workers','family','friends','clients']
138
- #
135
+ # Retreive a list of domains.
136
+ #
137
+ # put Aws::ActiveSdb.domains #=> ['co-workers','family','friends','clients']
138
+ #
139
139
  def domains
140
140
  connection.list_domains[:domains]
141
141
  end
142
142
 
143
- # Create new domain.
144
- # Raises no errors if the domain already exists.
145
- #
146
- # Aws::ActiveSdb.create_domain('alpha') #=> {:request_id=>"6fc652a0-0000-41d5-91f4-3ed390a3d3b2", :box_usage=>"0.0055590278"}
147
- #
143
+ # Create new domain.
144
+ # Raises no errors if the domain already exists.
145
+ #
146
+ # Aws::ActiveSdb.create_domain('alpha') #=> {:request_id=>"6fc652a0-0000-41d5-91f4-3ed390a3d3b2", :box_usage=>"0.0055590278"}
147
+ #
148
148
  def create_domain(domain_name)
149
149
  connection.create_domain(domain_name)
150
150
  end
151
151
 
152
- # Remove domain from SDB.
153
- # Raises no errors if the domain does not exist.
154
- #
155
- # Aws::ActiveSdb.create_domain('alpha') #=> {:request_id=>"6fc652a0-0000-41c6-91f4-3ed390a3d3b2", :box_usage=>"0.0055590001"}
156
- #
152
+ # Remove domain from SDB.
153
+ # Raises no errors if the domain does not exist.
154
+ #
155
+ # Aws::ActiveSdb.create_domain('alpha') #=> {:request_id=>"6fc652a0-0000-41c6-91f4-3ed390a3d3b2", :box_usage=>"0.0055590001"}
156
+ #
157
157
  def delete_domain(domain_name)
158
158
  connection.delete_domain(domain_name)
159
159
  end
@@ -164,54 +164,54 @@ module SimpleRecord
164
164
  class << self
165
165
  include ActiveSdbConnect
166
166
 
167
- # next_token value returned by last find: is useful to continue finding
167
+ # next_token value returned by last find: is useful to continue finding
168
168
  attr_accessor :next_token
169
169
 
170
- # Returns a Aws::SdbInterface object
171
- #
172
- # class A < Aws::ActiveSdb::Base
173
- # end
174
- #
175
- # class B < Aws::ActiveSdb::Base
176
- # end
177
- #
178
- # class C < Aws::ActiveSdb::Base
179
- # end
180
- #
181
- # Aws::ActiveSdb.establish_connection 'key_id_1', 'secret_key_1'
182
- #
183
- # C.establish_connection 'key_id_2', 'secret_key_2'
184
- #
185
- # # A and B uses the default connection, C - uses its own
186
- # puts A.connection #=> #<Aws::SdbInterface:0xb76d6d7c>
187
- # puts B.connection #=> #<Aws::SdbInterface:0xb76d6d7c>
188
- # puts C.connection #=> #<Aws::SdbInterface:0xb76d6ca0>
189
- #
170
+ # Returns a Aws::SdbInterface object
171
+ #
172
+ # class A < Aws::ActiveSdb::Base
173
+ # end
174
+ #
175
+ # class B < Aws::ActiveSdb::Base
176
+ # end
177
+ #
178
+ # class C < Aws::ActiveSdb::Base
179
+ # end
180
+ #
181
+ # Aws::ActiveSdb.establish_connection 'key_id_1', 'secret_key_1'
182
+ #
183
+ # C.establish_connection 'key_id_2', 'secret_key_2'
184
+ #
185
+ # # A and B uses the default connection, C - uses its own
186
+ # puts A.connection #=> #<Aws::SdbInterface:0xb76d6d7c>
187
+ # puts B.connection #=> #<Aws::SdbInterface:0xb76d6d7c>
188
+ # puts C.connection #=> #<Aws::SdbInterface:0xb76d6ca0>
189
+ #
190
190
  def connection
191
191
  @connection || ActiveSdb::connection
192
192
  end
193
193
 
194
194
  @domain = nil
195
195
 
196
- # Current domain name.
197
- #
198
- # # if 'ActiveSupport' is not loaded then class name converted to downcase
199
- # class Client < Aws::ActiveSdb::Base
200
- # end
201
- # puts Client.domain #=> 'client'
202
- #
203
- # # if 'ActiveSupport' is loaded then class name being tableized
204
- # require 'activesupport'
205
- # class Client < Aws::ActiveSdb::Base
206
- # end
207
- # puts Client.domain #=> 'clients'
208
- #
209
- # # Explicit domain name definition
210
- # class Client < Aws::ActiveSdb::Base
211
- # set_domain_name :foreign_clients
212
- # end
213
- # puts Client.domain #=> 'foreign_clients'
214
- #
196
+ # Current domain name.
197
+ #
198
+ # # if 'ActiveSupport' is not loaded then class name converted to downcase
199
+ # class Client < Aws::ActiveSdb::Base
200
+ # end
201
+ # puts Client.domain #=> 'client'
202
+ #
203
+ # # if 'ActiveSupport' is loaded then class name being tableized
204
+ # require 'activesupport'
205
+ # class Client < Aws::ActiveSdb::Base
206
+ # end
207
+ # puts Client.domain #=> 'clients'
208
+ #
209
+ # # Explicit domain name definition
210
+ # class Client < Aws::ActiveSdb::Base
211
+ # set_domain_name :foreign_clients
212
+ # end
213
+ # puts Client.domain #=> 'foreign_clients'
214
+ #
215
215
  def domain
216
216
  unless @domain
217
217
  if defined? ActiveSupport::CoreExtensions::String::Inflections
@@ -223,45 +223,45 @@ module SimpleRecord
223
223
  @domain
224
224
  end
225
225
 
226
- # Change the default domain name to user defined.
227
- #
228
- # class Client < Aws::ActiveSdb::Base
229
- # set_domain_name :foreign_clients
230
- # end
231
- #
226
+ # Change the default domain name to user defined.
227
+ #
228
+ # class Client < Aws::ActiveSdb::Base
229
+ # set_domain_name :foreign_clients
230
+ # end
231
+ #
232
232
  def set_domain_name(domain)
233
233
  @domain = domain.to_s
234
234
  end
235
235
 
236
- # Create domain at SDB.
237
- # Raises no errors if the domain already exists.
238
- #
239
- # class Client < Aws::ActiveSdb::Base
240
- # end
241
- # Client.create_domain #=> {:request_id=>"6fc652a0-0000-41d5-91f4-3ed390a3d3b2", :box_usage=>"0.0055590278"}
242
- #
236
+ # Create domain at SDB.
237
+ # Raises no errors if the domain already exists.
238
+ #
239
+ # class Client < Aws::ActiveSdb::Base
240
+ # end
241
+ # Client.create_domain #=> {:request_id=>"6fc652a0-0000-41d5-91f4-3ed390a3d3b2", :box_usage=>"0.0055590278"}
242
+ #
243
243
  def create_domain(dom=nil)
244
244
  dom = domain if dom.nil?
245
245
  puts "Creating new SimpleDB Domain: " + dom
246
246
  connection.create_domain(dom)
247
247
  end
248
248
 
249
- # Remove domain from SDB.
250
- # Raises no errors if the domain does not exist.
251
- #
252
- # class Client < Aws::ActiveSdb::Base
253
- # end
254
- # Client.delete_domain #=> {:request_id=>"e14d90d3-0000-4898-9995-0de28cdda270", :box_usage=>"0.0055590278"}
255
- #
249
+ # Remove domain from SDB.
250
+ # Raises no errors if the domain does not exist.
251
+ #
252
+ # class Client < Aws::ActiveSdb::Base
253
+ # end
254
+ # Client.delete_domain #=> {:request_id=>"e14d90d3-0000-4898-9995-0de28cdda270", :box_usage=>"0.0055590278"}
255
+ #
256
256
  def delete_domain(dom=nil)
257
257
  dom = domain if dom.nil?
258
258
  puts "!!! DELETING SimpleDB Domain: " + dom
259
259
  connection.delete_domain(dom)
260
260
  end
261
261
 
262
- #
263
- # See select(), original find with QUERY syntax is deprecated so now find and select are synonyms.
264
- #
262
+ #
263
+ # See select(), original find with QUERY syntax is deprecated so now find and select are synonyms.
264
+ #
265
265
  def find(*args)
266
266
  options = args.last.is_a?(Hash) ? args.pop : {}
267
267
  case args.first
@@ -281,9 +281,9 @@ module SimpleRecord
281
281
  end
282
282
  end
283
283
 
284
- #
285
- # Same as find, but will return SimpleDB metadata like :request_id and :box_usage
286
- #
284
+ #
285
+ # Same as find, but will return SimpleDB metadata like :request_id and :box_usage
286
+ #
287
287
  def find_with_metadata(*args)
288
288
  options = args.last.is_a?(Hash) ? args.pop : {}
289
289
  case args.first
@@ -301,55 +301,55 @@ module SimpleRecord
301
301
  end
302
302
  end
303
303
 
304
- # Perform a SQL-like select request.
305
- #
306
- # Single record:
307
- #
308
- # Client.select(:first)
309
- # Client.select(:first, :conditions=> [ "name=? AND wife=?", "Jon", "Sandy"])
310
- # Client.select(:first, :conditions=> { :name=>"Jon", :wife=>"Sandy" }, :select => :girfriends)
311
- #
312
- # Bunch of records:
313
- #
314
- # Client.select(:all)
315
- # Client.select(:all, :limit => 10)
316
- # Client.select(:all, :conditions=> [ "name=? AND 'girlfriend'=?", "Jon", "Judy"])
317
- # Client.select(:all, :conditions=> { :name=>"Sandy" }, :limit => 3)
318
- #
319
- # Records by ids:
320
- #
321
- # Client.select('1')
322
- # Client.select('1234987b4583475347523948')
323
- # Client.select('1','2','3','4', :conditions=> ["toys=?", "beer"])
324
- #
325
- # Find helpers: Aws::ActiveSdb::Base.select_by_... and Aws::ActiveSdb::Base.select_all_by_...
326
- #
327
- # Client.select_by_name('Matias Rust')
328
- # Client.select_by_name_and_city('Putin','Moscow')
329
- # Client.select_by_name_and_city_and_post('Medvedev','Moscow','president')
330
- #
331
- # Client.select_all_by_author('G.Bush jr')
332
- # Client.select_all_by_age_and_gender_and_ethnicity('34','male','russian')
333
- # Client.select_all_by_gender_and_country('male', 'Russia', :order => 'name')
334
- #
335
- # Continue listing:
336
- #
337
- # # initial listing
338
- # Client.select(:all, :limit => 10)
339
- # # continue listing
340
- # begin
341
- # Client.select(:all, :limit => 10, :next_token => Client.next_token)
342
- # end while Client.next_token
343
- #
344
- # Sort oder:
345
- # If :order=>'attribute' option is specified then result response (ordered by 'attribute') will contain only items where attribute is defined (is not null).
346
- #
347
- # Client.select(:all) # returns all records
348
- # Client.select(:all, :order => 'gender') # returns all records ordered by gender where gender attribute exists
349
- # Client.select(:all, :order => 'name desc') # returns all records ordered by name in desc order where name attribute exists
350
- #
351
- # see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?UsingSelect.html
352
- #
304
+ # Perform a SQL-like select request.
305
+ #
306
+ # Single record:
307
+ #
308
+ # Client.select(:first)
309
+ # Client.select(:first, :conditions=> [ "name=? AND wife=?", "Jon", "Sandy"])
310
+ # Client.select(:first, :conditions=> { :name=>"Jon", :wife=>"Sandy" }, :select => :girfriends)
311
+ #
312
+ # Bunch of records:
313
+ #
314
+ # Client.select(:all)
315
+ # Client.select(:all, :limit => 10)
316
+ # Client.select(:all, :conditions=> [ "name=? AND 'girlfriend'=?", "Jon", "Judy"])
317
+ # Client.select(:all, :conditions=> { :name=>"Sandy" }, :limit => 3)
318
+ #
319
+ # Records by ids:
320
+ #
321
+ # Client.select('1')
322
+ # Client.select('1234987b4583475347523948')
323
+ # Client.select('1','2','3','4', :conditions=> ["toys=?", "beer"])
324
+ #
325
+ # Find helpers: Aws::ActiveSdb::Base.select_by_... and Aws::ActiveSdb::Base.select_all_by_...
326
+ #
327
+ # Client.select_by_name('Matias Rust')
328
+ # Client.select_by_name_and_city('Putin','Moscow')
329
+ # Client.select_by_name_and_city_and_post('Medvedev','Moscow','president')
330
+ #
331
+ # Client.select_all_by_author('G.Bush jr')
332
+ # Client.select_all_by_age_and_gender_and_ethnicity('34','male','russian')
333
+ # Client.select_all_by_gender_and_country('male', 'Russia', :order => 'name')
334
+ #
335
+ # Continue listing:
336
+ #
337
+ # # initial listing
338
+ # Client.select(:all, :limit => 10)
339
+ # # continue listing
340
+ # begin
341
+ # Client.select(:all, :limit => 10, :next_token => Client.next_token)
342
+ # end while Client.next_token
343
+ #
344
+ # Sort oder:
345
+ # If :order=>'attribute' option is specified then result response (ordered by 'attribute') will contain only items where attribute is defined (is not null).
346
+ #
347
+ # Client.select(:all) # returns all records
348
+ # Client.select(:all, :order => 'gender') # returns all records ordered by gender where gender attribute exists
349
+ # Client.select(:all, :order => 'name desc') # returns all records ordered by name in desc order where name attribute exists
350
+ #
351
+ # see http://docs.amazonwebservices.com/AmazonSimpleDB/2007-11-07/DeveloperGuide/index.html?UsingSelect.html
352
+ #
353
353
  def select(*args)
354
354
  find(*args)
355
355
  end
@@ -364,28 +364,28 @@ module SimpleRecord
364
364
  SimpleRecord.logger
365
365
  end
366
366
 
367
- # Select
367
+ # Select
368
368
 
369
369
  def select_from_ids(args, options) # :nodoc:
370
370
  cond = []
371
- # detect amount of records requested
371
+ # detect amount of records requested
372
372
  bunch_of_records_requested = args.size > 1 || args.first.is_a?(Array)
373
- # flatten ids
373
+ # flatten ids
374
374
  args = args.to_a.flatten
375
375
  args.each { |id| cond << "itemName() = #{self.connection.escape(id)}" }
376
376
  ids_cond = "(#{cond.join(' OR ')})"
377
- # user defined :conditions to string (if it was defined)
377
+ # user defined :conditions to string (if it was defined)
378
378
  options[:conditions] = build_conditions(options[:conditions])
379
- # join ids condition and user defined conditions
379
+ # join ids condition and user defined conditions
380
380
  options[:conditions] = options[:conditions].blank? ? ids_cond : "(#{options[:conditions]}) AND #{ids_cond}"
381
- #puts 'options=' + options.inspect
381
+ #puts 'options=' + options.inspect
382
382
  result = sql_select(options)
383
- #puts 'select_from_ids result=' + result.inspect
384
- # if one record was requested then return it
383
+ #puts 'select_from_ids result=' + result.inspect
384
+ # if one record was requested then return it
385
385
  unless bunch_of_records_requested
386
386
  result[:single_only] = true
387
387
  record = result[:items].first
388
- # railse if nothing was found
388
+ # railse if nothing was found
389
389
  raise SimpleRecord::RecordNotFound.new("Couldn't find #{name} with ID #{args}") unless record || is_sharded?
390
390
  result[:single] = record
391
391
  else
@@ -405,21 +405,38 @@ module SimpleRecord
405
405
 
406
406
  def sql_select(options) # :nodoc:
407
407
  count = options[:count] || false
408
- #puts 'count? ' + count.to_s
408
+ #puts 'count? ' + count.to_s
409
409
  @next_token = options[:next_token]
410
410
  @consistent_read = options[:consistent_read]
411
411
  select_expression = build_select(options)
412
412
  logger.debug 'SELECT=' + select_expression
413
- # request items
414
- query_result = self.connection.select(select_expression, options)
415
- # puts 'QR=' + query_result.inspect
416
- @next_token = query_result[:next_token]
413
+ # request items
414
+
417
415
  ret = {}
418
416
  if count
419
- ret[:count] = query_result.delete(:items)[0]["Domain"]["Count"][0].to_i
420
- ret.merge!(query_result)
417
+ # we'll keep going to get full count
418
+ total_count = 0
419
+ total_box_usage = 0
420
+ query_result = self.connection.select(select_expression, options) do |result|
421
+ #puts 'result=' + result.inspect
422
+ total_count += result[:items][0]["Domain"]["Count"][0].to_i # result.delete(:items)[0]["Domain"]["Count"][0].to_i
423
+ total_box_usage += result[:box_usage].to_i
424
+ true #continue loop
425
+ end
426
+ ret[:count] = total_count
427
+ ret[:box_usage] = total_box_usage
421
428
  return ret
429
+ else
430
+ query_result = self.connection.select(select_expression, options)
431
+ @next_token = query_result[:next_token]
422
432
  end
433
+ # puts 'QR=' + query_result.inspect
434
+
435
+ #if count
436
+ #ret[:count] = query_result.delete(:items)[0]["Domain"]["Count"][0].to_i
437
+ #ret.merge!(query_result)
438
+ #return ret
439
+ #end
423
440
 
424
441
  items = query_result.delete(:items).map do |hash|
425
442
  id, attributes = hash.shift
@@ -433,7 +450,7 @@ module SimpleRecord
433
450
  ret
434
451
  end
435
452
 
436
- # select_by helpers
453
+ # select_by helpers
437
454
  def select_all_by_(format_str, args, options) # :nodoc:
438
455
  fields = format_str.to_s.sub(/^select_(all_)?by_/, '').split('_and_')
439
456
  conditions = fields.map { |field| "#{field}=?" }.join(' AND ')
@@ -446,11 +463,11 @@ module SimpleRecord
446
463
  select_all_by_(format_str, args, options).first
447
464
  end
448
465
 
449
- # Query
466
+ # Query
450
467
 
451
- # Returns an array of query attributes.
452
- # Query_expression must be a well formated SDB query string:
453
- # query_attributes("['title' starts-with 'O\\'Reily'] intersection ['year' = '2007']") #=> ["title", "year"]
468
+ # Returns an array of query attributes.
469
+ # Query_expression must be a well formated SDB query string:
470
+ # query_attributes("['title' starts-with 'O\\'Reily'] intersection ['year' = '2007']") #=> ["title", "year"]
454
471
  def query_attributes(query_expression) # :nodoc:
455
472
  attrs = []
456
473
  array = query_expression.scan(/['"](.*?[^\\])['"]/).flatten
@@ -461,33 +478,33 @@ module SimpleRecord
461
478
  attrs
462
479
  end
463
480
 
464
- # Returns an array of [attribute_name, 'asc'|'desc']
481
+ # Returns an array of [attribute_name, 'asc'|'desc']
465
482
  def sort_options(sort_string)
466
483
  sort_string[/['"]?(\w+)['"]? *(asc|desc)?/i]
467
484
  [$1, ($2 || 'asc')]
468
485
  end
469
486
 
470
- # Perform a query request.
471
- #
472
- # Options
473
- # :query_expression nil | string | array
474
- # :max_number_of_items nil | integer
475
- # :next_token nil | string
476
- # :sort_option nil | string "name desc|asc"
477
- #
487
+ # Perform a query request.
488
+ #
489
+ # Options
490
+ # :query_expression nil | string | array
491
+ # :max_number_of_items nil | integer
492
+ # :next_token nil | string
493
+ # :sort_option nil | string "name desc|asc"
494
+ #
478
495
  def query(options) # :nodoc:
479
496
  @next_token = options[:next_token]
480
497
  @consistent_read = options[:consistent_read]
481
498
  query_expression = build_conditions(options[:query_expression])
482
- # add sort_options to the query_expression
499
+ # add sort_options to the query_expression
483
500
  if options[:sort_option]
484
501
  sort_by, sort_order = sort_options(options[:sort_option])
485
502
  sort_query_expression = "['#{sort_by}' starts-with '']"
486
503
  sort_by_expression = " sort '#{sort_by}' #{sort_order}"
487
- # make query_expression to be a string (it may be null)
504
+ # make query_expression to be a string (it may be null)
488
505
  query_expression = query_expression.to_s
489
- # quote from Amazon:
490
- # The sort attribute must be present in at least one of the predicates of the query expression.
506
+ # quote from Amazon:
507
+ # The sort attribute must be present in at least one of the predicates of the query expression.
491
508
  if query_expression.blank?
492
509
  query_expression = sort_query_expression
493
510
  elsif !query_attributes(query_expression).include?(sort_by)
@@ -495,7 +512,7 @@ module SimpleRecord
495
512
  end
496
513
  query_expression += sort_by_expression
497
514
  end
498
- # request items
515
+ # request items
499
516
  query_result = self.connection.query(domain, query_expression, options[:max_number_of_items], @next_token, @consistent_read)
500
517
  @next_token = query_result[:next_token]
501
518
  items = query_result[:items].map do |name|
@@ -507,7 +524,7 @@ module SimpleRecord
507
524
  items
508
525
  end
509
526
 
510
- # reload a record unless it is nil
527
+ # reload a record unless it is nil
511
528
  def reload_if_exists(record) # :nodoc:
512
529
  record && record.reload
513
530
  end
@@ -533,21 +550,21 @@ module SimpleRecord
533
550
 
534
551
  def find_from_ids(args, options) # :nodoc:
535
552
  cond = []
536
- # detect amount of records requested
553
+ # detect amount of records requested
537
554
  bunch_of_records_requested = args.size > 1 || args.first.is_a?(Array)
538
- # flatten ids
555
+ # flatten ids
539
556
  args = args.to_a.flatten
540
557
  args.each { |id| cond << "'id'=#{self.connection.escape(id)}" }
541
558
  ids_cond = "[#{cond.join(' OR ')}]"
542
- # user defined :conditions to string (if it was defined)
559
+ # user defined :conditions to string (if it was defined)
543
560
  options[:conditions] = build_conditions(options[:conditions])
544
- # join ids condition and user defined conditions
561
+ # join ids condition and user defined conditions
545
562
  options[:conditions] = options[:conditions].blank? ? ids_cond : "#{options[:conditions]} intersection #{ids_cond}"
546
563
  result = find_every(options)
547
- # if one record was requested then return it
564
+ # if one record was requested then return it
548
565
  unless bunch_of_records_requested
549
566
  record = result.first
550
- # railse if nothing was found
567
+ # railse if nothing was found
551
568
  raise ActiveSdbError.new("Couldn't find #{name} with ID #{args}") unless record
552
569
  options[:auto_load] ? reload_all_records(record).first : record
553
570
  else
@@ -562,7 +579,7 @@ module SimpleRecord
562
579
  end
563
580
  end
564
581
 
565
- # find_by helpers
582
+ # find_by helpers
566
583
  def find_all_by_(format_str, args, options) # :nodoc:
567
584
  fields = format_str.to_s.sub(/^find_(all_)?by_/, '').split('_and_')
568
585
  conditions = fields.map { |field| "['#{field}'=?]" }.join(' intersection ')
@@ -575,7 +592,7 @@ module SimpleRecord
575
592
  find_all_by_(format_str, args, options).first
576
593
  end
577
594
 
578
- # Misc
595
+ # Misc
579
596
 
580
597
  def method_missing(method, *args) # :nodoc:
581
598
  if method.to_s[/^(find_all_by_|find_by_|select_all_by_|select_by_)/]
@@ -598,13 +615,13 @@ module SimpleRecord
598
615
  def build_select(options) # :nodoc:
599
616
  select = options[:select] || '*'
600
617
  select = options[:count] ? "count(*)" : select
601
- #puts 'select=' + select.to_s
618
+ #puts 'select=' + select.to_s
602
619
  from = options[:from] || domain
603
620
  condition_fields = parse_condition_fields(options[:conditions])
604
621
  conditions = options[:conditions] ? "#{build_conditions(options[:conditions])}" : ''
605
622
  order = options[:order] ? " ORDER BY #{options[:order]}" : ''
606
623
  limit = options[:limit] ? " LIMIT #{options[:limit]}" : ''
607
- # mix sort by argument (it must present in response)
624
+ # mix sort by argument (it must present in response)
608
625
  unless order.blank?
609
626
  sort_by, sort_order = sort_options(options[:order])
610
627
  if condition_fields.nil? || !condition_fields.include?(sort_by)
@@ -616,7 +633,7 @@ module SimpleRecord
616
633
 
617
634
  end
618
635
  conditions = conditions.blank? ? "" : " WHERE #{conditions}"
619
- # puts 'CONDITIONS=' + conditions
636
+ # puts 'CONDITIONS=' + conditions
620
637
  "SELECT #{select} FROM `#{from}`#{conditions}#{order}#{limit}"
621
638
  end
622
639
 
@@ -631,7 +648,7 @@ module SimpleRecord
631
648
  end
632
649
  end
633
650
 
634
- # This will currently return and's, or's and betweens. Doesn't hurt anything, but could remove.
651
+ # This will currently return and's, or's and betweens. Doesn't hurt anything, but could remove.
635
652
  def parse_condition_fields(conditions)
636
653
  return nil unless conditions && conditions.present? && conditions.is_a?(Array)
637
654
  rx = /\b(\w*)[\s|>=|<=|!=|=|>|<|like|between]/
@@ -644,71 +661,71 @@ module SimpleRecord
644
661
 
645
662
  public
646
663
 
647
- # instance attributes
664
+ # instance attributes
648
665
  attr_accessor :attributes
649
666
 
650
- # item name
667
+ # item name
651
668
  attr_accessor :id
652
669
 
653
- # Create new Item instance.
654
- # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
655
- #
656
- # item = Client.new('name' => 'Jon', 'toys' => ['girls', 'beer', 'pub'])
657
- # puts item.inspect #=> #<Client:0xb77a2698 @new_record=true, @attributes={"name"=>["Jon"], "toys"=>["girls", "beer", "pub"]}>
658
- # item.save #=> {"name"=>["Jon"], "id"=>"c03edb7e-e45c-11dc-bede-001bfc466dd7", "toys"=>["girls", "beer", "pub"]}
659
- # puts item.inspect #=> #<Client:0xb77a2698 @new_record=false, @attributes={"name"=>["Jon"], "id"=>"c03edb7e-e45c-11dc-bede-001bfc466dd7", "toys"=>["girls", "beer", "pub"]}>
660
- #
670
+ # Create new Item instance.
671
+ # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
672
+ #
673
+ # item = Client.new('name' => 'Jon', 'toys' => ['girls', 'beer', 'pub'])
674
+ # puts item.inspect #=> #<Client:0xb77a2698 @new_record=true, @attributes={"name"=>["Jon"], "toys"=>["girls", "beer", "pub"]}>
675
+ # item.save #=> {"name"=>["Jon"], "id"=>"c03edb7e-e45c-11dc-bede-001bfc466dd7", "toys"=>["girls", "beer", "pub"]}
676
+ # puts item.inspect #=> #<Client:0xb77a2698 @new_record=false, @attributes={"name"=>["Jon"], "id"=>"c03edb7e-e45c-11dc-bede-001bfc466dd7", "toys"=>["girls", "beer", "pub"]}>
677
+ #
661
678
  def initialize(attrs={})
662
679
  @attributes = uniq_values(attrs)
663
680
  @new_record = true
664
681
  end
665
682
 
666
- # This is to separate initialization from user vs coming from db (ie: find())
683
+ # This is to separate initialization from user vs coming from db (ie: find())
667
684
  def initialize_from_db(attrs={})
668
685
  initialize(attrs)
669
686
  end
670
687
 
671
- # Create and save new Item instance.
672
- # +Attributes+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
673
- #
674
- # item = Client.create('name' => 'Cat', 'toys' => ['Jons socks', 'mice', 'clew'])
675
- # puts item.inspect #=> #<Client:0xb77a0a78 @new_record=false, @attributes={"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "mice", "clew"]}>
676
- #
688
+ # Create and save new Item instance.
689
+ # +Attributes+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
690
+ #
691
+ # item = Client.create('name' => 'Cat', 'toys' => ['Jons socks', 'mice', 'clew'])
692
+ # puts item.inspect #=> #<Client:0xb77a0a78 @new_record=false, @attributes={"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "mice", "clew"]}>
693
+ #
677
694
  def self.create(attributes={})
678
695
  item = self.new(attributes)
679
696
  item.save
680
697
  item
681
698
  end
682
699
 
683
- # Returns an item id. Same as: item['id'] or item.attributes['id']
700
+ # Returns an item id. Same as: item['id'] or item.attributes['id']
684
701
  def id
685
702
  @attributes['id']
686
703
  end
687
704
 
688
- # Sets an item id.
705
+ # Sets an item id.
689
706
  def id=(id)
690
707
  @attributes['id'] = id.to_s
691
708
  end
692
709
 
693
- # Returns a hash of all the attributes.
694
- #
695
- # puts item.attributes.inspect #=> {"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "clew", "mice"]}
696
- #
710
+ # Returns a hash of all the attributes.
711
+ #
712
+ # puts item.attributes.inspect #=> {"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "clew", "mice"]}
713
+ #
697
714
  def attributes
698
715
  @attributes.dup
699
716
  end
700
717
 
701
- # Allows one to set all the attributes at once by passing in a hash with keys matching the attribute names.
702
- # if '+id+' attribute is not set in new attributes has then it being derived from old attributes.
703
- #
704
- # puts item.attributes.inspect #=> {"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "clew", "mice"]}
705
- # # set new attributes ('id' is missed)
706
- # item.attributes = { 'name'=>'Dog', 'toys'=>['bones','cats'] }
707
- # puts item.attributes.inspect #=> {"name"=>["Dog"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["bones", "cats"]}
708
- # # set new attributes ('id' is set)
709
- # item.attributes = { 'id' => 'blah-blah', 'name'=>'Birds', 'toys'=>['seeds','dogs tail'] }
710
- # puts item.attributes.inspect #=> {"name"=>["Birds"], "id"=>"blah-blah", "toys"=>["seeds", "dogs tail"]}
711
- #
718
+ # Allows one to set all the attributes at once by passing in a hash with keys matching the attribute names.
719
+ # if '+id+' attribute is not set in new attributes has then it being derived from old attributes.
720
+ #
721
+ # puts item.attributes.inspect #=> {"name"=>["Cat"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["Jons socks", "clew", "mice"]}
722
+ # # set new attributes ('id' is missed)
723
+ # item.attributes = { 'name'=>'Dog', 'toys'=>['bones','cats'] }
724
+ # puts item.attributes.inspect #=> {"name"=>["Dog"], "id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "toys"=>["bones", "cats"]}
725
+ # # set new attributes ('id' is set)
726
+ # item.attributes = { 'id' => 'blah-blah', 'name'=>'Birds', 'toys'=>['seeds','dogs tail'] }
727
+ # puts item.attributes.inspect #=> {"name"=>["Birds"], "id"=>"blah-blah", "toys"=>["seeds", "dogs tail"]}
728
+ #
712
729
  def attributes=(attrs)
713
730
  old_id = @attributes['id']
714
731
  @attributes = uniq_values(attrs)
@@ -720,36 +737,36 @@ module SimpleRecord
720
737
  self.class.connection
721
738
  end
722
739
 
723
- # Item domain name.
740
+ # Item domain name.
724
741
  def domain
725
742
  self.class.domain
726
743
  end
727
744
 
728
- # Returns the values of the attribute identified by +attribute+.
729
- #
730
- # puts item['Cat'].inspect #=> ["Jons socks", "clew", "mice"]
731
- #
745
+ # Returns the values of the attribute identified by +attribute+.
746
+ #
747
+ # puts item['Cat'].inspect #=> ["Jons socks", "clew", "mice"]
748
+ #
732
749
  def [](attribute)
733
750
  @attributes[attribute.to_s]
734
751
  end
735
752
 
736
- # Updates the attribute identified by +attribute+ with the specified +values+.
737
- #
738
- # puts item['Cat'].inspect #=> ["Jons socks", "clew", "mice"]
739
- # item['Cat'] = ["Whiskas", "chicken"]
740
- # puts item['Cat'].inspect #=> ["Whiskas", "chicken"]
741
- #
753
+ # Updates the attribute identified by +attribute+ with the specified +values+.
754
+ #
755
+ # puts item['Cat'].inspect #=> ["Jons socks", "clew", "mice"]
756
+ # item['Cat'] = ["Whiskas", "chicken"]
757
+ # puts item['Cat'].inspect #=> ["Whiskas", "chicken"]
758
+ #
742
759
  def []=(attribute, values)
743
760
  attribute = attribute.to_s
744
761
  @attributes[attribute] = attribute == 'id' ? values.to_s : values.is_a?(Array) ? values.uniq : [values]
745
762
 
746
763
  end
747
764
 
748
- # Reload attributes from SDB. Replaces in-memory attributes.
749
- #
750
- # item = Client.find_by_name('Cat') #=> #<Client:0xb77d0d40 @attributes={"id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7"}, @new_record=false>
751
- # item.reload #=> #<Client:0xb77d0d40 @attributes={"id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "name"=>["Cat"], "toys"=>["Jons socks", "clew", "mice"]}, @new_record=false>
752
- #
765
+ # Reload attributes from SDB. Replaces in-memory attributes.
766
+ #
767
+ # item = Client.find_by_name('Cat') #=> #<Client:0xb77d0d40 @attributes={"id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7"}, @new_record=false>
768
+ # item.reload #=> #<Client:0xb77d0d40 @attributes={"id"=>"2937601a-e45d-11dc-a75f-001bfc466dd7", "name"=>["Cat"], "toys"=>["Jons socks", "clew", "mice"]}, @new_record=false>
769
+ #
753
770
  def reload
754
771
  raise_on_id_absence
755
772
  old_id = id
@@ -763,16 +780,16 @@ module SimpleRecord
763
780
  @attributes
764
781
  end
765
782
 
766
- # Reload a set of attributes from SDB. Adds the loaded list to in-memory data.
767
- # +attrs_list+ is an array or comma separated list of attributes names.
768
- # Returns a hash of loaded attributes.
769
- #
770
- # This is not the best method to get a bunch of attributes because
771
- # a web service call is being performed for every attribute.
772
- #
773
- # item = Client.find_by_name('Cat')
774
- # item.reload_attributes('toys', 'name') #=> {"name"=>["Cat"], "toys"=>["Jons socks", "clew", "mice"]}
775
- #
783
+ # Reload a set of attributes from SDB. Adds the loaded list to in-memory data.
784
+ # +attrs_list+ is an array or comma separated list of attributes names.
785
+ # Returns a hash of loaded attributes.
786
+ #
787
+ # This is not the best method to get a bunch of attributes because
788
+ # a web service call is being performed for every attribute.
789
+ #
790
+ # item = Client.find_by_name('Cat')
791
+ # item.reload_attributes('toys', 'name') #=> {"name"=>["Cat"], "toys"=>["Jons socks", "clew", "mice"]}
792
+ #
776
793
  def reload_attributes(*attrs_list)
777
794
  raise_on_id_absence
778
795
  attrs_list = attrs_list.flatten.map { |attribute| attribute.to_s }
@@ -791,21 +808,21 @@ module SimpleRecord
791
808
  result
792
809
  end
793
810
 
794
- # Stores in-memory attributes to SDB.
795
- # Adds the attributes values to already stored at SDB.
796
- # Returns a hash of stored attributes.
797
- #
798
- # sandy = Client.new(:name => 'Sandy') #=> #<Client:0xb775a7a8 @attributes={"name"=>["Sandy"]}, @new_record=true>
799
- # sandy['toys'] = 'boys'
800
- # sandy.put
801
- # sandy['toys'] = 'patchwork'
802
- # sandy.put
803
- # sandy['toys'] = 'kids'
804
- # sandy.put
805
- # puts sandy.attributes.inspect #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
806
- # sandy.reload #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"]}
807
- #
808
- # compare to +save+ method
811
+ # Stores in-memory attributes to SDB.
812
+ # Adds the attributes values to already stored at SDB.
813
+ # Returns a hash of stored attributes.
814
+ #
815
+ # sandy = Client.new(:name => 'Sandy') #=> #<Client:0xb775a7a8 @attributes={"name"=>["Sandy"]}, @new_record=true>
816
+ # sandy['toys'] = 'boys'
817
+ # sandy.put
818
+ # sandy['toys'] = 'patchwork'
819
+ # sandy.put
820
+ # sandy['toys'] = 'kids'
821
+ # sandy.put
822
+ # puts sandy.attributes.inspect #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
823
+ # sandy.reload #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"]}
824
+ #
825
+ # compare to +save+ method
809
826
  def put
810
827
  @attributes = uniq_values(@attributes)
811
828
  prepare_for_update
@@ -817,19 +834,19 @@ module SimpleRecord
817
834
  @attributes
818
835
  end
819
836
 
820
- # Stores specified attributes.
821
- # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
822
- # Returns a hash of saved attributes.
823
- #
824
- # see to +put+ method
837
+ # Stores specified attributes.
838
+ # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
839
+ # Returns a hash of saved attributes.
840
+ #
841
+ # see to +put+ method
825
842
  def put_attributes(attrs)
826
843
  attrs = uniq_values(attrs)
827
844
  prepare_for_update
828
- # if 'id' is present in attrs hash:
829
- # replace internal 'id' attribute and remove it from the attributes to be sent
845
+ # if 'id' is present in attrs hash:
846
+ # replace internal 'id' attribute and remove it from the attributes to be sent
830
847
  @attributes['id'] = attrs['id'] unless attrs['id'].blank?
831
848
  attrs.delete('id')
832
- # add new values to all attributes from list
849
+ # add new values to all attributes from list
833
850
  connection.put_attributes(domain, id, attrs) unless attrs.blank?
834
851
  connection.put_attributes(domain, id, {'id' => id}, :replace)
835
852
  attrs.each do |attribute, values|
@@ -841,42 +858,42 @@ module SimpleRecord
841
858
  attributes
842
859
  end
843
860
 
844
- # Store in-memory attributes to SDB.
845
- # Replaces the attributes values already stored at SDB by in-memory data.
846
- # Returns a hash of stored attributes.
847
- #
848
- # sandy = Client.new(:name => 'Sandy') #=> #<Client:0xb775a7a8 @attributes={"name"=>["Sandy"]}, @new_record=true>
849
- # sandy['toys'] = 'boys'
850
- # sandy.save
851
- # sandy['toys'] = 'patchwork'
852
- # sandy.save
853
- # sandy['toys'] = 'kids'
854
- # sandy.save
855
- # puts sandy.attributes.inspect #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
856
- # sandy.reload #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
857
- #
858
- # Options:
859
- # - :except => Array of attributes to NOT save
860
- #
861
- # compare to +put+ method
861
+ # Store in-memory attributes to SDB.
862
+ # Replaces the attributes values already stored at SDB by in-memory data.
863
+ # Returns a hash of stored attributes.
864
+ #
865
+ # sandy = Client.new(:name => 'Sandy') #=> #<Client:0xb775a7a8 @attributes={"name"=>["Sandy"]}, @new_record=true>
866
+ # sandy['toys'] = 'boys'
867
+ # sandy.save
868
+ # sandy['toys'] = 'patchwork'
869
+ # sandy.save
870
+ # sandy['toys'] = 'kids'
871
+ # sandy.save
872
+ # puts sandy.attributes.inspect #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
873
+ # sandy.reload #=> {"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["kids"]}
874
+ #
875
+ # Options:
876
+ # - :except => Array of attributes to NOT save
877
+ #
878
+ # compare to +put+ method
862
879
  def save2(options={})
863
880
  options[:create_domain] = true if options[:create_domain].nil?
864
881
  pre_save2
865
882
  atts_to_save = @attributes.dup
866
- #puts 'atts_to_save=' + atts_to_save.inspect
867
- #options = params.first.is_a?(Hash) ? params.pop : {}
883
+ #puts 'atts_to_save=' + atts_to_save.inspect
884
+ #options = params.first.is_a?(Hash) ? params.pop : {}
868
885
  if options[:except]
869
886
  options[:except].each do |e|
870
887
  atts_to_save.delete(e).inspect
871
888
  end
872
889
  end
873
890
  if options[:dirty] # Only used in simple_record right now
874
- # only save if the attribute is dirty
891
+ # only save if the attribute is dirty
875
892
  dirty_atts = options[:dirty_atts]
876
893
  atts_to_save.delete_if { |key, value| !dirty_atts.has_key?(key) }
877
894
  end
878
895
  dom = options[:domain] || domain
879
- #puts 'atts_to_save2=' + atts_to_save.inspect
896
+ #puts 'atts_to_save2=' + atts_to_save.inspect
880
897
  connection.put_attributes(dom, id, atts_to_save, :replace, options)
881
898
  apres_save2
882
899
  @attributes
@@ -891,16 +908,16 @@ module SimpleRecord
891
908
  mark_as_old
892
909
  end
893
910
 
894
- # Replaces the attributes at SDB by the given values.
895
- # +Attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
896
- # The other in-memory attributes are not being saved.
897
- # Returns a hash of stored attributes.
898
- #
899
- # see +save+ method
911
+ # Replaces the attributes at SDB by the given values.
912
+ # +Attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
913
+ # The other in-memory attributes are not being saved.
914
+ # Returns a hash of stored attributes.
915
+ #
916
+ # see +save+ method
900
917
  def save_attributes(attrs)
901
918
  prepare_for_update
902
919
  attrs = uniq_values(attrs)
903
- # if 'id' is present in attrs hash then replace internal 'id' attribute
920
+ # if 'id' is present in attrs hash then replace internal 'id' attribute
904
921
  unless attrs['id'].blank?
905
922
  @attributes['id'] = attrs['id']
906
923
  else
@@ -912,15 +929,15 @@ module SimpleRecord
912
929
  attrs
913
930
  end
914
931
 
915
- # Remove specified values from corresponding attributes.
916
- # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
917
- #
918
- # sandy = Client.find_by_name 'Sandy'
919
- # sandy.reload
920
- # puts sandy.inspect #=> #<Client:0xb77b48fc @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"]}>
921
- # puts sandy.delete_values('toys' => 'patchwork') #=> { 'toys' => ['patchwork'] }
922
- # puts sandy.inspect #=> #<Client:0xb77b48fc @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids"]}>
923
- #
932
+ # Remove specified values from corresponding attributes.
933
+ # +attrs+ is a hash: { attribute1 => values1, ..., attributeN => valuesN }.
934
+ #
935
+ # sandy = Client.find_by_name 'Sandy'
936
+ # sandy.reload
937
+ # puts sandy.inspect #=> #<Client:0xb77b48fc @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"]}>
938
+ # puts sandy.delete_values('toys' => 'patchwork') #=> { 'toys' => ['patchwork'] }
939
+ # puts sandy.inspect #=> #<Client:0xb77b48fc @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids"]}>
940
+ #
924
941
  def delete_values(attrs)
925
942
  raise_on_id_absence
926
943
  attrs = uniq_values(attrs)
@@ -940,16 +957,16 @@ module SimpleRecord
940
957
  attrs
941
958
  end
942
959
 
943
- # Removes specified attributes from the item.
944
- # +attrs_list+ is an array or comma separated list of attributes names.
945
- # Returns the list of deleted attributes.
946
- #
947
- # sandy = Client.find_by_name 'Sandy'
948
- # sandy.reload
949
- # puts sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"}>
950
- # puts sandy.delete_attributes('toys') #=> ['toys']
951
- # puts sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7"}>
952
- #
960
+ # Removes specified attributes from the item.
961
+ # +attrs_list+ is an array or comma separated list of attributes names.
962
+ # Returns the list of deleted attributes.
963
+ #
964
+ # sandy = Client.find_by_name 'Sandy'
965
+ # sandy.reload
966
+ # puts sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"}>
967
+ # puts sandy.delete_attributes('toys') #=> ['toys']
968
+ # puts sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7"}>
969
+ #
953
970
  def delete_attributes(*attrs_list)
954
971
  raise_on_id_absence
955
972
  attrs_list = attrs_list.flatten.map { |attribute| attribute.to_s }
@@ -961,21 +978,21 @@ module SimpleRecord
961
978
  attrs_list
962
979
  end
963
980
 
964
- # Delete the Item entirely from SDB.
965
- #
966
- # sandy = Client.find_by_name 'Sandy'
967
- # sandy.reload
968
- # sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"}>
969
- # puts sandy.delete
970
- # sandy.reload
971
- # puts sandy.inspect #=> #<Client:0xb7761d28 @attributes={}, @new_record=false>
972
- #
981
+ # Delete the Item entirely from SDB.
982
+ #
983
+ # sandy = Client.find_by_name 'Sandy'
984
+ # sandy.reload
985
+ # sandy.inspect #=> #<Client:0xb7761d28 @new_record=false, @attributes={"name"=>["Sandy"], "id"=>"b2832ce2-e461-11dc-b13c-001bfc466dd7", "toys"=>["boys", "kids", "patchwork"}>
986
+ # puts sandy.delete
987
+ # sandy.reload
988
+ # puts sandy.inspect #=> #<Client:0xb7761d28 @attributes={}, @new_record=false>
989
+ #
973
990
  def delete(options={})
974
991
  raise_on_id_absence
975
992
  connection.delete_attributes(options[:domain] || domain, id)
976
993
  end
977
994
 
978
- # Returns true if this object hasn�t been saved yet.
995
+ # Returns true if this object hasn�t been saved yet.
979
996
  def new_record?
980
997
  @new_record
981
998
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: simple_record
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 2.1.12
5
+ version: 2.2.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Travis Reeder
@@ -12,7 +12,7 @@ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
14
 
15
- date: 2011-07-06 00:00:00 Z
15
+ date: 2011-07-08 00:00:00 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: aws