sql-server-raw-file 0.0.1 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ea75b306d331a3e23df7a321c868778e60266a13
4
- data.tar.gz: b79c539f190cc42633fbca1dd980a7a878e60b88
3
+ metadata.gz: 41f203edbad49fe5604df8564fe39edc4f70aef3
4
+ data.tar.gz: 6a9215a1fd7c64097ec3e50c3d08649aa76db7d3
5
5
  SHA512:
6
- metadata.gz: ad451f419c448ca2bc864875c4141c6931457e0bdf73113f1e5fb9ec170e2f30a882c9358dc9e0868d19bca2df7e627ae3bcbb36838eb746b324aef7ef36fe39
7
- data.tar.gz: f415ea6b1439db87d8a930dec480d5eb33bb2fe74d1f982e79944af80dd1abad365edc34025b2bad2cef3fd6651096a119ee3bd027b4f290334a5b7fc1a67cb7
6
+ metadata.gz: 1a3d9a2c0760386dc63e4286b8a77b4830da2bcaaa0d303f0e7594cf810cde1409e8fb622e5208992832c5f71623a38cef9761bc7115257a6fd546520bb68068
7
+ data.tar.gz: d4bbae1b9efd3934109b051b87893ef4a7d4cb1cebf84e78cedd5dab5d2454765bddfd41d10c498e518dac7b76f2669d901b442f5b72b665acc76090199bc009
data/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ ## 0.1.1 (Jan 20, 2016)
2
+
3
+ Features:
4
+
5
+ - added SqlServerDts::RawFile#eof?
6
+ * check io-stream eof
7
+ - added SqlServerDts::RawFile#pos
8
+ * get current position in inner io-stream object
9
+
10
+ Bugfixes:
11
+
12
+ - missing method SqlServerDts::RawFile#close
13
+ * is need to close inner io-stream object in some cases
14
+
1
15
  ## 0.0.1 (Jan 5, 2016)
2
16
 
3
17
  Features:
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # sql-server-raw-file: sql-server-raw-file lib
2
2
 
3
- Converts SQL Server Dts Raw File source to hash.
3
+ Converts SQL Server Integration Services Raw File source to hash.
4
4
 
5
5
  ### Installation and usage
6
6
 
@@ -42,6 +42,8 @@ SqlServerDts::RawFile.new('/path/to/sql/raw/file') { |raw_obj, raw_io|
42
42
  # ...
43
43
  }
44
44
  # end example 2
45
+
46
+ 3) more detailed examples in ./test/test_sql_data_and_header.rb
45
47
  ```
46
48
 
47
49
  ### Troubleshooting
@@ -1 +1 @@
1
- 2
1
+ 1
@@ -1,5 +1,7 @@
1
+ # coding: utf-8
2
+
1
3
  # SqlServerDts module
2
4
  module SqlServerDts
3
5
  # current version
4
- VERSION = '0.0.1'
6
+ VERSION = '0.1.1'
5
7
  end
@@ -1,5 +1,6 @@
1
1
  # coding: utf-8
2
- require "#{File.dirname(__FILE__)}/sql_server_dts_ns"
2
+
3
+ require(File.expand_path('../sql_server_dts_ns.rb',__FILE__))
3
4
 
4
5
  # SqlServerDts::RawFile class
5
6
  class SqlServerDts::RawFile
@@ -38,19 +39,19 @@ class SqlServerDts::RawFile
38
39
  # in other side returns self
39
40
  def initialize(io,init_pos=nil)
40
41
  if io.is_a?(IO)
41
- @raw_file = io
42
- @raw_file.binmode unless @raw_file.binmode?
42
+ @raw_io = io
43
+ @raw_io.binmode unless @raw_io.binmode?
43
44
  read_header
44
- @raw_file.seek(init_pos || @data_pos)
45
+ @raw_io.seek(init_pos || @data_pos)
45
46
  else
46
- @raw_file = File.new(io,'rb')
47
+ @raw_io = File.new(io,'rb')
47
48
  read_header
48
- @raw_file.seek(init_pos || @data_pos)
49
+ @raw_io.seek(init_pos || @data_pos)
49
50
  if block_given?
50
51
  begin
51
- yield [self,@raw_file]
52
+ yield [self,@raw_io]
52
53
  ensure
53
- @raw_file.close
54
+ @raw_io.close
54
55
  end
55
56
  else
56
57
  self
@@ -60,21 +61,21 @@ class SqlServerDts::RawFile
60
61
 
61
62
  # read metadata (header) raw file and fill inner array of metadata
62
63
  def read_header
63
- raise IOError, 'Stream is closed' if @raw_file.closed?
64
+ raise IOError, 'Stream is closed' if @raw_io.closed?
64
65
  begin
65
- @raw_file.rewind
66
- @version = @raw_file.read(4).unpack('H2H2H2H2').join('.')
66
+ @raw_io.rewind
67
+ @version = @raw_io.read(4).unpack('H2H2H2H2').join('.')
67
68
  raise UnsupportedRawVersionError, "Version #{@version} unsupported " unless SUPPORTED_RAW_VERSIONS.include?(@version)
68
69
  @fields_info = []
69
- fields_count = @raw_file.read(4).unpack('I')[0]
70
+ fields_count = @raw_io.read(4).unpack('I')[0]
70
71
  raise FieldsNotExistsError, 'Fields not exists (fields_count=0)' if fields_count==0
71
72
  @nil_mask_len = fields_count/8+(fields_count-fields_count/8*8>0?1:0)
72
73
  fields_count.times {
73
- name_len = @raw_file.read(4).unpack('I')[0]
74
- field_name = @raw_file.read(name_len*2).encode(DEFAULT_ENCODING,DEFAULT_RAW_FILE_ENCODING,{ invalid: :replace, undef: :replace })
74
+ name_len = @raw_io.read(4).unpack('I')[0]
75
+ field_name = @raw_io.read(name_len*2).encode(DEFAULT_ENCODING,DEFAULT_RAW_FILE_ENCODING,{ invalid: :replace, undef: :replace })
75
76
  (@version == '00.10.01.00') ?
76
- values_arr = @raw_file.read(40).unpack('I4iI5') :
77
- values_arr = @raw_file.read(32).unpack('I4iI3')
77
+ values_arr = @raw_io.read(40).unpack('I4iI5') :
78
+ values_arr = @raw_io.read(32).unpack('I4iI3')
78
79
  field_info = {
79
80
  name: field_name,
80
81
  data_type: values_arr[0],
@@ -93,7 +94,7 @@ class SqlServerDts::RawFile
93
94
  rescue
94
95
  raise
95
96
  else
96
- @data_pos = @raw_file.pos
97
+ @data_pos = @raw_io.pos
97
98
  end
98
99
  end
99
100
 
@@ -101,9 +102,9 @@ class SqlServerDts::RawFile
101
102
  #
102
103
  # @return [Hash] Hash of converted raw data (one line)
103
104
  def read_line
104
- raise IOError, 'Stream is closed' if @raw_file.closed?
105
+ raise IOError, 'Stream is closed' if @raw_io.closed?
105
106
  begin
106
- nil_mask = @raw_file.read(@nil_mask_len).unpack('b*')[0].each_char.to_a
107
+ nil_mask = @raw_io.read(@nil_mask_len).unpack('b*')[0].each_char.to_a
107
108
  data_row = []
108
109
  @fields_info.each_with_index { |field_info, index|
109
110
  field_value =
@@ -112,28 +113,28 @@ class SqlServerDts::RawFile
112
113
  else
113
114
  case field_info[:data_type]
114
115
  when 3 # int, NULL w/o cast
115
- @raw_file.read(field_info[:max_length]).unpack('I')[0]
116
+ @raw_io.read(field_info[:max_length]).unpack('I')[0]
116
117
  when 5 # float
117
- @raw_file.read(field_info[:max_length]).unpack('D')[0]
118
+ @raw_io.read(field_info[:max_length]).unpack('D')[0]
118
119
  when 11 # bit
119
- (@raw_file.read(field_info[:max_length]).unpack('B')[0] == '1') ? true : false
120
+ (@raw_io.read(field_info[:max_length]).unpack('B')[0] == '1') ? true : false
120
121
  when 20 # bigint
121
- @raw_file.read(field_info[:max_length]).unpack('L')[0]
122
+ @raw_io.read(field_info[:max_length]).unpack('L')[0]
122
123
  when 129 # varchar, char
123
- data_len = @raw_file.read(4).unpack('I')[0]
124
- @raw_file.read(data_len).encode({invalid: :replace, undef: :replace})
124
+ data_len = @raw_io.read(4).unpack('I')[0]
125
+ @raw_io.read(data_len).encode({invalid: :replace, undef: :replace})
125
126
  when 130 # nvarchar, nchar
126
- data_len = @raw_file.read(4).unpack('I')[0]
127
- @raw_file.read(data_len*2).encode(DEFAULT_ENCODING, DEFAULT_RAW_FILE_ENCODING, {invalid: :replace, undef: :replace})
127
+ data_len = @raw_io.read(4).unpack('I')[0]
128
+ @raw_io.read(data_len*2).encode(DEFAULT_ENCODING, DEFAULT_RAW_FILE_ENCODING, {invalid: :replace, undef: :replace})
128
129
  when 131 # numeric, decimal
129
130
  # precision, scale, sign, value
130
- values_arr = @raw_file.read(field_info[:max_length]).unpack('C3Q')
131
+ values_arr = @raw_io.read(field_info[:max_length]).unpack('C3Q')
131
132
  "#{('-' if values_arr[2] == 0)}#{values_arr[3].to_s.insert((values_arr[3].to_s.length-values_arr[1]), '.')}"
132
133
  when 135 # datetime
133
- values_arr = @raw_file.read(field_info[:max_length]).unpack('S6I')
134
+ values_arr = @raw_io.read(field_info[:max_length]).unpack('S6I')
134
135
  Time.local(values_arr[0], values_arr[1], values_arr[2], values_arr[3], values_arr[4], values_arr[5], (values_arr[6].to_f/1000.0)).strftime('%F %T.%L')
135
136
  when 304 # datetime2
136
- values_arr = @raw_file.read(field_info[:max_length]).unpack('S6I')
137
+ values_arr = @raw_io.read(field_info[:max_length]).unpack('S6I')
137
138
  Time.local(values_arr[0], values_arr[1], values_arr[2], values_arr[3], values_arr[4], values_arr[5], (values_arr[6].to_f/1000.0)).strftime("%F %T.%#{field_info[:scale]}N")
138
139
  else
139
140
  raise UnknownDataTypeError, "Unknown data type #{field_info[:data_type]}"
@@ -159,4 +160,19 @@ class SqlServerDts::RawFile
159
160
  def version
160
161
  @version
161
162
  end
163
+
164
+ # close io-stream
165
+ def close
166
+ @raw_io.close unless @raw_io.closed?
167
+ end
168
+
169
+ # check io-stream eof
170
+ def eof?
171
+ @raw_io.eof?
172
+ end
173
+
174
+ # get current position in inner io-stream object
175
+ def pos
176
+ @raw_io.pos
177
+ end
162
178
  end
@@ -1,6 +1,9 @@
1
+ # coding: utf-8
2
+
1
3
  require 'rubygems'
2
4
 
3
- require "#{File.dirname(__FILE__)}/lib/sql_server_dts_ns"
5
+ #require "#{File.dirname(__FILE__)}/lib/sql_server_dts_ns"
6
+ require(File.expand_path('../lib/sql_server_dts_ns.rb',__FILE__))
4
7
 
5
8
  Gem::Specification.new do |s|
6
9
  s.name = 'sql-server-raw-file'
@@ -1,30 +1,49 @@
1
1
  # coding: utf-8
2
+
2
3
  require 'csv'
3
4
  require 'json'
4
5
 
5
- require "#{File.dirname(__FILE__)}/../lib/sql_server_raw_file"
6
+ require(File.expand_path('../../lib/sql_server_raw_file.rb',__FILE__))
6
7
 
7
- fixtures_path = "#{File.dirname(__FILE__)}/../fixtures/"
8
- raw_path = %w(sql09.raw sql10.raw sql11.raw)
8
+ fixtures_path = File.expand_path('../../fixtures',__FILE__)+'/'
9
+ raw_file_name = %w(sql09.raw sql10.raw sql11.raw)
9
10
 
10
11
  # current_fixture_index = 0
11
12
  current_fixture_index = File.read(fixtures_path+'/current_sql_index').to_i
13
+ raw_path = fixtures_path+raw_file_name[current_fixture_index]
12
14
 
13
- # show header of raw file and convert it hash and put it json-file
14
- File.open(fixtures_path+raw_path[current_fixture_index]) { |raw_io|
15
+ # show version of raw file
16
+ # signature: new(io)
17
+ # @param io [IO] IO-stream
18
+ # @return [SqlServerDts::RawFile]
19
+ File.open(raw_path) { |raw_io|
15
20
  raw_obj = SqlServerDts::RawFile.new(raw_io)
16
21
  puts "RAW VERSION: #{raw_obj.version}"
17
- puts '=== BEGIN HEADER ==='
18
- puts raw_obj.header
19
- File.open("#{fixtures_path+File.basename(raw_io.path, '.*')}_header.json",'wt') { |json_io|
20
- header_json = JSON.pretty_generate(raw_obj.header)
21
- json_io.write(header_json)
22
- }
23
- puts '=== END HEADER ==='
24
22
  }
25
23
 
26
- # show data of raw file in rows table and convert it hash and put it csv-file
27
- SqlServerDts::RawFile.new(fixtures_path+raw_path[current_fixture_index]) { |raw_obj, raw_io|
24
+ # show header of raw file and convert it into hash and save it as json-file
25
+ # signature: new(path)
26
+ # @param path [String] Path to raw file
27
+ # @return [SqlServerDts::RawFile]
28
+ raw_obj = SqlServerDts::RawFile.new(raw_path)
29
+ puts '=== BEGIN HEADER ==='
30
+ puts raw_obj.header
31
+ File.open("#{fixtures_path+File.basename(raw_path, '.*')}_header.json",'wt') { |json_io|
32
+ header_json = JSON.pretty_generate(raw_obj.header)
33
+ json_io.write(header_json)
34
+ }
35
+ puts '=== END HEADER ==='
36
+ # get current position into inner IO-stream object for further using
37
+ init_pos = raw_obj.pos
38
+ # need to close inner IO-stream object
39
+ raw_obj.close
40
+
41
+ # show data of raw file in rows table and convert it into hash and save it as csv-file
42
+ # signature: new(path,init_pos)
43
+ # @param path [String] Path to raw file
44
+ # @param init_pos [String] Init pos in raw file where data rows from
45
+ # @return [ [SqlServerDts::RawFile,IO] ] block_given? == true
46
+ SqlServerDts::RawFile.new(raw_path,init_pos) { |raw_obj, raw_io|
28
47
  puts '=== BEGIN DATA ==='
29
48
  i=0
30
49
  fields_arr = []
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sql-server-raw-file
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dmitriy Mullo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-14 00:00:00.000000000 Z
11
+ date: 2016-01-20 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Converts SQL Server Integration Services Raw File source to hash.
14
14
  email: