beezwax 0.7.0 → 0.7.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.
- data/VERSION +1 -1
- data/beezwax.gemspec +2 -2
- data/lib/btrieve/btrieve_extended.rb +8 -19
- data/lib/btrieve/btrieve_record.rb +18 -17
- data/lib/btrieve/btrieve_table.rb +28 -28
- data/test/btrieve/test_beezwax.rb +47 -35
- data/test/helper.rb +1 -0
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.1
|
data/beezwax.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{beezwax}
|
8
|
-
s.version = "0.7.
|
8
|
+
s.version = "0.7.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Patrick Lardin"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-03-19}
|
13
13
|
s.description = %q{Access Btrieve database files through a ruby API.}
|
14
14
|
s.email = %q{plardin@gmail.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -2,16 +2,16 @@ class BtrieveSearchBuffer
|
|
2
2
|
include Btrieve
|
3
3
|
COMPARISON = {:equal=>1,:greater_than=>2,:less_than=>3, :not_equal=>4, :greater_than_or_equal=>5, :less_than_or_equal=>6}
|
4
4
|
BOOLEAN = {:and=>1, :or=>2}
|
5
|
-
|
5
|
+
|
6
6
|
def initialize(table, filter, fields_to_return, records_to_fetch=10, start_point=:next_record, max_reject_count=0)
|
7
7
|
@table=table
|
8
8
|
@filter=filter
|
9
9
|
@records_to_fetch=records_to_fetch
|
10
10
|
@fields_to_return=fields_to_return
|
11
|
-
@start_point = start_point == :current_record ? 'UC' : 'EG'
|
11
|
+
@start_point = start_point == :current_record ? 'UC' : 'EG'
|
12
12
|
@max_reject_count=max_reject_count
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def get_encoded_buffer
|
16
16
|
filter_buff = []
|
17
17
|
@filter.each_with_index() do |token, i|
|
@@ -26,13 +26,11 @@ class BtrieveSearchBuffer
|
|
26
26
|
right_operand=[@table.schema[:columns][token[2]][:offset]].pack('S')
|
27
27
|
else
|
28
28
|
# We're comparing against a constant in the exact same format as the column itself
|
29
|
-
right_operand=@table.pack_value(column, token[2])
|
29
|
+
right_operand=@table.pack_value(column, token[2])
|
30
30
|
right_operand=right_operand.gsub("\x00",' ') if [0,11,12,21].include?(column[:datatype])
|
31
|
-
end
|
32
|
-
#filter_buff << "DATATYPE=#{column[:datatype]} SIZE=#{column[:size]} OFFSET=#{column[:offset]} COMPARISON=#{comparison} OPERAND=#{right_operand}"
|
31
|
+
end
|
33
32
|
filter_item = [column[:datatype], column[:size], column[:offset], comparison, 0].pack('CSSCC')
|
34
33
|
filter_item << right_operand
|
35
|
-
#p filter_item
|
36
34
|
filter_buff << filter_item
|
37
35
|
else
|
38
36
|
boolean = BOOLEAN[token]
|
@@ -40,31 +38,22 @@ class BtrieveSearchBuffer
|
|
40
38
|
end
|
41
39
|
end
|
42
40
|
num_logical_expressions = filter_buff.size
|
43
|
-
#p "num_logical_expressions = #{num_logical_expressions}"
|
44
|
-
#p filter_buff
|
45
41
|
result_descriptor=[@records_to_fetch, @fields_to_return.size].pack('SS')
|
46
|
-
#p "result_descriptor before = #{result_descriptor}"
|
47
42
|
@fields_to_return.inject(result_descriptor) do |desc, field|
|
48
43
|
column = @table.schema[:columns][field]
|
49
|
-
#p "#{field} => column[:size], column[:offset] = #{column[:size]}, #{column[:offset]}"
|
50
44
|
desc << [column[:size], column[:offset]].pack('SS')
|
51
45
|
desc
|
52
46
|
end
|
53
|
-
#p "result_descriptor after = #{result_descriptor}"
|
54
47
|
buffer_size=8+result_descriptor.size+filter_buff.join('').size
|
55
|
-
#p "buffer_size=#{buffer_size}"
|
56
48
|
search_buffer=[buffer_size, @start_point, @max_reject_count, num_logical_expressions].pack('Sa2SS')
|
57
|
-
#p "search_buffer.size=#{search_buffer.size}"
|
58
49
|
search_buffer << filter_buff.join('') << result_descriptor
|
59
|
-
#p "search_buffer.size=#{search_buffer.size}"
|
60
|
-
#p "buffer_size - search_buffer.size=#{buffer_size - search_buffer.size}"
|
61
50
|
search_buffer
|
62
51
|
end
|
63
|
-
|
52
|
+
|
64
53
|
private
|
65
|
-
|
54
|
+
|
66
55
|
def is_symbol?(arg)
|
67
56
|
arg.object_id == arg.to_sym.object_id rescue false
|
68
57
|
end
|
69
|
-
|
70
58
|
end
|
59
|
+
|
@@ -6,7 +6,7 @@ class BtrieveRecord
|
|
6
6
|
attr_reader :data_buffer, :btrieve_table
|
7
7
|
attr_accessor :position
|
8
8
|
|
9
|
-
# Initializes a btrieve record.
|
9
|
+
# Initializes a btrieve record.
|
10
10
|
def initialize(btrieve_table, data_buffer=nil)
|
11
11
|
@btrieve_table = btrieve_table
|
12
12
|
@data_buffer = data_buffer.nil? ? Btrieve.create_string_buffer(@btrieve_table.schema[:record_size]) : data_buffer
|
@@ -23,28 +23,28 @@ class BtrieveRecord
|
|
23
23
|
def update
|
24
24
|
new_state="#{@data_buffer}"
|
25
25
|
@data_buffer[0..3]=@position
|
26
|
-
btr_op(GET_DIRECT, @btrieve_table.pos_buffer, @data_buffer, NULL_BUFFER, SYSTEM_LOG_KEY)
|
26
|
+
btr_op(GET_DIRECT, @btrieve_table.pos_buffer, @data_buffer, NULL_BUFFER, SYSTEM_LOG_KEY)
|
27
27
|
btr_op(UPDATE, @btrieve_table.pos_buffer, new_state, NULL_BUFFER, SYSTEM_LOG_KEY)
|
28
28
|
set_physical_position
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
# Deletes an existing btrieve record through the transactional BTR engine.
|
32
32
|
def delete
|
33
33
|
@data_buffer[0..3]=@position
|
34
|
-
btr_op(GET_DIRECT, @btrieve_table.pos_buffer, @data_buffer, NULL_BUFFER, SYSTEM_LOG_KEY)
|
34
|
+
btr_op(GET_DIRECT, @btrieve_table.pos_buffer, @data_buffer, NULL_BUFFER, SYSTEM_LOG_KEY)
|
35
35
|
btr_op(DELETE, @btrieve_table.pos_buffer, NULL_BUFFER, NULL_BUFFER, NULL_KEY)
|
36
36
|
reset_physical_position
|
37
37
|
end
|
38
38
|
|
39
|
-
# Returns hash of column-value pairs for this btrieve record, given an array of named columns.
|
40
|
-
# If the array is nil, the hash will contain ALL the column-value pairs defined by the schema.
|
39
|
+
# Returns hash of column-value pairs for this btrieve record, given an array of named columns.
|
40
|
+
# If the array is nil, the hash will contain ALL the column-value pairs defined by the schema.
|
41
41
|
def values(column_names=nil)
|
42
42
|
if(column_names.nil?)
|
43
43
|
column_names=@btrieve_table.schema[:columns].keys.sort.inject([]){|array,column|array<< column;array}
|
44
|
-
end
|
44
|
+
end
|
45
45
|
column_names.inject({}){|vals, key| vals[key]=self[key]; vals}
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
# Sets the column valuesof this record based on the values passed through the 'column_values' map.
|
49
49
|
def values=(column_values)
|
50
50
|
column_values.each{ |key, value| self[key]=value }
|
@@ -54,16 +54,16 @@ class BtrieveRecord
|
|
54
54
|
def primary_key()
|
55
55
|
values(@btrieve_table.primary_key)
|
56
56
|
end
|
57
|
-
|
58
|
-
# Returns this record's value of the column passed in.
|
57
|
+
|
58
|
+
# Returns this record's value of the column passed in.
|
59
59
|
def [](key_name)
|
60
60
|
column = @btrieve_table.schema[:columns][key_name]
|
61
61
|
return nil if(column.nil?)
|
62
|
-
val = @data_buffer.unpack(column[:unpacker])[0]
|
62
|
+
val = @data_buffer.unpack(column[:unpacker])[0]
|
63
63
|
val = val.strip if val.respond_to?('strip')
|
64
64
|
val
|
65
65
|
end
|
66
|
-
|
66
|
+
|
67
67
|
# Sets this record's value for a particular column.
|
68
68
|
def []=(key_name, value)
|
69
69
|
column = @btrieve_table.schema[:columns][key_name]
|
@@ -72,32 +72,33 @@ class BtrieveRecord
|
|
72
72
|
range = (offset..offset+packed_value.size-1)
|
73
73
|
@data_buffer[range] = packed_value
|
74
74
|
end
|
75
|
-
|
75
|
+
|
76
76
|
# Determines if a record is nil.
|
77
77
|
def nil?()
|
78
78
|
@data_buffer.gsub("\x00", "").size==0
|
79
79
|
end
|
80
|
-
|
80
|
+
|
81
81
|
# Returns a string representation of this record.
|
82
82
|
def to_s()
|
83
83
|
@btrieve_table.schema[:columns].keys.inject("[position=>'#{position.unpack('i')[0]}'"){|pretty_print, key| pretty_print << ", #{key}=>'#{self[key]}'"; pretty_print } << "]"
|
84
84
|
end
|
85
85
|
|
86
|
-
# Returns this record's version as a MD5 Digest value.
|
86
|
+
# Returns this record's version as a MD5 Digest value.
|
87
87
|
def version()
|
88
88
|
Digest::MD5.hexdigest(@data_buffer)
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
# TODO - documentation
|
92
92
|
def set_physical_position
|
93
93
|
reset_physical_position
|
94
94
|
btr_op(GET_POSITION, @btrieve_table.pos_buffer, @position, NULL_BUFFER, NULL_KEY)
|
95
95
|
self
|
96
96
|
end
|
97
|
-
|
97
|
+
|
98
98
|
# TODO - documentation
|
99
99
|
def reset_physical_position
|
100
100
|
@position = Btrieve.create_string_buffer(RECORD_POSITION_SIZE)
|
101
101
|
end
|
102
102
|
|
103
103
|
end
|
104
|
+
|
@@ -24,13 +24,13 @@ class BtrieveTable
|
|
24
24
|
close()
|
25
25
|
end
|
26
26
|
end
|
27
|
-
|
27
|
+
|
28
28
|
# Finds an array of records in this table, using the specified index number and match hash.
|
29
29
|
# If a block is passed in, the entries of this set are passed into this block one by one. Otherwise,
|
30
|
-
# the set is returned to the caller.
|
30
|
+
# the set is returned to the caller.
|
31
31
|
def find(match, index_number, &block)
|
32
32
|
allows_duplicates=schema[:index_flags].map{|f|f&1==1;}[index_number]
|
33
|
-
set=nil
|
33
|
+
set=nil
|
34
34
|
if(allows_duplicates)
|
35
35
|
set=find_in_index(match, index_number)
|
36
36
|
else
|
@@ -46,8 +46,8 @@ class BtrieveTable
|
|
46
46
|
|
47
47
|
# Finds an array of records in this table, using the specified index number, a key and a range of values.
|
48
48
|
# If a block is passed in, the entries of this set are passed into this block one by one. Otherwise,
|
49
|
-
# the set is returned to the caller.
|
50
|
-
# WARNING - NO UNIT TEST EXIST YET!
|
49
|
+
# the set is returned to the caller.
|
50
|
+
# WARNING - NO UNIT TEST EXIST YET!
|
51
51
|
# CONSIDER - Deprecation coming soon... Should use the 'find_extended' method instead.
|
52
52
|
def find_in_range(index_num, key, range, &block)
|
53
53
|
index = @schema[:indices][index_num]
|
@@ -55,8 +55,8 @@ class BtrieveTable
|
|
55
55
|
index_values = index.inject([]){|vals,akey|vals << (akey == key ? range.first : nil); vals}
|
56
56
|
key_packer = index.inject("") do |packer, akey|
|
57
57
|
value_packer = BtrieveSchema.lookup(columns[akey][:datatype], columns[akey][:size])[:unpacker]
|
58
|
-
nil_packer = 'x'*columns[key][:size]
|
59
|
-
packer << (akey == key ? value_packer : nil_packer)
|
58
|
+
nil_packer = 'x'*columns[key][:size]
|
59
|
+
packer << (akey == key ? value_packer : nil_packer)
|
60
60
|
packer
|
61
61
|
end
|
62
62
|
key_buffer = index_values.pack(key_packer)
|
@@ -65,7 +65,7 @@ class BtrieveTable
|
|
65
65
|
batch do
|
66
66
|
btr_op(GET_GREATER_THAN_OR_EQUAL, @pos_buffer, btr_record.data_buffer, key_buffer, index_num, [OK, EOF])
|
67
67
|
while(range.include?(btr_record[key]))
|
68
|
-
if(!block.nil?)
|
68
|
+
if(!block.nil?)
|
69
69
|
yield btr_record
|
70
70
|
else
|
71
71
|
records << btr_record
|
@@ -74,12 +74,12 @@ class BtrieveTable
|
|
74
74
|
btr_op(GET_NEXT, @pos_buffer, btr_record.data_buffer, key_buffer, index_num, [OK, EOF])
|
75
75
|
end
|
76
76
|
end
|
77
|
-
if(block.nil?)
|
77
|
+
if(block.nil?)
|
78
78
|
records
|
79
79
|
end
|
80
80
|
end
|
81
81
|
|
82
|
-
# Closes this btrieve table to conclude a sequence of BTR operation(s).
|
82
|
+
# Closes this btrieve table to conclude a sequence of BTR operation(s).
|
83
83
|
def close
|
84
84
|
btr_op(CLOSE, @pos_buffer, NULL_BUFFER, NULL_BUFFER, NULL_KEY)
|
85
85
|
@pos_buffer=Btrieve.create_string_buffer(POS_BLOCK_SIZE)
|
@@ -102,11 +102,11 @@ class BtrieveTable
|
|
102
102
|
close
|
103
103
|
end
|
104
104
|
|
105
|
-
# Returns this table's version as a MD5 Digest value.
|
105
|
+
# Returns this table's version as a MD5 Digest value.
|
106
106
|
def version()
|
107
107
|
Digest::MD5.hexdigest(BtrieveSchema.sort(schema[:columns]).inject([]){|array,column|array << BtrieveSchema.readable_type(column);array}.to_s)
|
108
108
|
end
|
109
|
-
|
109
|
+
|
110
110
|
# Packs a value according to the metadata of a particular column.
|
111
111
|
def pack_value(column, value)
|
112
112
|
packer_string = column[:unpacker]
|
@@ -117,10 +117,10 @@ class BtrieveTable
|
|
117
117
|
array = [value]
|
118
118
|
array.pack(packer)
|
119
119
|
end
|
120
|
-
|
120
|
+
|
121
121
|
# Returns an array of hashes that match the criteria defined by the filter parameter.
|
122
122
|
# An example of the filter parameter is given below -
|
123
|
-
#
|
123
|
+
#
|
124
124
|
# filter = [[:dept_name, :equal, 'Philosophy'], :and, [:name, :not_equal, 'PHI 101'], :and, [:name, :not_equal, :dept_name]]
|
125
125
|
#
|
126
126
|
# The following COMPARISON operators are supported in the logical comparison clauses -
|
@@ -143,7 +143,7 @@ class BtrieveTable
|
|
143
143
|
start_point = :next_record
|
144
144
|
searcher = BtrieveSearchBuffer.new(self, filter, fields_to_return, records_to_fetch, max_reject_count, max_reject_count)
|
145
145
|
search_buffer = searcher.get_encoded_buffer
|
146
|
-
buff_diff = records_buffer - search_buffer.size
|
146
|
+
buff_diff = records_buffer - search_buffer.size
|
147
147
|
search_buffer << Btrieve.create_string_buffer(buff_diff) if(buff_diff > 0)
|
148
148
|
tmp_buff = Btrieve.create_string_buffer(record_size)
|
149
149
|
key_buff = Btrieve.create_string_buffer(record_size)
|
@@ -157,7 +157,7 @@ class BtrieveTable
|
|
157
157
|
record_position = search_buffer.unpack("@#{2+record_byte_pointer}i")[0]
|
158
158
|
record=search_buffer.unpack("@#{6+record_byte_pointer}a#{record_length}")[0]
|
159
159
|
record_byte_pointer += 6+record_length
|
160
|
-
unpacker = fields_to_return.inject(["", 0]) do |arr, c|
|
160
|
+
unpacker = fields_to_return.inject(["", 0]) do |arr, c|
|
161
161
|
column = @schema[:columns][c]
|
162
162
|
str = BtrieveSchema.unpacker(arr[1], column[:datatype], column[:size])
|
163
163
|
arr[0] << str
|
@@ -167,16 +167,16 @@ class BtrieveTable
|
|
167
167
|
fields = record.unpack(unpacker[0])
|
168
168
|
records << {:position=>record_position, :values=>Hash[*fields_to_return.zip(fields).flatten]}
|
169
169
|
end
|
170
|
-
records
|
170
|
+
records
|
171
171
|
end
|
172
|
-
|
172
|
+
|
173
173
|
private
|
174
174
|
|
175
175
|
def step_next
|
176
176
|
btr_record = BtrieveRecord.new(self)
|
177
177
|
result = btr_op(STEP_NEXT, @pos_buffer, btr_record.data_buffer, NULL_BUFFER, NULL_KEY, [OK, EOF])
|
178
178
|
return false if(result == EOF)
|
179
|
-
btr_record
|
179
|
+
btr_record.set_physical_position
|
180
180
|
end
|
181
181
|
|
182
182
|
def find_matching_index(match)
|
@@ -186,18 +186,18 @@ class BtrieveTable
|
|
186
186
|
raise Exception.new("No matching index for #{keys}")
|
187
187
|
end
|
188
188
|
|
189
|
-
INTEGER_TYPES=['TINYINT','SMALLINT','INTEGER','BIT','UTINYINT','USMALLINT','UINTEGER','UBIGINT']
|
189
|
+
INTEGER_TYPES=['TINYINT','SMALLINT','INTEGER','BIT','UTINYINT','USMALLINT','UINTEGER','UBIGINT']
|
190
190
|
FLOAT_TYPES=['REAL','DOUBLE']
|
191
191
|
def finder(match, index_number = nil, &block)
|
192
192
|
index_number ||= find_matching_index(match)
|
193
193
|
index = @schema[:indices][index_number]
|
194
194
|
columns = @schema[:columns]
|
195
|
-
key_components = index.inject([]) do |vals, key|
|
196
|
-
datatype = BtrieveSchema.lookup(columns[key][:datatype], columns[key][:size])[:name]
|
195
|
+
key_components = index.inject([]) do |vals, key|
|
196
|
+
datatype = BtrieveSchema.lookup(columns[key][:datatype], columns[key][:size])[:name]
|
197
197
|
value = match[key]
|
198
198
|
value = value.to_f if FLOAT_TYPES.include?(datatype)
|
199
199
|
value = value.to_i if INTEGER_TYPES.include?(datatype)
|
200
|
-
value = value.ljust(columns[key][:size], ' ') if datatype=='CHAR'
|
200
|
+
value = value.ljust(columns[key][:size], ' ') if datatype=='CHAR'
|
201
201
|
vals << value
|
202
202
|
vals
|
203
203
|
end
|
@@ -229,12 +229,12 @@ class BtrieveTable
|
|
229
229
|
finder(match, index_number) do |org_key_buffer, index|
|
230
230
|
absolute_match = match.keys.inject({}){|vals, key| vals[key] = match[key] if(match[key] != nil); vals}
|
231
231
|
absolute_match_keys = absolute_match.keys
|
232
|
-
result = []
|
232
|
+
result = []
|
233
233
|
batch do
|
234
234
|
key_buffer="#{org_key_buffer}"
|
235
235
|
ops_result = btr_op(GET_EQUAL_KEY, @pos_buffer, NULL_BUFFER, key_buffer, index, [OK, EOF, KEY_NOT_FOUND])
|
236
236
|
ops=GET_EQUAL
|
237
|
-
while(ops_result == OK)
|
237
|
+
while(ops_result == OK)
|
238
238
|
btr_record = BtrieveRecord.new(self)
|
239
239
|
ops_result = btr_op(ops, @pos_buffer, btr_record.data_buffer, key_buffer, index, [OK, EOF])
|
240
240
|
break if(key_buffer!=org_key_buffer)
|
@@ -244,13 +244,13 @@ class BtrieveTable
|
|
244
244
|
end
|
245
245
|
result
|
246
246
|
end
|
247
|
-
end
|
248
|
-
|
247
|
+
end
|
248
|
+
|
249
249
|
def session
|
250
250
|
s=BtrieveSession.get_session
|
251
251
|
raise "Cannot manipulate a BtrieveTable when no BtrieveSession exists." if s.nil?
|
252
252
|
s
|
253
253
|
end
|
254
|
-
|
254
|
+
|
255
255
|
end
|
256
256
|
|
@@ -5,27 +5,27 @@ class TestBeezwax < Test::Unit::TestCase
|
|
5
5
|
setup do
|
6
6
|
BtrieveSession.create_session(PSQL_DB)
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
teardown do
|
10
10
|
BtrieveSession.destroy_session
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
should "not allow the creation of another session" do
|
14
14
|
assert_raise(RuntimeError){BtrieveSession.create_session(PSQL_DB)}
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
should "return a handle to the session singleton" do
|
18
18
|
session=nil
|
19
19
|
assert_nothing_raised{session=BtrieveSession.get_session}
|
20
|
-
assert_not_nil session
|
20
|
+
assert_not_nil session
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
should "permit the instanciation of a DB table" do
|
24
24
|
table=nil
|
25
25
|
assert_nothing_raised{table=BtrieveTable.new(:course)}
|
26
26
|
assert_not_nil table
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
should "permit the instanciation of multiple instances for the same DB table" do
|
30
30
|
table0 = table1 = nil
|
31
31
|
assert_nothing_raised do
|
@@ -35,18 +35,18 @@ class TestBeezwax < Test::Unit::TestCase
|
|
35
35
|
assert_not_nil table0
|
36
36
|
assert_not_nil table1
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
should "allow an empty transaction to go through" do
|
40
40
|
assert_nothing_raised{BtrieveSession.transaction{}}
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
should "allow an empty transaction to go through, with explicit boundaries" do
|
44
44
|
assert_nothing_raised do
|
45
45
|
BtrieveSession.begin_transaction
|
46
46
|
BtrieveSession.end_transaction
|
47
47
|
end
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
should "allow a transaction to be aborted" do
|
51
51
|
assert_nothing_raised do
|
52
52
|
BtrieveSession.begin_transaction
|
@@ -54,44 +54,55 @@ class TestBeezwax < Test::Unit::TestCase
|
|
54
54
|
end
|
55
55
|
assert_raise(RuntimeError){BtrieveSession.end_transaction}
|
56
56
|
end
|
57
|
-
|
57
|
+
|
58
58
|
context "and an instance of BtrieveTable is created, it" do
|
59
59
|
setup do
|
60
60
|
@table=BtrieveTable.new(:course)
|
61
61
|
@table.primary_key = [:name]
|
62
62
|
end
|
63
|
-
|
63
|
+
|
64
64
|
teardown do
|
65
65
|
@table=nil
|
66
66
|
end
|
67
|
-
|
67
|
+
|
68
68
|
should "be possible to open it for operations, then close it" do
|
69
69
|
assert_nothing_raised{ @table.open }
|
70
70
|
assert_nothing_raised{ @table.close }
|
71
71
|
end
|
72
|
-
|
72
|
+
|
73
73
|
should "be possible to have the file automatically closed when a block is passed when opening a table" do
|
74
74
|
assert_nothing_raised{ @table.open{} }
|
75
75
|
assert_raise(RuntimeError){ @table.close }
|
76
76
|
end
|
77
|
-
|
77
|
+
|
78
78
|
should "return a version number for that table" do
|
79
79
|
table_version=nil
|
80
80
|
assert_nothing_raised{ table_version=@table.version }
|
81
81
|
assert_not_nil table_version
|
82
82
|
assert_equal 32, table_version.size
|
83
|
-
end
|
84
|
-
|
83
|
+
end
|
84
|
+
|
85
85
|
should "allow looping over each of its records to count them" do
|
86
86
|
counter = 0
|
87
87
|
assert_nothing_raised{@table.each_record{|record|counter+=1}}
|
88
88
|
assert_equal 145, counter
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
|
+
should "allow looping over each of its records to updated them" do
|
92
|
+
BtrieveSession.begin_transaction
|
93
|
+
i=0
|
94
|
+
@table.each_record do |record|
|
95
|
+
record[:description]="#{record[:description]} #{i}"
|
96
|
+
i += 1
|
97
|
+
record.update
|
98
|
+
end
|
99
|
+
BtrieveSession.abort_transaction
|
100
|
+
end
|
101
|
+
|
91
102
|
should "be possible to search the table for a given index" do
|
92
103
|
assert_nothing_raised {@table.find({:name=>'blah'}, 0)}
|
93
104
|
end
|
94
|
-
|
105
|
+
|
95
106
|
should "be possible to find a particular record in a unique index" do
|
96
107
|
name = 'PHI 101'
|
97
108
|
record = nil
|
@@ -99,10 +110,10 @@ class TestBeezwax < Test::Unit::TestCase
|
|
99
110
|
assert_nothing_raised{record=@table.find({:name=>name}, 0).first}
|
100
111
|
assert_not_nil record
|
101
112
|
assert_nothing_raised{record_name=record[:name]}
|
102
|
-
assert_not_nil record_name
|
113
|
+
assert_not_nil record_name
|
103
114
|
assert_equal record_name, name
|
104
115
|
end
|
105
|
-
|
116
|
+
|
106
117
|
should "be possible to search for a unique key that doesn't exist and not cause an exception" do
|
107
118
|
name = 'FRA 333'
|
108
119
|
records=@table.find({:name=>name}, 0)
|
@@ -118,31 +129,31 @@ class TestBeezwax < Test::Unit::TestCase
|
|
118
129
|
assert_equal 9, records.size
|
119
130
|
assert records.inject(true){|test, record| test |= record[:dept_name]==dept_name; test}
|
120
131
|
end
|
121
|
-
|
132
|
+
|
122
133
|
should "support finding records and looping over them if a block is passed in" do
|
123
134
|
dept_name = 'Mathematics'
|
124
|
-
counter = 0
|
135
|
+
counter = 0
|
125
136
|
assert_nothing_raised{@table.find({:dept_name=>dept_name}, 1){counter += 1}}
|
126
137
|
assert_equal 9, counter
|
127
138
|
end
|
128
|
-
|
139
|
+
|
129
140
|
should "be possible to search for a key that doesn't exit and not cause an exception" do
|
130
141
|
dept_name = 'Francais'
|
131
142
|
records=@table.find({:dept_name=>dept_name}, 1)
|
132
143
|
assert_not_nil records
|
133
144
|
assert records.empty?, "records is NOT empty"
|
134
145
|
end
|
135
|
-
|
146
|
+
|
136
147
|
context "and an instance of BtrieveRecord is fetched, it" do
|
137
148
|
setup do
|
138
149
|
@name = 'PHI 101'
|
139
150
|
@record=@table.find({:name=>@name}, 0).first
|
140
151
|
end
|
141
|
-
|
152
|
+
|
142
153
|
teardown do
|
143
154
|
@record=nil
|
144
155
|
end
|
145
|
-
|
156
|
+
|
146
157
|
should "be possible to get the record's primary key" do
|
147
158
|
expected_value = {:name=>@name}
|
148
159
|
pk = nil
|
@@ -150,7 +161,7 @@ class TestBeezwax < Test::Unit::TestCase
|
|
150
161
|
assert_not_nil pk
|
151
162
|
assert_equal expected_value, pk
|
152
163
|
end
|
153
|
-
|
164
|
+
|
154
165
|
should "be possible retrieve all its columns" do
|
155
166
|
expected_values={:name=>@name, :description=>'Introduction to Ethics', :credit_hours=>3, :dept_name=>'Philosophy'}
|
156
167
|
values = nil
|
@@ -158,7 +169,7 @@ class TestBeezwax < Test::Unit::TestCase
|
|
158
169
|
assert_not_nil values
|
159
170
|
assert_equal expected_values, values
|
160
171
|
end
|
161
|
-
|
172
|
+
|
162
173
|
should "be possible retrieve a subset of its columns" do
|
163
174
|
expected_values={:description=>'Introduction to Ethics', :credit_hours=>3}
|
164
175
|
values = nil
|
@@ -167,13 +178,13 @@ class TestBeezwax < Test::Unit::TestCase
|
|
167
178
|
assert_equal expected_values, values
|
168
179
|
end
|
169
180
|
end
|
170
|
-
|
181
|
+
|
171
182
|
context "for a BtrieveRecord to be created, it" do
|
172
183
|
setup do
|
173
184
|
@values={:name=>'FRA 303', :description=>'Francais Avance', :credit_hours=>3, :dept_name=>"Latin".force_encoding("ASCII-8BIT")}
|
174
185
|
@rb_values={:name=>'FRE 303', :description=>'Frenceis Evence', :credit_hours=>3, :dept_name=>'Latin'}
|
175
186
|
end
|
176
|
-
|
187
|
+
|
177
188
|
teardown do
|
178
189
|
# meh
|
179
190
|
end
|
@@ -234,7 +245,7 @@ class TestBeezwax < Test::Unit::TestCase
|
|
234
245
|
assert str.size > 0
|
235
246
|
end
|
236
247
|
end
|
237
|
-
end
|
248
|
+
end
|
238
249
|
assert_nothing_raised{ new_record = @table.find({:name=>'FRA 303'}, 0).first }
|
239
250
|
assert_not_nil new_record
|
240
251
|
assert_nothing_raised { new_values = new_record.values }
|
@@ -250,20 +261,20 @@ class TestBeezwax < Test::Unit::TestCase
|
|
250
261
|
assert_nil new_record
|
251
262
|
end
|
252
263
|
end
|
253
|
-
end
|
264
|
+
end
|
254
265
|
end
|
255
|
-
|
266
|
+
|
256
267
|
context "A destroyed BtrieveSession" do
|
257
268
|
setup do
|
258
269
|
BtrieveSession.create_session(PSQL_DB)
|
259
270
|
@table = BtrieveTable.new(:course)
|
260
271
|
BtrieveSession.destroy_session
|
261
272
|
end
|
262
|
-
|
273
|
+
|
263
274
|
should "not allow the instanciation of a DB table" do
|
264
275
|
assert_raise(RuntimeError){BtrieveTable.new(:course)}
|
265
276
|
end
|
266
|
-
|
277
|
+
|
267
278
|
should "not allow exsting tables to search against the DB" do
|
268
279
|
records=nil
|
269
280
|
assert_raise(RuntimeError){records=@table.find({:dept_name=>'Mathematics'}, 1)}
|
@@ -271,3 +282,4 @@ class TestBeezwax < Test::Unit::TestCase
|
|
271
282
|
end
|
272
283
|
end
|
273
284
|
end
|
285
|
+
|
data/test/helper.rb
CHANGED
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 7
|
8
|
-
-
|
9
|
-
version: 0.7.
|
8
|
+
- 1
|
9
|
+
version: 0.7.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Patrick Lardin
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-03-19 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|