pg_data_encoder 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.
@@ -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