sdbport 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,3 +1,9 @@
1
+ ## HEAD:
2
+
3
+ ## 0.1.1:
4
+
5
+ * Read domains with more than 100 items
6
+
1
7
  ## 0.1.0:
2
8
 
3
9
  * Added export subcommand
data/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ [![Build Status](https://secure.travis-ci.org/brettweavnet/sdbport.png)](http://travis-ci.org/brettweavnet/sdbport)
2
+
1
3
  # Sdbport
2
4
 
3
5
  Sdbport exports & imports data from AWS SimpleDB domains. It can be used as a class or stand alone CLI.
@@ -27,12 +29,6 @@ Import into new domain:
27
29
  sdbport import -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY -r us-west-1 -n new-domain -i /tmp/test-domain-dump
28
30
  ```
29
31
 
30
- Purge new domain:
31
-
32
- ```
33
- sdbport purge -a $AWS_ACCESS_KEY_ID -s $AWS_SECRET_ACCESS_KEY -r us-west-1 -n new-domain
34
- ```
35
-
36
32
  To list CLI subcommands:
37
33
 
38
34
  ```
@@ -47,8 +43,7 @@ sdbport export -h
47
43
 
48
44
  ## Known Limitations
49
45
 
50
- * Only performs a single query for exports, which gives it a maxmimum of 1,000 entries.
51
- * Single serialiazed process.
46
+ * Single serialiazed process for import. Need to switch to batch put attributes.
52
47
  * Only supports importing into empty domain.
53
48
 
54
49
  ## Contributing
@@ -22,8 +22,21 @@ module Sdbport
22
22
  sdb.create_domain(domain) unless domain_exists?(domain)
23
23
  end
24
24
 
25
- def select(query)
26
- sdb.select(query).body['Items']
25
+ def select(query, options = {})
26
+ sdb.select(query, options).body
27
+ end
28
+
29
+ def select_and_follow_tokens(query, options = {})
30
+ data = {}
31
+ next_token = nil
32
+ final_token = false
33
+ while true
34
+ options.merge! 'NextToken' => next_token
35
+ chunk = sdb.select(query, options).body
36
+ data.merge! chunk['Items']
37
+ next_token = chunk['NextToken']
38
+ return data unless next_token
39
+ end
27
40
  end
28
41
 
29
42
  def count(domain)
@@ -31,7 +31,7 @@ module Sdbport
31
31
  end
32
32
 
33
33
  def export_domain
34
- sdb.select "select * from `#{@name}`"
34
+ sdb.select_and_follow_tokens "select * from `#{@name}`"
35
35
  end
36
36
 
37
37
  def convert_to_string(item)
@@ -12,7 +12,7 @@ module Sdbport
12
12
 
13
13
  def purge
14
14
  @logger.info "Purging #{@name} in #{@region}."
15
- data = sdb.select "select * from `#{@name}`"
15
+ data = sdb.select_and_follow_tokens "select * from `#{@name}`"
16
16
  data.keys.each do |key|
17
17
  @logger.debug "Deleting #{key}."
18
18
  sdb.delete @name, key
@@ -1,3 +1,3 @@
1
1
  module Sdbport
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -4,7 +4,7 @@ describe Sdbport do
4
4
 
5
5
  before do
6
6
  @fog_mock = mock 'fog'
7
- @body_stub = mock 'body'
7
+ @body_stub = stub 'body'
8
8
  Fog::AWS::SimpleDB.should_receive(:new).
9
9
  with(:aws_access_key_id => 'the-key',
10
10
  :aws_secret_access_key => 'the-secret',
@@ -22,6 +22,42 @@ describe Sdbport do
22
22
  @sdb.domains.should == ['domain1']
23
23
  end
24
24
 
25
+ it "should perform select query given" do
26
+ @fog_mock.should_receive(:select).
27
+ with('select * from name', 'ConsistentRead' => true).
28
+ and_return @body_stub
29
+ @body_stub.stub :body => 'thegoods'
30
+ @sdb.select('select * from name', 'ConsistentRead' => true).
31
+ should == 'thegoods'
32
+ end
33
+
34
+ it "should perform select query given and next tokens" do
35
+ body_stub0 = stub 'body0', :body => { 'Items' =>
36
+ { 'id1' => 'val1' },
37
+ 'NextToken' => '1'
38
+ }
39
+ body_stub1 = stub 'body1', :body => { 'Items' =>
40
+ { 'id2' => 'val2' },
41
+ 'NextToken' => '2'
42
+ }
43
+ body_stub2 = stub 'body2', :body => { 'Items' =>
44
+ { 'id3' => 'val3' }
45
+ }
46
+ @fog_mock.should_receive(:select).
47
+ with('select * from name', 'NextToken' => nil).
48
+ and_return body_stub0
49
+ @fog_mock.should_receive(:select).
50
+ with('select * from name', 'NextToken' => '1').
51
+ and_return body_stub1
52
+ @fog_mock.should_receive(:select).
53
+ with('select * from name', 'NextToken' => '2').
54
+ and_return body_stub2
55
+ @sdb.select_and_follow_tokens('select * from name').
56
+ should == { 'id1' => 'val1',
57
+ 'id2' => 'val2',
58
+ 'id3' => 'val3' }
59
+ end
60
+
25
61
  it "should create a new domain when it does not exist" do
26
62
  @fog_mock.stub :list_domains => @body_stub
27
63
  @body_stub.stub :body => { 'Domains' => [] }
@@ -20,7 +20,7 @@ describe Sdbport do
20
20
  'item2' =>
21
21
  { 'attribute' => [ 'different' ] }
22
22
  }
23
- @sdb_mock.should_receive(:select).
23
+ @sdb_mock.should_receive(:select_and_follow_tokens).
24
24
  with('select * from `name`').
25
25
  and_return data
26
26
  @file_mock.should_receive(:write).with("[\"item1\",{\"attribute\":[\"value\"]}]")
@@ -15,7 +15,7 @@ describe Sdbport do
15
15
  result = { 'item1' =>
16
16
  { 'attribute' => [ 'value' ] }
17
17
  }
18
- @sdb_mock.should_receive(:select).
18
+ @sdb_mock.should_receive(:select_and_follow_tokens).
19
19
  with('select * from `name`').
20
20
  and_return result
21
21
  @sdb_mock.should_receive(:delete).with 'name', 'item1'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sdbport
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-09-30 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70332196552280 !ruby/object:Gem::Requirement
16
+ requirement: &70237921138580 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70332196552280
24
+ version_requirements: *70237921138580
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: fog
27
- requirement: &70332196551760 !ruby/object:Gem::Requirement
27
+ requirement: &70237921138140 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70332196551760
35
+ version_requirements: *70237921138140
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: trollop
38
- requirement: &70332196551200 !ruby/object:Gem::Requirement
38
+ requirement: &70237921137660 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,7 +43,7 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *70332196551200
46
+ version_requirements: *70237921137660
47
47
  description: Import and export AWS SimpleDB domains.
48
48
  email:
49
49
  - brett@weav.net
@@ -96,7 +96,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
96
96
  version: '0'
97
97
  segments:
98
98
  - 0
99
- hash: 3221497568157798114
99
+ hash: -1634563892266774728
100
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
101
  none: false
102
102
  requirements:
@@ -105,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
105
105
  version: '0'
106
106
  segments:
107
107
  - 0
108
- hash: 3221497568157798114
108
+ hash: -1634563892266774728
109
109
  requirements: []
110
110
  rubyforge_project:
111
111
  rubygems_version: 1.8.16