binaryparse 0.1.0 → 0.1.2
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/binaryparse.gemspec +17 -17
- data/doc/binaryparse.chm +0 -0
- data/doc/bphelp.zip +0 -0
- data/doc/classes/BinaryBlocker/BitFieldEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/Blocker.html +1 -1
- data/doc/classes/BinaryBlocker/CountedArrayEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/Encoder.html +1 -1
- data/doc/classes/BinaryBlocker/FixedArrayEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/FixedStringEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/FixedUTF16StringEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/GroupEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/ListOfEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/OneOfEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/PackedDateEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/PackedDateTimeEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/PackedNumberEncoder.html +1 -1
- data/doc/classes/BinaryBlocker/SimpleEncoder.html +1 -1
- data/doc/classes/BinaryBlocker.html +1 -1
- data/doc/classes/BufferedIO.html +1 -1
- data/doc/classes/TestBlocker/BBDate.html +1 -1
- data/doc/classes/TestBlocker/BBList.html +1 -1
- data/doc/classes/TestBlocker/BBPacked.html +1 -1
- data/doc/classes/TestBlocker/BBString.html +1 -1
- data/doc/classes/TestBlocker/BBSub1.html +1 -1
- data/doc/classes/TestBlocker/BBSub2.html +1 -1
- data/doc/classes/TestBlocker/BBTest1.html +1 -1
- data/doc/classes/TestBlocker/BBTest2.html +1 -1
- data/doc/classes/TestBlocker/BBTest3.html +1 -1
- data/doc/classes/TestBlocker/BBTest4.html +1 -1
- data/doc/classes/TestBlocker/BBTest5.html +1 -1
- data/doc/classes/TestBlocker/BBTest6.html +1 -1
- data/doc/classes/TestBlocker/BBTest7.html +1 -1
- data/doc/classes/TestBlocker/BBTime.html +1 -1
- data/doc/classes/TestBlocker/BBUTF16.html +1 -1
- data/doc/classes/TestBlocker/ItemA.html +1 -1
- data/doc/classes/TestBlocker/ItemB.html +1 -1
- data/doc/classes/TestBlocker.html +1 -1
- data/doc/contents.hhc +670 -0
- data/doc/created.rid +1 -1
- data/doc/files/lib/blocker_rb.html +1 -1
- data/doc/files/lib/buffered_io_rb.html +1 -1
- data/doc/files/test/test_blocker_rb.html +1 -1
- data/doc/index.hhk +599 -0
- data/doc/rdoc.hhp +15 -0
- data/examples/cmasqls.rb +82 -0
- data/examples/readme.txt +2 -0
- data/lib/blocker.rb +13 -2
- data/test/test_blocker.rb +25 -1
- metadata +9 -2
data/examples/cmasqls.rb
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'blocker'
|
2
|
+
require 'stringio'
|
3
|
+
|
4
|
+
class CMASqlHeader < BinaryBlocker::Blocker
|
5
|
+
has_one :record_type, :uint8, :key => 0
|
6
|
+
has_one :register, :uint32
|
7
|
+
has_one :transno, :uint32
|
8
|
+
has_one :trandate, :string, :length => 8
|
9
|
+
has_one :trantime, :string, :length => 4
|
10
|
+
has_one :datasource, :string, :length => 64
|
11
|
+
end
|
12
|
+
|
13
|
+
class CMASqlStmt < BinaryBlocker::Blocker
|
14
|
+
has_one :record_type, :uint8, :key => 1
|
15
|
+
has_one :sql_flags, :uint32
|
16
|
+
has_one :sequence, :uint32
|
17
|
+
has_one :stmt, :string, :length => 80
|
18
|
+
end
|
19
|
+
|
20
|
+
class CMASqlTrailer < BinaryBlocker::Blocker
|
21
|
+
has_one :record_type, :uint8, :key => 99
|
22
|
+
has_one :register, :uint32
|
23
|
+
has_one :transno, :uint32
|
24
|
+
has_one :delim, :string, :length => 3, :key => "\xde\r\n"
|
25
|
+
end
|
26
|
+
|
27
|
+
class CMASQLRec < BinaryBlocker::Blocker
|
28
|
+
has_one :header, CMASqlHeader
|
29
|
+
has_list_of :items, [CMASqlStmt]
|
30
|
+
has_one :footer, CMASqlTrailer
|
31
|
+
|
32
|
+
StatementStruct = Struct.new(:sql, :flags)
|
33
|
+
def statements
|
34
|
+
stmts = []
|
35
|
+
stmt = StatementStruct.new("")
|
36
|
+
items.each do |item|
|
37
|
+
stmt.flags = item.sql_flags unless stmt.flags
|
38
|
+
stmt.sql += item.stmt
|
39
|
+
|
40
|
+
if item.sequence == 0
|
41
|
+
stmts << stmt
|
42
|
+
stmt = StatementStruct.new("")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
stmts
|
46
|
+
end
|
47
|
+
|
48
|
+
def inspect
|
49
|
+
result = StringIO.new
|
50
|
+
result.puts "Header: #{header.datasource}"
|
51
|
+
statements.each do |item|
|
52
|
+
result.puts "Stmt (#{item.flags}): #{item.sql}"
|
53
|
+
end
|
54
|
+
result.puts "Trailer: #{footer.record_type}"
|
55
|
+
result.string
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Note using binary blocker to parse out "junk" is pretty expensive, but
|
60
|
+
# then again you only pay the time when there is an error, so it might not
|
61
|
+
# be a bad idea
|
62
|
+
class CMASQLJunk < BinaryBlocker::Blocker
|
63
|
+
has_one :junk, :int8
|
64
|
+
end
|
65
|
+
|
66
|
+
class CMASQLSmartRec < BinaryBlocker::Blocker
|
67
|
+
has_one_of :rec, [CMASQLRec, CMASqlTrailer, CMASQLJunk]
|
68
|
+
end
|
69
|
+
|
70
|
+
def read_trans(io)
|
71
|
+
CMASQLRec.new(io)
|
72
|
+
end
|
73
|
+
|
74
|
+
File.open("cmasqls.dat", "rb") do |sqldat|
|
75
|
+
until sqldat.eof?
|
76
|
+
start = sqldat.pos
|
77
|
+
rec = CMASQLSmartRec.new(sqldat)
|
78
|
+
next if CMASQLJunk === rec.rec
|
79
|
+
puts "#{rec.rec.class}: #{start}-#{sqldat.pos}"
|
80
|
+
p rec.rec
|
81
|
+
end
|
82
|
+
end
|
data/examples/readme.txt
ADDED
data/lib/blocker.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
# might include files with headers and a variable number of body records
|
5
5
|
# followed by a footer. It also supports, packed numeric
|
6
6
|
# (BinaryBlocker::PackedNumberEncoder) and date fields
|
7
|
-
# (BinaryBlocker::PackedDateEncoder)
|
7
|
+
# (BinaryBlocker::PackedDateEncoder)
|
8
8
|
|
9
9
|
require 'uconv'
|
10
10
|
require 'date'
|
@@ -81,6 +81,7 @@ module BinaryBlocker
|
|
81
81
|
# This is the base class for all the various encoders. It supports a variety
|
82
82
|
# of options (as Symbols in a Hash):
|
83
83
|
#
|
84
|
+
# default:: used as the default value for the element
|
84
85
|
# pre_block:: passed the value before being blocked
|
85
86
|
# post_block:: passed the blocked value before returned
|
86
87
|
# pre_deblock:: passed the io before attempting to deblock it (hard to imagine
|
@@ -97,6 +98,7 @@ module BinaryBlocker
|
|
97
98
|
#
|
98
99
|
# Options (lambda):
|
99
100
|
#
|
101
|
+
# default:: used as the default value for the element
|
100
102
|
# pre_block:: passed the value before being blocked
|
101
103
|
# post_block:: passed the blocked value before returned
|
102
104
|
# pre_deblock:: passed the io before attempting to deblock it (hard to imagine
|
@@ -170,6 +172,7 @@ module BinaryBlocker
|
|
170
172
|
opts = opts.find { |o| o.respond_to? :to_hash }
|
171
173
|
if opts
|
172
174
|
@opts = @opts.merge(opts)
|
175
|
+
@value = @opts[:default]
|
173
176
|
@pre_block = @opts[:pre_block]
|
174
177
|
@pre_deblock = @opts[:pre_deblock]
|
175
178
|
|
@@ -348,7 +351,11 @@ module BinaryBlocker
|
|
348
351
|
end
|
349
352
|
|
350
353
|
def internal_block(val)
|
351
|
-
|
354
|
+
if val.nil?
|
355
|
+
[val.to_i].pack(@format)
|
356
|
+
else
|
357
|
+
[val].pack(@format)
|
358
|
+
end
|
352
359
|
end
|
353
360
|
|
354
361
|
def internal_deblock(io)
|
@@ -603,6 +610,10 @@ module BinaryBlocker
|
|
603
610
|
@value[offset] = val
|
604
611
|
end
|
605
612
|
|
613
|
+
def each
|
614
|
+
@value.each { |v| yield v }
|
615
|
+
end
|
616
|
+
|
606
617
|
def <<(val)
|
607
618
|
@value << val
|
608
619
|
end
|
data/test/test_blocker.rb
CHANGED
@@ -408,5 +408,29 @@ class TestBlocker < Test::Unit::TestCase
|
|
408
408
|
assert_equal(b2.items[4].name, ib.name)
|
409
409
|
assert_equal(b2.items[5].name, ib.name)
|
410
410
|
end
|
411
|
-
|
411
|
+
|
412
|
+
class BBDefaultTest < BinaryBlocker::Blocker
|
413
|
+
has_one :foo, :int16, :default => 7
|
414
|
+
has_one :bar, :int16
|
415
|
+
has_one :str, :string, :length => 20, :default => 'troaeipo'
|
416
|
+
end
|
417
|
+
|
418
|
+
def test_default
|
419
|
+
b = BBDefaultTest.new
|
420
|
+
assert_equal(7, b.foo)
|
421
|
+
assert_equal(nil, b.bar)
|
422
|
+
assert_equal('troaeipo', b.str)
|
423
|
+
|
424
|
+
b.foo = nil
|
425
|
+
assert_equal(nil, b.foo)
|
426
|
+
b.bar = 3
|
427
|
+
|
428
|
+
buf = b.block
|
429
|
+
|
430
|
+
b2 = BBDefaultTest.new(buf)
|
431
|
+
assert_equal(0, b2.foo)
|
432
|
+
assert_equal(3, b2.bar)
|
433
|
+
assert_equal('troaeipo', b2.str)
|
434
|
+
end
|
412
435
|
|
436
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: binaryparse
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2006-08-
|
6
|
+
version: 0.1.2
|
7
|
+
date: 2006-08-29 00:00:00 -04:00
|
8
8
|
summary: Binaryparse is a simple Ruby DSL to parse semi-complicated binary structures. This includes structures dynamic in length, which cannot be handled by DL::Struct or BitStructEx.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,15 +34,20 @@ files:
|
|
34
34
|
- examples
|
35
35
|
- lib
|
36
36
|
- test
|
37
|
+
- doc/binaryparse.chm
|
38
|
+
- doc/bphelp.zip
|
37
39
|
- doc/classes
|
40
|
+
- doc/contents.hhc
|
38
41
|
- doc/created.rid
|
39
42
|
- doc/dot
|
40
43
|
- doc/files
|
41
44
|
- doc/fr_class_index.html
|
42
45
|
- doc/fr_file_index.html
|
43
46
|
- doc/fr_method_index.html
|
47
|
+
- doc/index.hhk
|
44
48
|
- doc/index.html
|
45
49
|
- doc/rdoc-style.css
|
50
|
+
- doc/rdoc.hhp
|
46
51
|
- doc/classes/BinaryBlocker
|
47
52
|
- doc/classes/BinaryBlocker.html
|
48
53
|
- doc/classes/BufferedIO.html
|
@@ -92,6 +97,8 @@ files:
|
|
92
97
|
- doc/files/lib/blocker_rb.html
|
93
98
|
- doc/files/lib/buffered_io_rb.html
|
94
99
|
- doc/files/test/test_blocker_rb.html
|
100
|
+
- examples/cmasqls.rb
|
101
|
+
- examples/readme.txt
|
95
102
|
- lib/blocker.rb
|
96
103
|
- lib/buffered_io.rb
|
97
104
|
- test/test_blocker.rb
|