sdbport 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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