sdbcli 0.2.8 → 0.2.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,173 +1,184 @@
1
- require 'sdbcli/sdb-client'
2
-
3
- module SimpleDB
4
- class Error < StandardError; end
5
-
6
- class Driver
7
- attr_accessor :iteratable
8
-
9
- def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
10
- @client = Client.new(accessKeyId, secretAccessKey, endpoint)
11
- end
12
-
13
- def endpoint
14
- @client.endpoint
15
- end
16
-
17
- def endpoint=(v)
18
- @client.endpoint = v
19
- end
20
-
21
- # domain action
22
-
23
- def create_domain(domain_name)
24
- @client.create_domain(domain_name)
25
- end
26
-
27
- def show_domains
28
- domains = []
29
-
30
- iterate(:list_domains) do |doc|
31
- doc.css('DomainName').each do |i|
32
- domains << i.content
33
- end
34
- end
35
-
36
- return domains
37
- end
38
-
39
- def drop_domain(domain_name)
40
- @client.delete_domain(domain_name)
41
- end
42
-
43
- # attr action
44
-
45
- def insert(domain_name, item_name, attrs = {}, consistent = false)
46
- params = {:ConsistentRead => consistent}
47
- i = 0
48
-
49
- attrs.each do |name, values|
50
- [values].flatten.each do |v|
51
- i += 1
52
- params["Attribute.#{i}.Name"] = name
53
- params["Attribute.#{i}.Value"] = v
54
- params["Attribute.#{i}.Replace"] = false
55
- end
56
- end
57
-
58
- @client.put_attributes(domain_name, item_name, params)
59
- end
60
-
61
- def update(domain_name, items = {}, consistent = false)
62
- params = {:ConsistentRead => consistent}
63
- i = j = 0
64
-
65
- items.each do |item_name, attrs|
66
- i += 1
67
- params["Item.#{i}.ItemName"] = item_name
68
-
69
- (attrs || {}).each do |attr_name, values|
70
- [values].flatten.each do |v|
71
- j += 1
72
- params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
73
- params["Item.#{i}.Attribute.#{j}.Value"] = v
74
- params["Item.#{i}.Attribute.#{j}.Replace"] = true
75
- end
76
- end
77
- end
78
-
79
- @client.batch_put_attributes(domain_name, params)
80
- end
81
-
82
- def get(domain_name, item_name, attr_names = [], consistent = false)
83
- params = {:ConsistentRead => consistent}
84
- attr_names.each_with_index {|name, i| params["AttributeName.#{i}"] = name }
85
- doc = @client.get_attributes(domain_name, item_name, params)
86
- attrs_to_hash(doc)
87
- end
88
-
89
- def select(expr, consistent = false)
90
- params = {:SelectExpression => expr, :ConsistentRead => consistent}
91
- items = []
92
-
93
- iterate(:select, params) do |doc|
94
- doc.css('Item').map do |i|
95
- items << [i.at_css('Name').content, attrs_to_hash(i)]
96
- end
97
- end
98
-
99
- return items
100
- end
101
-
102
- def delete(domain_name, items = {}, consistent = false)
103
- params = {:ConsistentRead => consistent}
104
- i = j = 0
105
-
106
- items.each do |item_name, attrs|
107
- i += 1
108
- params["Item.#{i}.ItemName"] = item_name
109
-
110
- (attrs || []).each do |attr_name, values|
111
- [values].flatten.each do |v|
112
- j += 1
113
- params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
114
- params["Item.#{i}.Attribute.#{j}.Value"] = v if v
115
- end
116
- end
117
- end
118
-
119
- @client.batch_delete_attributes(domain_name, params)
120
- end
121
-
122
- private
123
-
124
- def attrs_to_hash(node)
125
- h = {}
126
-
127
- node.css('Attribute').map do |i|
128
- name = i.at_css('Name').content
129
- value = i.at_css('Value').content
130
-
131
- if h[name].kind_of?(Array)
132
- h[name] << value
133
- elsif h.has_key?(name)
134
- h[name] = [h[name], value]
135
- else
136
- h[name] = value
137
- end
138
- end
139
-
140
- return h
141
- end
142
-
143
- def iterate(method, params = {})
144
- Iterator.new(@client, method, params, @iteratable).each do |doc|
145
- yield(doc)
146
- end
147
- end
148
-
149
- class Iterator
150
- def initialize(client, method, params = {}, iteratable = false)
151
- @client = client
152
- @method = method
153
- @params = params.dup
154
- @token = :first
155
- @iteratable = iteratable
156
- end
157
-
158
- def each
159
- while @token
160
- @params.update(:NextToken => @token.content) if @token != :first
161
- doc = @client.send(@method, @params)
162
- yield(doc)
163
-
164
- if @iteratable
165
- @token = doc.at_css('NextToken')
166
- else
167
- @token = nil
168
- end
169
- end
170
- end
171
- end # Iterator
172
- end # Driver
173
- end # SimpleDB
1
+ require 'sdbcli/sdb-client'
2
+
3
+ module SimpleDB
4
+ class Error < StandardError; end
5
+
6
+ class Driver
7
+ attr_accessor :iteratable
8
+
9
+ def initialize(accessKeyId, secretAccessKey, endpoint = 'sdb.amazonaws.com')
10
+ @client = Client.new(accessKeyId, secretAccessKey, endpoint)
11
+ end
12
+
13
+ def endpoint
14
+ @client.endpoint
15
+ end
16
+
17
+ def endpoint=(v)
18
+ @client.endpoint = v
19
+ end
20
+
21
+ # domain action
22
+
23
+ def create_domain(domain_name)
24
+ @client.create_domain(domain_name)
25
+ end
26
+
27
+ def show_domains
28
+ domains = []
29
+
30
+ iterate(:list_domains) do |doc|
31
+ doc.css('DomainName').each do |i|
32
+ domains << i.content
33
+ end
34
+ end
35
+
36
+ return domains
37
+ end
38
+
39
+ def drop_domain(domain_name)
40
+ @client.delete_domain(domain_name)
41
+ end
42
+
43
+ # attr action
44
+
45
+ def insert(domain_name, item_name, attrs = {}, consistent = false)
46
+ params = {:ConsistentRead => consistent}
47
+ i = 0
48
+
49
+ attrs.each do |name, values|
50
+ [values].flatten.each do |v|
51
+ i += 1
52
+ params["Attribute.#{i}.Name"] = name
53
+ params["Attribute.#{i}.Value"] = v
54
+ params["Attribute.#{i}.Replace"] = false
55
+ end
56
+ end
57
+
58
+ @client.put_attributes(domain_name, item_name, params)
59
+ end
60
+
61
+ def update(domain_name, items = {}, consistent = false)
62
+ params = {:ConsistentRead => consistent}
63
+ i = j = 0
64
+
65
+ items.each do |item_name, attrs|
66
+ i += 1
67
+ params["Item.#{i}.ItemName"] = item_name
68
+
69
+ (attrs || {}).each do |attr_name, values|
70
+ [values].flatten.each do |v|
71
+ j += 1
72
+ params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
73
+ params["Item.#{i}.Attribute.#{j}.Value"] = v
74
+ params["Item.#{i}.Attribute.#{j}.Replace"] = true
75
+ end
76
+ end
77
+ end
78
+
79
+ @client.batch_put_attributes(domain_name, params)
80
+ end
81
+
82
+ def get(domain_name, item_name, attr_names = [], consistent = false)
83
+ params = {:ConsistentRead => consistent}
84
+ attr_names.each_with_index {|name, i| params["AttributeName.#{i}"] = name }
85
+ doc = @client.get_attributes(domain_name, item_name, params)
86
+ attrs_to_hash(doc)
87
+ end
88
+
89
+ def select(expr, consistent = false)
90
+ params = {:SelectExpression => expr, :ConsistentRead => consistent}
91
+ items = []
92
+
93
+ iterate(:select, params) do |doc|
94
+ doc.css('Item').map do |i|
95
+ items << [i.at_css('Name').content, attrs_to_hash(i)]
96
+ end
97
+ end
98
+
99
+ return items
100
+ end
101
+
102
+ def delete(domain_name, items = {}, consistent = false)
103
+ params = {:ConsistentRead => consistent}
104
+ i = j = 0
105
+
106
+ items.each do |item_name, attrs|
107
+ i += 1
108
+ params["Item.#{i}.ItemName"] = item_name
109
+
110
+ (attrs || []).each do |attr_name, values|
111
+ [values].flatten.each do |v|
112
+ j += 1
113
+ params["Item.#{i}.Attribute.#{j}.Name"] = attr_name
114
+ params["Item.#{i}.Attribute.#{j}.Value"] = v if v
115
+ end
116
+ end
117
+ end
118
+
119
+ @client.batch_delete_attributes(domain_name, params)
120
+ end
121
+
122
+ def describe(domain_name)
123
+ doc = @client.domain_metadata(domain_name)
124
+ h = {}
125
+
126
+ doc.at_css('DomainMetadataResult').children.each do |child|
127
+ h[child.name] = child.content
128
+ end
129
+
130
+ return h
131
+ end
132
+
133
+ private
134
+
135
+ def attrs_to_hash(node)
136
+ h = {}
137
+
138
+ node.css('Attribute').map do |i|
139
+ name = i.at_css('Name').content
140
+ value = i.at_css('Value').content
141
+
142
+ if h[name].kind_of?(Array)
143
+ h[name] << value
144
+ elsif h.has_key?(name)
145
+ h[name] = [h[name], value]
146
+ else
147
+ h[name] = value
148
+ end
149
+ end
150
+
151
+ return h
152
+ end
153
+
154
+ def iterate(method, params = {})
155
+ Iterator.new(@client, method, params, @iteratable).each do |doc|
156
+ yield(doc)
157
+ end
158
+ end
159
+
160
+ class Iterator
161
+ def initialize(client, method, params = {}, iteratable = false)
162
+ @client = client
163
+ @method = method
164
+ @params = params.dup
165
+ @token = :first
166
+ @iteratable = iteratable
167
+ end
168
+
169
+ def each
170
+ while @token
171
+ @params.update(:NextToken => @token.content) if @token != :first
172
+ doc = @client.send(@method, @params)
173
+ yield(doc)
174
+
175
+ if @iteratable
176
+ @token = doc.at_css('NextToken')
177
+ else
178
+ @token = nil
179
+ end
180
+ end
181
+ end
182
+ end # Iterator
183
+ end # Driver
184
+ end # SimpleDB