pg_data_encoder 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,5 +1,6 @@
1
1
  require "pg_data_encoder/version"
2
2
 
3
+ require 'pg_data_encoder/temp_buffer'
3
4
  require 'pg_data_encoder/encode_for_copy'
4
5
 
5
6
  module PgDataEncoder
@@ -3,24 +3,36 @@ require 'stringio'
3
3
  module PgDataEncoder
4
4
  POSTGRES_EPOCH_TIME = (Time.utc(2000,1,1).to_f * 1_000_000).to_i
5
5
 
6
+
6
7
  class EncodeForCopy
7
8
  def initialize(options = {})
8
9
  @options = options
9
10
  @closed = false
10
11
  options[:column_types] ||= {}
11
12
  @io = nil
13
+ @buffer = TempBuffer.new
12
14
  end
13
15
 
14
16
  def add(row)
15
17
  setup_io if !@io
16
18
  @io.write([row.size].pack("n"))
17
19
  row.each_with_index {|col, index|
18
- encode_field(@io, col, index)
20
+ encode_field(@buffer, col, index)
21
+ if @buffer.size > (1024 * 100)
22
+ @buffer.rewind
23
+ @io.write(@buffer.read)
24
+ @buffer.reopen
25
+ end
19
26
  }
20
27
  end
21
28
 
22
29
  def close
23
30
  @closed = true
31
+ if @buffer.size > 0
32
+ @buffer.rewind
33
+ @io.write(@buffer.read)
34
+ @buffer.reopen
35
+ end
24
36
  @io.write([-1].pack("n")) rescue raise Exception.new("No rows have been added to the encoder!")
25
37
  @io.rewind
26
38
  end
@@ -86,7 +98,7 @@ module PgDataEncoder
86
98
  io.write(buf)
87
99
  end
88
100
  when Array
89
- array_io = StringIO.new
101
+ array_io = TempBuffer.new
90
102
  field.compact!
91
103
  completed = false
92
104
  case field[0]
@@ -147,7 +159,7 @@ module PgDataEncoder
147
159
  end
148
160
  when Hash
149
161
  raise Exception.new("Hash's can't contain hashes") if depth > 0
150
- hash_io = StringIO.new
162
+ hash_io = TempBuffer.new
151
163
 
152
164
  hash_io.write([field.size].pack("N"))
153
165
  field.each_pair {|key,val|
@@ -0,0 +1,27 @@
1
+ class TempBuffer
2
+ def initialize
3
+ @st = ""
4
+ end
5
+ def size
6
+ @st.size
7
+ end
8
+
9
+ def write(st)
10
+ @st << st
11
+ end
12
+ def rewind
13
+
14
+ end
15
+ def reopen
16
+ @st = ""
17
+ end
18
+ def read
19
+ @st
20
+ end
21
+ def pos
22
+ @st.size
23
+ end
24
+ def string
25
+ @st
26
+ end
27
+ end
@@ -1,3 +1,3 @@
1
1
  module PgDataEncoder
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
@@ -0,0 +1,15 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+ require 'benchmark'
3
+ describe "testing changes with large imports and speed issues" do
4
+ it 'should import lots of data quickly' do
5
+ encoder = PgDataEncoder::EncodeForCopy.new(temp_file: true)
6
+ puts Benchmark.measure {
7
+ 0.upto(100_000) {|r|
8
+ encoder.add [1, "text", {a: 1, b: "asdf"}]
9
+ }
10
+ }
11
+ encoder.close
12
+ io = encoder.get_io
13
+
14
+ end
15
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pg_data_encoder
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:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-01-19 00:00:00.000000000 Z
12
+ date: 2014-05-06 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
@@ -59,8 +59,10 @@ files:
59
59
  - examples/fast_load.rb
60
60
  - lib/pg_data_encoder.rb
61
61
  - lib/pg_data_encoder/encode_for_copy.rb
62
+ - lib/pg_data_encoder/temp_buffer.rb
62
63
  - lib/pg_data_encoder/version.rb
63
64
  - pg_data_encoder.gemspec
65
+ - spec/big_write_spec.rb
64
66
  - spec/errors_spec.rb
65
67
  - spec/fixtures/3_col_array.txt
66
68
  - spec/fixtures/3_col_hstore.dat
@@ -111,6 +113,7 @@ specification_version: 3
111
113
  summary: for faster input of data into postgres you can use this to generate the binary
112
114
  import and run COPY FROM
113
115
  test_files:
116
+ - spec/big_write_spec.rb
114
117
  - spec/errors_spec.rb
115
118
  - spec/fixtures/3_col_array.txt
116
119
  - spec/fixtures/3_col_hstore.dat