split_pgdump 0.3.5 → 0.3.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/split_pgdump.rb +39 -18
  2. metadata +2 -2
data/lib/split_pgdump.rb CHANGED
@@ -7,7 +7,7 @@ require 'shellwords'
7
7
  $debug = false
8
8
 
9
9
  module SplitPgDump
10
- VERSION = '0.3.5'
10
+ VERSION = '0.3.6'
11
11
  end
12
12
 
13
13
  class SplitPgDump::Worker
@@ -206,8 +206,8 @@ end
206
206
 
207
207
  class SplitPgDump::Table
208
208
  class NoColumn < StandardError; end
209
- ONE_FILE_CACHE_SIZE = 256 * 1024
210
- TOTAL_CACHE_SIZE = 5 * 1024 * 1024
209
+ ONE_FILE_CACHE_SIZE = 3 * 128 * 1024
210
+ TOTAL_CACHE_SIZE = 4 * 128 * 1024
211
211
 
212
212
  class OneFile
213
213
  attr_reader :file_name, :cache_size
@@ -251,19 +251,38 @@ class SplitPgDump::Table
251
251
  end
252
252
  end
253
253
 
254
+ module DefaultName
255
+ def file_name(line)
256
+ @file_name
257
+ end
258
+ end
259
+ include DefaultName
260
+
261
+ module ComputeName
262
+ def file_name(line)
263
+ values = line.chomp.split("\t")
264
+ name = compute_name(values)
265
+ @file_name[name] ||= begin
266
+ name_strip = name.gsub(/\.\.|\s|\?|\*|'|"/, '_')
267
+ "#{table_schema}/#{name_strip}.dat"
268
+ end
269
+ end
270
+ end
271
+
254
272
  attr_reader :table, :columns, :files, :sort_line, :sort_args
255
273
  def initialize(dir, schema, name, columns, rule)
256
274
  @dir = dir
257
275
  @table = name
258
276
  @schema = schema
259
277
  @columns = columns.map{|c| c.sub(/^"(.+)"$/, '\\1')}
278
+ @file_name = "#{table_schema}.dat"
260
279
  apply_rule rule
261
280
  @files = {}
262
281
  @total_cache_size = 0
263
282
  end
264
283
 
265
- def _mod(s, len, mod)
266
- "%0#{len}d" % (s.to_i / mod * mod)
284
+ def _mod(s, format, mod)
285
+ format % (s.to_i / mod * mod)
267
286
  end
268
287
 
269
288
  def apply_rule(rule)
@@ -281,7 +300,7 @@ class SplitPgDump::Table
281
300
  if action[:mod]
282
301
  mod_s = action[:mod]
283
302
  mod = mod_s.to_i
284
- field = "_mod(#{field},#{mod_s.size},#{mod})"
303
+ field = "_mod(#{field}, '%0#{mod_s.size}d', #{mod})"
285
304
  elsif action[:range]
286
305
  field << "#{action[:range]}"
287
306
  end
@@ -290,12 +309,15 @@ class SplitPgDump::Table
290
309
  end
291
310
  end
292
311
 
293
- eval <<-"EOF"
294
- def self.file_name(values)
295
- name = %{#{split_string}}.gsub(/\\.\\.|\\s|\\?|\\*|'|"/, '_')
296
- "\#{table_schema}/\#{name}.dat"
297
- end
298
- EOF
312
+ if split_string > ''
313
+ @file_name = {}
314
+ eval <<-"EOF"
315
+ def self.compute_name(values)
316
+ %{#{split_string}}
317
+ end
318
+ EOF
319
+ extend ComputeName
320
+ end
299
321
 
300
322
  @sort_args = rule.sort_keys.map do |key|
301
323
  i = @columns.find_index(key[:field])
@@ -312,13 +334,12 @@ class SplitPgDump::Table
312
334
  @schema == 'public' ? @table : "#@schema/#@table"
313
335
  end
314
336
 
315
- def file_name(values)
316
- "#{table_schema}.dat"
337
+ def file_name(line)
338
+ @file_name
317
339
  end
318
340
 
319
341
  def add_line(line)
320
- values = line.chomp.split("\t")
321
- fname = file_name(values)
342
+ fname = file_name(line)
322
343
  one_file = @files[fname] ||= OneFile.new(@dir, fname)
323
344
  one_file.add_line(line)
324
345
  @total_cache_size += line.size
@@ -336,8 +357,8 @@ class SplitPgDump::Table
336
357
 
337
358
  def copy_lines
338
359
  if block_given?
339
- @files.each do |name, one_file|
340
- yield "\\copy #{@table} (#{@columns.join(', ')}) from #{one_file.file_name}"
360
+ @files.map{|n, one_file| one_file.file_name}.sort.each do |file_name|
361
+ yield "\\copy #{@table} (#{@columns.join(', ')}) from #{file_name}"
341
362
  end
342
363
  else
343
364
  to_enum(:copy_lines)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: split_pgdump
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.5
4
+ version: 0.3.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -45,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
45
45
  version: '0'
46
46
  requirements: []
47
47
  rubyforge_project:
48
- rubygems_version: 1.8.12
48
+ rubygems_version: 1.8.16
49
49
  signing_key:
50
50
  specification_version: 3
51
51
  summary: split_pgdump is a tool for splitting postgresql dump in a managable set of