taps 0.2.10 → 0.2.11

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/README.rdoc CHANGED
@@ -27,7 +27,6 @@ or when you want to push a local database to a taps server
27
27
  * Blob data may not transfer properly, I suspect that SQLite3 is modifying some native ruby objects.
28
28
  * Foreign Keys get lost in the schema transfer
29
29
  * Large tables (>1 million rows with a large number of columns) get slower as the offset gets larger. This is due to it being inefficient having large offset values in queries.
30
- * Character encoding problems should be more transparent but they're not, it usually involves looking at the server log to see the error.
31
30
 
32
31
  == Meta
33
32
 
data/VERSION.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  ---
2
- :patch: 10
2
+ :patch: 11
3
3
  :major: 0
4
4
  :minor: 2
data/lib/taps/cli.rb CHANGED
@@ -36,6 +36,11 @@ class Cli < Thor
36
36
  clientxfer(:cmd_send, database_url, remote_url)
37
37
  end
38
38
 
39
+ desc "version", "Taps version"
40
+ def version
41
+ puts Taps.version
42
+ end
43
+
39
44
  def clientxfer(method, database_url, remote_url)
40
45
  if options[:chunksize]
41
46
  Taps::Config.chunksize = options[:chunksize] < 100 ? 100 : options[:chunksize]
@@ -70,11 +70,21 @@ class ClientSession
70
70
  end
71
71
 
72
72
  def cmd_send
73
- verify_server
74
- cmd_send_schema
75
- cmd_send_data
76
- cmd_send_indexes
77
- cmd_send_reset_sequences
73
+ begin
74
+ verify_server
75
+ cmd_send_schema
76
+ cmd_send_data
77
+ cmd_send_indexes
78
+ cmd_send_reset_sequences
79
+ rescue RestClient::Exception => e
80
+ if e.respond_to?(:response)
81
+ puts "!!! Caught Server Exception"
82
+ puts "#{e.response.body}"
83
+ exit(1)
84
+ else
85
+ raise
86
+ end
87
+ end
78
88
  end
79
89
 
80
90
  def cmd_send_indexes
@@ -116,12 +126,14 @@ class ClientSession
116
126
 
117
127
  offset = 0
118
128
  loop do
119
- rows = Taps::Utils.format_data(table.order(order).limit(chunksize, offset).all)
120
- break if rows == { }
129
+ row_size = 0
130
+ chunksize = Taps::Utils.calculate_chunksize(chunksize) do |c|
131
+ rows = Taps::Utils.format_data(table.order(order).limit(c, offset).all)
132
+ break if rows == { }
121
133
 
122
- gzip_data = Taps::Utils.gzip(Marshal.dump(rows))
134
+ row_size = rows[:data].size
135
+ gzip_data = Taps::Utils.gzip(Marshal.dump(rows))
123
136
 
124
- chunksize = Taps::Utils.calculate_chunksize(chunksize) do
125
137
  begin
126
138
  session_resource["tables/#{table_name}"].post(gzip_data, http_headers({
127
139
  :content_type => 'application/octet-stream',
@@ -135,8 +147,10 @@ class ClientSession
135
147
  end
136
148
  end
137
149
 
138
- progress.inc(rows[:data].size)
139
- offset += rows[:data].size
150
+ progress.inc(row_size)
151
+ offset += row_size
152
+
153
+ break if row_size == 0
140
154
  end
141
155
 
142
156
  progress.finish
@@ -156,11 +170,21 @@ class ClientSession
156
170
  end
157
171
 
158
172
  def cmd_receive
159
- verify_server
160
- cmd_receive_schema
161
- cmd_receive_data
162
- cmd_receive_indexes
163
- cmd_reset_sequences
173
+ begin
174
+ verify_server
175
+ cmd_receive_schema
176
+ cmd_receive_data
177
+ cmd_receive_indexes
178
+ cmd_reset_sequences
179
+ rescue RestClient::Exception => e
180
+ if e.respond_to?(:response)
181
+ puts "!!! Caught Server Exception"
182
+ puts "#{e.response.body}"
183
+ exit(1)
184
+ else
185
+ raise
186
+ end
187
+ end
164
188
  end
165
189
 
166
190
  def cmd_receive_data
@@ -199,8 +223,8 @@ class ClientSession
199
223
 
200
224
  def fetch_table_rows(table_name, chunksize, offset)
201
225
  response = nil
202
- chunksize = Taps::Utils.calculate_chunksize(chunksize) do
203
- response = session_resource["tables/#{table_name}/#{chunksize}?offset=#{offset}"].get(http_headers)
226
+ chunksize = Taps::Utils.calculate_chunksize(chunksize) do |c|
227
+ response = session_resource["tables/#{table_name}/#{c}?offset=#{offset}"].get(http_headers)
204
228
  end
205
229
  raise CorruptedData unless Taps::Utils.valid_data?(response.to_s, response.headers[:taps_checksum])
206
230
 
data/lib/taps/server.rb CHANGED
@@ -10,7 +10,8 @@ class Server < Sinatra::Default
10
10
  end
11
11
 
12
12
  error do
13
- "Application error"
13
+ e = request.env['sinatra.error']
14
+ "Taps Server Error: #{e}"
14
15
  end
15
16
 
16
17
  before do
data/lib/taps/utils.rb CHANGED
@@ -41,19 +41,32 @@ module Utils
41
41
  end
42
42
 
43
43
  def calculate_chunksize(old_chunksize)
44
- t1 = Time.now
45
- yield
44
+ chunksize = old_chunksize
45
+
46
+ retries = 0
47
+ begin
48
+ t1 = Time.now
49
+ yield chunksize
50
+ rescue Errno::EPIPE
51
+ retries += 1
52
+ raise if retries > 1
53
+ # we got disconnected, the chunksize could be too large
54
+ # so we're resetting to a very small value
55
+ chunksize = 100
56
+ retry
57
+ end
58
+
46
59
  t2 = Time.now
47
60
 
48
61
  diff = t2 - t1
49
62
  new_chunksize = if diff > 3.0
50
- (old_chunksize / 3).ceil
63
+ (chunksize / 3).ceil
51
64
  elsif diff > 1.1
52
- old_chunksize - 100
65
+ chunksize - 100
53
66
  elsif diff < 0.8
54
- old_chunksize * 2
67
+ chunksize * 2
55
68
  else
56
- old_chunksize + 100
69
+ chunksize + 100
57
70
  end
58
71
  new_chunksize = 100 if new_chunksize < 100
59
72
  new_chunksize
@@ -69,7 +69,7 @@ describe Taps::ClientSession do
69
69
  it "fetches table rows given a chunksize and offset from taps server" do
70
70
  @data = { :header => [ :x, :y ], :data => [ [1, 2], [3, 4] ] }
71
71
  @gzip_data = Taps::Utils.gzip(Marshal.dump(@data))
72
- Taps::Utils.stubs(:calculate_chunksize).with(1000).yields.returns(1000)
72
+ Taps::Utils.stubs(:calculate_chunksize).with(1000).yields(1000).returns(1000)
73
73
 
74
74
  @response = mock('response')
75
75
  @client.session_resource.stubs(:[]).with('tables/mytable/1000?offset=0').returns(mock('table resource'))
data/spec/utils_spec.rb CHANGED
@@ -41,5 +41,9 @@ describe Taps::Utils do
41
41
  Time.stubs(:now).returns(10.0).returns(11.1)
42
42
  Taps::Utils.calculate_chunksize(1000) { }.should == 1100
43
43
  end
44
+
45
+ it "will reset the chunksize to a small value if we got a broken pipe exception" do
46
+ Taps::Utils.calculate_chunksize(1000) { |c| raise Errno::EPIPE if c == 1000; c.should == 100 }.should == 200
47
+ end
44
48
  end
45
49
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: taps
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.2.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ricardo Chimal, Jr.
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2009-03-20 00:00:00 -07:00
13
+ date: 2009-03-23 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -85,18 +85,18 @@ extra_rdoc_files: []
85
85
  files:
86
86
  - spec/base.rb
87
87
  - spec/schema_spec.rb
88
- - spec/utils_spec.rb
89
- - spec/client_session_spec.rb
90
88
  - spec/server_spec.rb
89
+ - spec/client_session_spec.rb
90
+ - spec/utils_spec.rb
91
91
  - lib/taps/db_session.rb
92
92
  - lib/taps/progress_bar.rb
93
- - lib/taps/cli.rb
93
+ - lib/taps/client_session.rb
94
94
  - lib/taps/adapter_hacks.rb
95
95
  - lib/taps/adapter_hacks/invalid_text_limit.rb
96
96
  - lib/taps/adapter_hacks/non_rails_schema_dump.rb
97
97
  - lib/taps/schema.rb
98
98
  - lib/taps/config.rb
99
- - lib/taps/client_session.rb
99
+ - lib/taps/cli.rb
100
100
  - lib/taps/server.rb
101
101
  - lib/taps/utils.rb
102
102
  - README.rdoc