sdb_dal 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,368 +1,419 @@
1
1
  module SdbDal
2
- $KCODE = 'u'
3
- require "aws_sdb"
4
- require "sdb_dal/storage.rb"
5
- require 'ya2yaml'
6
- require File.dirname(__FILE__) +"/memory_repository.rb"
7
- require File.dirname(__FILE__) +"/domain_object_cache_item.rb"
8
- class Repository
9
- attr_accessor :use_cache
10
- attr_accessor :storage
11
- def initialize(
12
- sdb_domain_prefix,#MyDevPayApp
13
- clob_bucket,
14
- aws_key_id,
15
- aws_secret_key,
16
- memcache_servers = nil ,
17
- a_storage=nil,
18
- append_table_to_domain=true,
19
- options={}
2
+ $KCODE = 'u'
3
+ require "aws_sdb"
4
+ require "sdb_dal/storage.rb"
5
+ require 'ya2yaml'
6
+ require File.dirname(__FILE__) +"/memory_repository.rb"
7
+ require File.dirname(__FILE__) +"/domain_object_cache_item.rb"
8
+
9
+ require File.dirname(__FILE__) +"/sdb_monkey_patch.rb"
10
+ class Repository
11
+ attr_accessor :use_cache
12
+ attr_accessor :storage
13
+ def initialize(
14
+ sdb_domain_prefix,#MyDevPayApp
15
+ clob_bucket,
16
+ aws_key_id,
17
+ aws_secret_key,
18
+ memcache_servers = nil ,
19
+ a_storage=nil,
20
+ append_table_to_domain=true,
21
+ options={}
20
22
 
21
- )
23
+ )
22
24
 
23
- @use_cache=true
24
- @storage=a_storage
25
- @storage||=Storage.new(aws_key_id,aws_secret_key,memcache_servers)
26
- @sdb_domain_prefix = sdb_domain_prefix
27
- @clob_bucket = clob_bucket
28
- @memcache_servers = memcache_servers
29
- @aws_key_id = aws_key_id
30
- @aws_secret_key = aws_secret_key
31
- @append_table_to_domain=append_table_to_domain
32
- @logger = options[:logger]
33
- if !@logger
34
- @logger = Logger.new(STDOUT)
35
- @logger.level = Logger::ERROR
36
- end
25
+ @use_cache=true
26
+ @storage=a_storage
27
+ @storage||=Storage.new(aws_key_id,aws_secret_key,memcache_servers)
28
+ @sdb_domain_prefix = sdb_domain_prefix
29
+ @clob_bucket = clob_bucket
30
+ @memcache_servers = memcache_servers
31
+ @aws_key_id = aws_key_id
32
+ @aws_secret_key = aws_secret_key
33
+ @append_table_to_domain=append_table_to_domain
34
+ @logger = options[:logger]
35
+ if !@logger
36
+ @logger = Logger.new(STDOUT)
37
+ @logger.level = Logger::ERROR
38
+ end
37
39
 
38
- @sdb=AwsSdb::Service.new(:access_key_id=>aws_key_id,:secret_access_key=>aws_secret_key,:url=>"http://sdb.amazonaws.com",:logger=>@logger)
39
- @session_cache=MemoryRepository.new
40
+ @sdb=AwsSdb::Service.new(:access_key_id=>aws_key_id,:secret_access_key=>aws_secret_key,:url=>"http://sdb.amazonaws.com",:logger=>@logger)
41
+ @session_cache=MemoryRepository.new
40
42
 
41
- #create_domain()
42
- end
43
+ # #create_domain()
44
+ end
43
45
 
44
- def clear_session_cache
45
- @session_cache.clear
46
- end
47
- def make_clob_key(table_name,primary_key,clob_name)
48
- return "clobs/#{table_name}/#{CGI.escape(primary_key.to_s)}/#{clob_name}"
49
- end
50
- def make_cache_key(table_name,primary_key)
51
- return "cached_objects/#{table_name}/#{CGI.escape(primary_key.to_s)}"
52
- end
53
- def get_clob(table_name,primary_key,clob_name)
54
- return @storage.get(@clob_bucket,make_clob_key(table_name,primary_key,clob_name))
55
-
56
- end
57
- def save(table_name, primary_key, attributes)
58
- @session_cache.save(table_name,primary_key,attributes)
59
- formatted_attributes={}
60
- attributes.each do |description,value|
61
- if value || description.value_type==:boolean
62
- if description.is_clob
63
- @storage.put(
64
- @clob_bucket,
65
- make_clob_key(table_name,primary_key,description.name),
66
- value.to_s,
67
- {})
68
- else
69
- formatted_attributes[description.name]=description.format_for_sdb(value)
46
+ def clear_session_cache
47
+ @session_cache.clear
48
+ end
49
+ def flatten_key(key)
50
+ if key.is_a?( Array)
51
+ flattened_key=""
52
+ key.each do |key_part|
53
+ flattened_key<<CGI.escape(key_part.to_s)+"/"
70
54
  end
55
+ return flattened_key[0..-2]
56
+ else
57
+ return CGI.escape(key.to_s)
71
58
  end
72
59
  end
60
+ def make_cache_key(table_name,primary_key)
61
+
62
+ primary_key=flatten_key(primary_key)
63
+ primary_key="#{table_name}/#{primary_key}" unless @append_table_to_domain
64
+ return primary_key
65
+ end
66
+ def make_clob_key(table_name,primary_key,clob_name)
67
+ return "clobs/#{table_name}/#{flatten_key(primary_key)}/#{clob_name}"
68
+ end
69
+ def get_clob(table_name,primary_key,clob_name)
70
+ return @storage.get(@clob_bucket,make_clob_key(table_name,primary_key,clob_name))
73
71
 
74
- put_attributes(table_name,primary_key, formatted_attributes )
75
- # put_into_cache(table_name, primary_key, formatted_attributes)
72
+ end
73
+ def save(table_name, primary_key, attributes,index_descriptions)
74
+ @session_cache.save(table_name,primary_key,attributes,index_descriptions)
75
+ formatted_attributes={}
76
+ attributes.each do |description,value|
77
+ if value || description.value_type==:boolean
78
+ if description.is_clob
79
+ @storage.put(
80
+ @clob_bucket,
81
+ make_clob_key(table_name,primary_key,description.name),
82
+ value.to_s,
83
+ {})
84
+ else
85
+ formatted_attributes[description.name]=description.format_for_sdb(value)
86
+ end
87
+ end
88
+ end
89
+ if !@append_table_to_domain
90
+ formatted_attributes['metadata%%table_name'] = table_name
91
+
92
+ end
93
+ put_attributes(table_name,primary_key, formatted_attributes )
94
+ # put_into_cache(table_name, primary_key, formatted_attributes)
76
95
 
77
- end
78
- # def put_into_cache(table_name, primary_key, formatted_attributes)
79
- # if @use_cache
80
- # cacheItem=DomainObjectCacheItem.new(table_name, primary_key, formatted_attributes)
81
- #
82
- # yaml=cacheItem.ya2yaml(:syck_compatible => true)
83
- #
84
- # @storage.put(
85
- # @clob_bucket,
86
- # make_cache_key(table_name,primary_key),
87
- # yaml ,
88
- # {})
89
- # end
90
- # end
91
- def create_domain
92
- 20.times do |i|
93
- begin
94
- @sdb.create_domain(@sdb_domain)
95
- return
96
+ end
97
+ # def put_into_cache(table_name, primary_key, formatted_attributes)
98
+ # if @use_cache
99
+ # cacheItem=DomainObjectCacheItem.new(table_name, primary_key, formatted_attributes)
100
+ #
101
+ # yaml=cacheItem.ya2yaml(:syck_compatible => true)
102
+ #
103
+ # @storage.put(
104
+ # @clob_bucket,
105
+ # make_cache_key(table_name,primary_key),
106
+ # yaml ,
107
+ # {})
108
+ # end
109
+ # end
110
+ def create_domain
111
+ 20.times do |i|
112
+ begin
113
+ @sdb.create_domain(@sdb_domain_prefix)
114
+ return
96
115
 
97
- rescue => e
98
- s= "#{e.message}\n#{e.backtrace}"
99
- @logger.warn(s) if @logger
100
- sleep(i*i)
116
+ rescue => e
117
+ s= "#{e.message}\n#{e.backtrace}"
118
+ @logger.warn(s) if @logger
119
+ sleep(i*i)
101
120
 
121
+ end
102
122
  end
103
- end
104
123
 
105
- end
106
- def put_attributes(table_name,primary_key, formatted_attributes,options={})
107
- 20.times do |i|
108
- begin
109
- @sdb.put_attributes(make_domain_name(table_name),primary_key.to_s, formatted_attributes, true )
110
- return
124
+ end
125
+ def put_attributes(table_name,primary_key, formatted_attributes,options={})
126
+ 20.times do |i|
127
+ begin
128
+ @sdb.put_attributes(make_domain_name(table_name),make_cache_key(table_name,primary_key) , formatted_attributes, true )
129
+ return
111
130
 
112
- rescue Exception => e
113
- s= "#{e.message}\n#{e.backtrace}"
114
- @logger.warn(s) if @logger
131
+ rescue Exception => e
132
+ s= "#{e.message}\n#{e.backtrace}"
133
+ @logger.warn(s) if @logger
115
134
 
116
- sleep(i*i)
135
+ sleep(i*i)
136
+ end
117
137
  end
118
- end
119
138
 
120
- end
121
- def extend_query(query,new_clause)
122
- if query.length>0
123
- query << " intersection "
124
139
  end
125
-
126
- query << new_clause
127
- end
128
- def escape_quotes(value)
129
- value.gsub( "'","\\'")
130
- end
131
- def query_ids(table_name,attribute_descriptions,options={})
132
-
133
- if options.has_key?(:limit) and !options.has_key?(:order_by)
134
- session_cache_result=@session_cache.query_ids(table_name,attribute_descriptions,options)
135
- if options[:limit]==session_cache_result.length
136
- return session_cache_result
140
+ def extend_query(query,new_clause)
141
+ if query.length>0
142
+ query << " intersection "
137
143
  end
144
+
145
+ query << new_clause
138
146
  end
139
- query=""
147
+ def escape_quotes(value)
148
+ return nil unless value
149
+ value.gsub( "'","\\'")
150
+ end
151
+ def build_query(table_name,attribute_descriptions,options={})
152
+
140
153
 
141
- if options
142
- if options.has_key?(:query)
143
- extend_query(query,"["+options[:query]+"]")
154
+ query=""
155
+ params=nil
156
+ params=options[:params] if options.has_key?(:params)
157
+ if options.has_key?(:map)
158
+ params||={}
159
+ keys=options[:map][:keys]
160
+ values=options[:map][:values]
161
+ (0..keys.length-1).each do |i|
162
+ key=keys[i]
163
+ value=values[i]
164
+ params[key]=value
165
+ end
166
+
144
167
  end
145
- if options.has_key?(:params)
146
- options[:params].each do |key,value|
147
- got_something=false
148
- if attribute_descriptions.has_key?(key)
149
- if value==:NOT_NULL
150
- got_something=true
151
- extend_query(query," ['#{key}' starts-with '']")
152
- end
153
- if value==:NULL
154
- got_something=true
155
- extend_query(query," not ['#{key}' starts-with '']")
156
- end
157
- if value.respond_to?(:less_than) && value.less_than
158
- got_something=true
159
- extend_query(query," ['#{key}' < '#{escape_quotes(attribute_descriptions[key].format_for_sdb_single( value.less_than))}']")
160
- end
161
- if value.respond_to?(:greater_than) && value.greater_than
162
- got_something=true
163
- extend_query(query," ['#{key}' > '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single( value.greater_than))}']")
164
- end
165
- if value.respond_to?(:less_than_or_equal_to) && value.less_than_or_equal_to
166
- got_something=true
167
- extend_query(query,"['#{key}' <= '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single( value.less_than_or_equal_to))}']")
168
- end
169
- if value.respond_to?(:greater_than_or_equal_to) && value.greater_than_or_equal_to
170
- got_something=true
171
- extend_query(query," ['#{key}' >= '#{escape_quotes(attribute_descriptions[key].format_for_sdb_single( value.greater_than_or_equal_to))}']")
172
- end
173
- if value==false
174
- got_something=true
175
- extend_query(query," ['#{key}' != 'true' ]")
176
- end
177
- if !got_something
178
- extend_query(query," ['#{key}' = '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single(value))}']")
168
+ if !@append_table_to_domain
169
+ extend_query(query," ['metadata%%table_name' = '#{table_name}']")
170
+
171
+ end
172
+ if options
173
+ if options.has_key?(:query)
174
+ extend_query(query,"["+options[:query]+"]")
175
+ end
176
+ if params
177
+ params.each do |key,value|
178
+ got_something=false
179
+ if attribute_descriptions.has_key?(key)
180
+ if value==:NOT_NULL
181
+ got_something=true
182
+ extend_query(query," ['#{key}' starts-with '']")
183
+ end
184
+ if value==:NULL
185
+ got_something=true
186
+ extend_query(query," not ['#{key}' starts-with '']")
187
+ end
188
+ if value.respond_to?(:less_than) && value.less_than
189
+ got_something=true
190
+ extend_query(query," ['#{key}' < '#{escape_quotes(attribute_descriptions[key].format_for_sdb_single( value.less_than))}']")
191
+ end
192
+ if value.respond_to?(:greater_than) && value.greater_than
193
+ got_something=true
194
+ extend_query(query," ['#{key}' > '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single( value.greater_than))}']")
195
+ end
196
+ if value.respond_to?(:less_than_or_equal_to) && value.less_than_or_equal_to
197
+ got_something=true
198
+ extend_query(query,"['#{key}' <= '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single( value.less_than_or_equal_to))}']")
199
+ end
200
+ if value.respond_to?(:greater_than_or_equal_to) && value.greater_than_or_equal_to
201
+ got_something=true
202
+ extend_query(query," ['#{key}' >= '#{escape_quotes(attribute_descriptions[key].format_for_sdb_single( value.greater_than_or_equal_to))}']")
203
+ end
204
+ if value==false
205
+ got_something=true
206
+ extend_query(query," ['#{key}' != 'true' ]")
207
+ end
208
+ if !got_something
209
+ extend_query(query," ['#{key}' = '#{escape_quotes( attribute_descriptions[key].format_for_sdb_single(value))}']")
210
+ end
211
+ else
212
+ # #it must be formatted already. likely an index
213
+ extend_query(query,"['#{key}' = '#{escape_quotes value}']")
179
214
  end
180
- else
181
- #it must be formatted already. likely an index
182
- extend_query(query,"['#{key}' = '#{escape_quotes value}']")
183
215
  end
184
216
  end
185
- end
186
- if options.has_key?(:order_by) && options[:order_by]
187
- clause=" ['#{options[:order_by]}' starts-with ''] sort '#{options[:order_by]}' "
188
- if options.has_key?(:order) and options[:order]==:descending
189
- clause<<" desc "
190
- end
191
- extend_query(query,clause)
192
- end
193
- if options.has_key?(:conditions)
194
- options[:conditions].each do |condition|
217
+ if options.has_key?(:order_by) && options[:order_by]
218
+ clause=" ['#{options[:order_by]}' starts-with ''] sort '#{options[:order_by]}' "
219
+ if options.has_key?(:order) and options[:order]==:descending
220
+ clause<<" desc "
221
+ end
222
+ extend_query(query,clause)
223
+ end
224
+ if options.has_key?(:conditions)
225
+ options[:conditions].each do |condition|
195
226
 
196
- extend_query(query," [ "+condition.to_sdb_query()+"]")
227
+ extend_query(query," [ "+condition.to_sdb_query()+"]")
228
+ end
197
229
  end
198
- end
199
230
 
231
+ end
232
+ return query
233
+
200
234
  end
201
-
202
- max=250
203
- if options[:limit]
204
- max=options[:limit].to_i
205
-
206
- end
207
- page_size=max>250?250:max
208
- sdb_results,token=sdb_query(table_name,query,page_size)
209
-
210
- while !(token.nil? || token.empty? || sdb_results.length>=max)
211
- page_size=max- sdb_results.length
212
- page_size=page_size>250?250:page_size
213
- partial_results,token=sdb_query(table_name,query,page_size,token)
214
- sdb_results.concat( partial_results)
215
- end
216
- sdb_results
217
-
218
-
219
- return sdb_results
220
- end
221
- def query(table_name,attribute_descriptions,options)
222
- ids=query_ids(table_name,attribute_descriptions,options)
223
- result=[]
224
- ids.each do |primary_key|
225
- if primary_key
226
- (0..4).each do |try_count|
227
- this_one=find_one(table_name,primary_key,attribute_descriptions)
228
- if this_one
229
- result<<this_one
230
- break
231
- else
232
- #sdb query just told us it was there so keep trying
233
- sleep(try_count*try_count)
234
- end
235
+ # #result will be an array of hashes. each hash is a set of attributes
236
+ def query(table_name,attribute_descriptions,options)
237
+ if options.has_key?(:limit) and !options.has_key?(:order_by)
238
+ session_cache_result=@session_cache.query(table_name,attribute_descriptions,options)
239
+ if options[:limit]==session_cache_result.length
240
+ return session_cache_result
235
241
  end
236
- else
237
- @logger.error("blank primary key")
238
242
  end
239
- end
240
- if options and options[:order_by]
241
- result.sort! do |a,b|
242
- a_value=a[options[:order_by]]
243
- b_value=b[options[:order_by]]
244
- if options[:order] && options[:order]!=:ascending
245
- if !a_value
246
- 1
247
- else
248
- if b_value
249
- b_value <=> a_value
243
+
244
+ the_query=build_query(table_name, attribute_descriptions, options)
245
+ max=250
246
+ if options[:limit]
247
+ max=options[:limit].to_i
248
+
249
+ end
250
+ page_size=max>250?250:max
251
+ sdb_result,token=sdb_query_with_attributes(table_name,the_query,page_size)
252
+
253
+ while !(token.nil? || token.empty? || sdb_result.length>=max)
254
+ page_size=max- sdb_result.length
255
+ page_size=page_size>250?250:page_size
256
+ partial_results,token=sdb_query_with_attributes(table_name,the_query,page_size,token)
257
+
258
+ sdb_result.merge!( partial_results)
259
+ end
260
+ result=[]
261
+ sdb_result.each{|primary_key,sdb_row|
262
+ attributes =parse_attributes(attribute_descriptions,sdb_row)
263
+ if attributes
264
+ # #attributes[:primary_key]=primary_key
265
+
266
+ result<<attributes
267
+ end
268
+ }
269
+ if options and options[:order_by]
270
+ result.sort! do |a,b|
271
+ a_value=a[options[:order_by]]
272
+ b_value=b[options[:order_by]]
273
+ if options[:order] && options[:order]!=:ascending
274
+ if !a_value
275
+ 1
250
276
  else
251
- -1
277
+ if b_value
278
+ b_value <=> a_value
279
+ else
280
+ -1
281
+ end
252
282
  end
253
- end
254
- else
255
- if !b_value
256
- 1
257
283
  else
258
- if a_value
259
- a_value <=> b_value
284
+ if !b_value
285
+ 1
260
286
  else
261
- -1
287
+ if a_value
288
+ a_value <=> b_value
289
+ else
290
+ -1
291
+ end
262
292
  end
263
293
  end
264
294
  end
265
295
  end
296
+ if options[:limit] && result.length>options[:limit]
297
+ result=result[0..(options[:limit]-1)]
298
+ end
299
+ return result
266
300
  end
267
- if options[:limit] && result.length>options[:limit]
268
- result=result[0..(options[:limit]-1)]
301
+ def find_one(table_name, primary_key,attribute_descriptions)#, non_clob_attribute_names, clob_attribute_names)
302
+ session_cache_result=@session_cache.find_one(table_name, make_cache_key(table_name,primary_key),attribute_descriptions)
303
+ return session_cache_result if session_cache_result
304
+ # if @use_cache
305
+ # yaml=@storage.get(@clob_bucket,make_cache_key(table_name,primary_key))
306
+ # if yaml
307
+ # result=YAML::load( yaml)
308
+ # if result.respond_to?(:non_clob_attributes) && result.non_clob_attributes!=nil
309
+ # return parse_attributes(attribute_descriptions, result.non_clob_attributes)
310
+ # end
311
+ #
312
+ # end
313
+ # end
314
+ attributes=parse_attributes(attribute_descriptions,sdb_get_attributes(table_name,primary_key))
315
+ if attributes
316
+ # #attributes[:primary_key]=primary_key #put_into_cache(table_name,
317
+ # primary_key, attributes)
318
+ end
319
+
320
+ attributes
269
321
  end
270
- return result
271
- end
272
- def find_one(table_name, primary_key,attribute_descriptions)#, non_clob_attribute_names, clob_attribute_names)
273
- session_cache_result=@session_cache.find_one(table_name, primary_key,attribute_descriptions)
274
- return session_cache_result if session_cache_result
275
- # if @use_cache
276
- # yaml=@storage.get(@clob_bucket,make_cache_key(table_name,primary_key))
277
- # if yaml
278
- # result=YAML::load( yaml)
279
- # if result.respond_to?(:non_clob_attributes) && result.non_clob_attributes!=nil
280
- # return parse_attributes(attribute_descriptions, result.non_clob_attributes)
281
- # end
282
- #
283
- # end
284
- # end
285
- attributes=parse_attributes(attribute_descriptions,sdb_get_attributes(table_name,primary_key))
286
- if attributes
287
- attributes[:primary_key]=primary_key
288
- #put_into_cache(table_name, primary_key, attributes)
322
+ def make_domain_name(table_name)
323
+ if @append_table_to_domain
324
+ @sdb_domain_prefix+"_"+table_name
325
+ else
326
+ @sdb_domain_prefix
327
+ end
289
328
  end
290
-
291
- attributes
292
- end
293
- def make_domain_name(table_name)
294
- if @append_table_to_domain
295
- @sdb_domain_prefix+"_"+table_name
296
- else
297
- @sdb_domain_prefix
298
- end
299
- end
300
- def sdb_get_attributes(table_name,primary_key)
329
+ def sdb_get_attributes(table_name,primary_key)
301
330
 
302
- @logger.debug( "SDB get_attributes #{table_name} : #{primary_key}") if @logger
331
+ @logger.debug( "SDB get_attributes #{table_name} : #{primary_key}") if @logger
303
332
 
304
- 20.times do |i|
305
- begin
306
- return @sdb.get_attributes(make_domain_name(table_name), primary_key)
307
- rescue Exception => e
308
- s= "#{e.message}\n#{e.backtrace}"
309
- @logger.warn(s) if @logger
333
+ 20.times do |i|
334
+ begin
335
+ return @sdb.get_attributes(make_domain_name(table_name), make_cache_key(table_name,primary_key))
336
+ rescue Exception => e
337
+ s= "#{e.message}\n#{e.backtrace}"
338
+ @logger.warn(s) if @logger
310
339
 
311
- sleep(i*i)
312
- ensure
340
+ sleep(i*i)
341
+ ensure
313
342
 
343
+ end
314
344
  end
315
- end
316
345
 
317
- end
318
- def sdb_query(table_name,query,max,token=nil)
346
+ end
347
+ def sdb_query(table_name,query,max,token=nil)
319
348
 
320
349
  @logger.debug( "SDB query:#{table_name}(#{max}) : #{query} #{token}" ) if @logger
321
- puts "#{table_name} #{query} (#{max}) #{token}"
322
- 20.times do |i|
323
- begin
324
- return @sdb.query(make_domain_name(table_name),query,max,token)
350
+ # puts "#{table_name} #{query} (#{max}) #{token}"
351
+ 20.times do |i|
352
+ begin
353
+ return @sdb.query(make_domain_name(table_name),query,max,token)
325
354
 
326
- rescue Exception => e
327
- s= "#{e.message}\n#{e.backtrace}"
328
- @logger.error(s) if @logger
355
+ rescue Exception => e
356
+ s= "#{e.message}\n#{e.backtrace}"
357
+ @logger.error(s) if @logger
329
358
 
330
- sleep(i*i)
331
- ensure
359
+ sleep(i*i)
360
+ ensure
332
361
 
362
+ end
333
363
  end
334
- end
335
-
336
- end
337
364
 
338
- def parse_attributes(attribute_descriptions,attributes)
339
- if !attributes || attributes.length==0
340
- return nil
341
365
  end
342
- parsed_attributes={}
343
- attribute_descriptions.each do |attribute_name,attribute_description|
344
- value=attributes[attribute_name.to_sym]
345
- if !value
346
- value=attributes[attribute_name]
366
+ def sdb_query_with_attributes(table_name,query,max,token=nil)
367
+
368
+ @logger.debug( "SDB query:#{table_name}(#{max}) : #{query} #{token}" ) if @logger
369
+ puts "#{table_name} #{query} (#{max}) #{token}"
370
+ 20.times do |i|
371
+ begin
372
+ return @sdb.query_with_attributes(make_domain_name(table_name),query,max,token)
373
+
374
+ rescue Exception => e
375
+ s= "#{e.message}\n#{e.backtrace}"
376
+ @logger.error(s) if @logger
377
+
378
+ sleep(i*i)
379
+ ensure
380
+
381
+ end
347
382
  end
348
- #sdb attributes are often array of one
349
- if !attribute_description.is_collection && value.respond_to?(:flatten) && value.length==1
350
- value=value[0]
351
- end
352
- parsed_attributes[attribute_name.to_sym]=attribute_description.parse_from_sdb(value)
383
+
353
384
  end
354
- parsed_attributes
355
- end
356
- def destroy(table_name, primary_key)
357
- @sdb.delete_attributes(make_domain_name(table_name), primary_key)
358
- if @use_cache
359
- @storage.delete(@clob_bucket,make_cache_key(table_name,primary_key))
385
+ def parse_attributes(attribute_descriptions,attributes)
386
+ if !attributes || attributes.length==0
387
+ return nil
388
+ end
389
+ parsed_attributes={}
390
+ attribute_descriptions.each do |attribute_name,attribute_description|
391
+ value=attributes[attribute_name.to_sym]
392
+ if !value
393
+ value=attributes[attribute_name]
394
+ end
395
+ #sdb attributes are often array of one
396
+ if !attribute_description.is_collection && value.respond_to?(:flatten) && value.length==1
397
+ value=value[0]
398
+ end
399
+ parsed_attributes[attribute_name.to_sym]=attribute_description.parse_from_sdb(value)
400
+ end
401
+ parsed_attributes
360
402
  end
361
- end
362
- #parse date in yyyy-mm-dd format
403
+ def destroy(table_name, primary_key)
404
+ @sdb.delete_attributes(make_domain_name(table_name),make_cache_key(table_name, primary_key) )
405
+ # if @use_cache
406
+ # @storage.delete(@clob_bucket,make_cache_key(table_name,primary_key))
407
+ # end
408
+ end
409
+ #parse date in yyyy-mm-dd format
363
410
 
364
- def pause
365
- sleep(2)
366
- end
367
- end
411
+ def pause
412
+ sleep(2)
413
+ end
414
+
415
+ def clear
416
+ @session_cache.clear
417
+ end
418
+ end
368
419
  end