hypersonicplus 0.0.0
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.
- checksums.yaml +7 -0
- data/lib/hdatastructures/hfieldtable.rb +285 -0
- data/lib/hdatastructures/hhash.rb +9 -0
- data/lib/hdatastructures/hlist.rb +100 -0
- data/lib/hdatastructures/hrecord.rb +75 -0
- data/lib/hdatastructures/hspreadfieldtable.rb +129 -0
- data/lib/hdb/hdataloader.rb +75 -0
- data/lib/hdb/hdb.rb +357 -0
- data/lib/hdb/hdb_test.rb +248 -0
- data/lib/hdb/hdbgenerator.rb +211 -0
- data/lib/hdb/hdbi.rb +63 -0
- data/lib/hdb/hdbi_test.rb +133 -0
- data/lib/hdb/hfield.rb +180 -0
- data/lib/hdb/hmysql.rb +99 -0
- data/lib/hdb/hmysql2.rb +96 -0
- data/lib/hdb/hodb.rb +948 -0
- data/lib/hdb/hpgsql.rb +54 -0
- data/lib/hengine/application_controller.rb +204 -0
- data/lib/hengine/hconfiguration.rb +40 -0
- data/lib/hengine/hhotlogger.rb +13 -0
- data/lib/hengine/hlogger.rb +119 -0
- data/lib/hengine/hmalloc.rb +275 -0
- data/lib/hengine/hmoduleloader.rb +15 -0
- data/lib/hengine/hsessiondata.rb +79 -0
- data/lib/hengine/hshareddata.rb +60 -0
- data/lib/hengine/htranslate.rb +40 -0
- data/lib/hengine/hviewloader.rb +99 -0
- data/lib/hinit/hinit.rb +3 -0
- data/lib/hmisc/hcolorize.rb +100 -0
- data/lib/hmisc/hdecoratorfunctions.rb +15 -0
- data/lib/hmisc/hdir.rb +19 -0
- data/lib/hmisc/hhtmlnode.rb +27 -0
- data/lib/hmisc/hinputvalidator.rb +95 -0
- data/lib/hmisc/hio.rb +142 -0
- data/lib/hmisc/hjson.rb +16 -0
- data/lib/hsqlmanager/hpgsqldatabasemanager.rb +76 -0
- data/lib/hsqlmanager/hsqldatabasemanager.rb +349 -0
- data/lib/hsqlmanager/hsqltable.rb +16 -0
- data/lib/husermanager/husermanager.rb +122 -0
- data/lib/hwidgets/haccordionmenu.rb +117 -0
- data/lib/hwidgets/hcheckboxtag.rb +33 -0
- data/lib/hwidgets/hdbactionbuttons.rb +26 -0
- data/lib/hwidgets/hdbcombobox.rb +71 -0
- data/lib/hwidgets/hdbdialogview.rb +190 -0
- data/lib/hwidgets/hdbfilterview.rb +28 -0
- data/lib/hwidgets/hdbtableview.rb +213 -0
- data/lib/hwidgets/hdbview.rb +63 -0
- data/lib/hwidgets/hdivtag.rb +9 -0
- data/lib/hwidgets/hdropdown.rb +44 -0
- data/lib/hwidgets/hformfield.rb +91 -0
- data/lib/hwidgets/hgrouptag.rb +65 -0
- data/lib/hwidgets/hhiddeninputtag.rb +12 -0
- data/lib/hwidgets/hinputtag.rb +55 -0
- data/lib/hwidgets/hlabeltag.rb +30 -0
- data/lib/hwidgets/hmainview.rb +37 -0
- data/lib/hwidgets/hpagination.rb +65 -0
- data/lib/hwidgets/hradiobuttontag.rb +30 -0
- data/lib/hwidgets/hselecttag.rb +32 -0
- data/lib/hwidgets/htableview.rb +262 -0
- data/lib/hwidgets/htabview.rb +84 -0
- data/lib/hwidgets/htextareatag.rb +20 -0
- data/lib/hwidgets/htopnav.rb +85 -0
- data/lib/hwidgets/hwidget.rb +423 -0
- data/lib/hypersonic.rb +9 -0
- metadata +276 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d02a76ade2c3fd0823135b4ed32a95a7fa45ccc3
|
4
|
+
data.tar.gz: dce1adec8a541f3bd0ac06f925089e43c0ff52e3
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: da75264685bd8a5cf1ae42c5616abe0d94c84358ccbcc866b1bab7db1e7024abf94484ed0262878e1eddf1b6f275691466441cfd10902ea7b0edce6ea658f105
|
7
|
+
data.tar.gz: a336abcd206d1490f615293e5269bbd2e1a72197d85e5564394f6d3134fe662547ca48239662e3f1fc0b359251e22afeba0e2166928e106e7a6125256aeb6eda
|
@@ -0,0 +1,285 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'hdatastructures/hlist'
|
3
|
+
require 'hmisc/hcolorize'
|
4
|
+
|
5
|
+
class HFieldTable < Array
|
6
|
+
|
7
|
+
attr_accessor :tableName, :allRows, :allCols
|
8
|
+
|
9
|
+
def initialize(allRows = false, allCols = false)
|
10
|
+
@tableName = nil
|
11
|
+
@fields = {}
|
12
|
+
@allRows = allRows
|
13
|
+
@allCols = allCols
|
14
|
+
end
|
15
|
+
|
16
|
+
def copyConstructor
|
17
|
+
Marshal.load(Marshal.dump(self))
|
18
|
+
end
|
19
|
+
|
20
|
+
def fields()
|
21
|
+
result = {}
|
22
|
+
@fields.each do |fieldName, fieldValue|
|
23
|
+
result[fieldName] = fieldValue if fieldValue.visible or @allCols
|
24
|
+
end
|
25
|
+
return result
|
26
|
+
end
|
27
|
+
|
28
|
+
def addFieldName(fieldName, visible = true)
|
29
|
+
record = HRecord.new(fieldName) unless @fields[fieldName]
|
30
|
+
record.set(:visible, visible)
|
31
|
+
@fields[fieldName] = record
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_missing(methodName, *args)
|
35
|
+
|
36
|
+
if methodName.to_s =~ /^setField(.+)$/ # example: setFieldCaption(fieldName, fieldCaption)
|
37
|
+
@fields[args[0]].set($1.downcase().to_sym, args[1])
|
38
|
+
else
|
39
|
+
caller_infos = caller.first.split(":")
|
40
|
+
puts "Error: #{caller_infos[0]}:#{caller_infos[1]} - #{methodName} not found".hight_red()
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def rowCount()
|
46
|
+
return self.length()
|
47
|
+
end
|
48
|
+
|
49
|
+
def columnCount()
|
50
|
+
return @fields.length()
|
51
|
+
end
|
52
|
+
|
53
|
+
def columnCountByKey(key = :visible)
|
54
|
+
return self.columnCount if @allCols
|
55
|
+
i = 0
|
56
|
+
@fields.each { |fieldName, fieldValue| i += 1 if fieldValue.value(key) }
|
57
|
+
return i
|
58
|
+
end
|
59
|
+
|
60
|
+
def setData(row, fieldName, data)
|
61
|
+
self[row][fieldName] = data
|
62
|
+
end
|
63
|
+
|
64
|
+
# Inserts a new row filled with data
|
65
|
+
def insertRow(row, data = nil)
|
66
|
+
tmp = @fields.dup
|
67
|
+
self.insert(row, tmp.each { |k, v| tmp[k] = data } )
|
68
|
+
end
|
69
|
+
|
70
|
+
def deleteRow(row)
|
71
|
+
self.delete_at(row)
|
72
|
+
end
|
73
|
+
|
74
|
+
def setDataByFieldName(row, fieldName, data)
|
75
|
+
self.setData(row, fieldName, data)
|
76
|
+
end
|
77
|
+
|
78
|
+
def setIntoRecordByFieldName(row, fieldName, data)
|
79
|
+
self.setDataByFieldName(row, fieldName, HRecord.new(data))
|
80
|
+
end
|
81
|
+
|
82
|
+
def setCaption
|
83
|
+
self.fields.each do |fieldName, fieldValue|
|
84
|
+
self.setFieldCaption(fieldName, fieldValue.value.hcapitalize())
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def [](fieldName)
|
89
|
+
self[fieldName] = {} unless super(fieldName)
|
90
|
+
return super(fieldName)
|
91
|
+
end
|
92
|
+
|
93
|
+
def data(row, fieldName)
|
94
|
+
return self[row][fieldName]
|
95
|
+
end
|
96
|
+
|
97
|
+
def dataByFieldName(row, fieldName)
|
98
|
+
return self.data(row, fieldName)
|
99
|
+
end
|
100
|
+
|
101
|
+
def valueByFieldName(row, fieldName)
|
102
|
+
value = self.data(row, fieldName)
|
103
|
+
value = value.value() if (value.class == HRecord)
|
104
|
+
return value
|
105
|
+
end
|
106
|
+
|
107
|
+
def row(row)
|
108
|
+
#return self[row] if @allCols
|
109
|
+
result = {}
|
110
|
+
@fields.each do |fieldName, fieldValue|
|
111
|
+
result[fieldName] = self.dataByFieldName(row, fieldName) if fieldValue.visible or @allCols
|
112
|
+
end
|
113
|
+
return result
|
114
|
+
end
|
115
|
+
|
116
|
+
def match(row)
|
117
|
+
@fields.each do |fieldName, fieldValue|
|
118
|
+
filter = fieldValue.filter
|
119
|
+
next unless filter
|
120
|
+
data = self.dataByFieldName(row, fieldName)
|
121
|
+
return false unless data
|
122
|
+
data = HRecord.new(data) if data.class != HRecord
|
123
|
+
filter = HRecord.new(filter) if filter.class != HRecord
|
124
|
+
return false if data != filter
|
125
|
+
end
|
126
|
+
return true
|
127
|
+
|
128
|
+
end
|
129
|
+
|
130
|
+
def each()
|
131
|
+
for i in 0...self.rowCount() do
|
132
|
+
row = self.row(i)
|
133
|
+
yield(row, i) if @allRows or self.match(i)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
def rowWithFieldName(row)
|
138
|
+
result = {}
|
139
|
+
self[row].each do |fieldName, fieldValue|
|
140
|
+
field = @fields[fieldName]
|
141
|
+
result[fieldName] = fieldValue if field.visible or @allCols
|
142
|
+
end
|
143
|
+
return result
|
144
|
+
end
|
145
|
+
|
146
|
+
def eachWithFieldName()
|
147
|
+
for i in 0...self.rowCount() do
|
148
|
+
row = self.rowWithFieldName(i)
|
149
|
+
yield(row, i) if @allRows or self.match(i)
|
150
|
+
end
|
151
|
+
end
|
152
|
+
|
153
|
+
|
154
|
+
def sumByFieldName(fieldName)
|
155
|
+
|
156
|
+
total = 0
|
157
|
+
for i in 0...self.rowCount() do
|
158
|
+
total += (self.dataByFieldName(i, fieldName)).to_f
|
159
|
+
end
|
160
|
+
return total
|
161
|
+
|
162
|
+
end
|
163
|
+
|
164
|
+
def valueByType(fieldName, fieldValue)
|
165
|
+
|
166
|
+
return nil unless fieldValue
|
167
|
+
type = @fields[fieldName].value(:type) if @fields[fieldName]
|
168
|
+
value = fieldValue.value
|
169
|
+
return value unless type
|
170
|
+
return value.to_s if type == "text"
|
171
|
+
return value.to_i if type == "integer"
|
172
|
+
return value.to_f if type == "float"
|
173
|
+
return value.to_date() if type == "date"
|
174
|
+
return value.to_datetime() if type == "datetime"
|
175
|
+
return value.to_s
|
176
|
+
|
177
|
+
end
|
178
|
+
|
179
|
+
# fieldTable.sortBy("price")
|
180
|
+
# fieldTable.sortBy("price", "amount")
|
181
|
+
# fieldTable.sortBy("price", "amount", asc: false)
|
182
|
+
def sortBy(*fieldNames, asc: true)
|
183
|
+
#self.herbertsort!(asc) { |row| fieldNames.map {|fieldName| row[fieldName]} }
|
184
|
+
self.herbertsort!(asc) { |row| fieldNames.map {|fieldName| self.valueByType(fieldName, row[fieldName])} }
|
185
|
+
end
|
186
|
+
|
187
|
+
def showHeader(key = :key)
|
188
|
+
self.fields.each do |fieldName, fieldValue|
|
189
|
+
print $hpformat % fieldValue.value(key)
|
190
|
+
end
|
191
|
+
puts
|
192
|
+
end
|
193
|
+
|
194
|
+
def showData(data, key = :key)
|
195
|
+
|
196
|
+
if !data
|
197
|
+
print $hpformat % "." unless data
|
198
|
+
elsif data.class == Fixnum or data.class == String
|
199
|
+
print $hpformat % data
|
200
|
+
else
|
201
|
+
data.show(key)
|
202
|
+
end
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
def showTotalizers()
|
207
|
+
|
208
|
+
@fields.each do |fieldName, fieldValue|
|
209
|
+
totalizerName = fieldValue.totalizer
|
210
|
+
if totalizerName
|
211
|
+
print $hpformat % totalizerName
|
212
|
+
print $hpformat % self.sumByFieldName(fieldName)
|
213
|
+
puts
|
214
|
+
end
|
215
|
+
end
|
216
|
+
puts
|
217
|
+
|
218
|
+
end
|
219
|
+
|
220
|
+
|
221
|
+
def show(key = :key)
|
222
|
+
print "=============> HFieldTable <==============\n"
|
223
|
+
self.showHeader(:caption)
|
224
|
+
self.each do |row, i|
|
225
|
+
row.each do |fieldName, fieldValue|
|
226
|
+
self.showData(fieldValue)
|
227
|
+
end
|
228
|
+
puts
|
229
|
+
end
|
230
|
+
puts
|
231
|
+
end
|
232
|
+
|
233
|
+
|
234
|
+
def self.test()
|
235
|
+
|
236
|
+
table = HFieldTable.new()
|
237
|
+
table.setData(0, 0, HRecord.new("0x0"))
|
238
|
+
table.setData(10, 1, HRecord.new("10x1"))
|
239
|
+
table.setData(9, 9, HRecord.new("9x9"))
|
240
|
+
table.show()
|
241
|
+
end
|
242
|
+
|
243
|
+
def self.test2()
|
244
|
+
|
245
|
+
fieldTable = HFieldTable.new()
|
246
|
+
fieldTable.addFieldName("quantity")
|
247
|
+
fieldTable.addFieldName("description")
|
248
|
+
fieldTable.addFieldName("price", false)
|
249
|
+
fieldTable.addFieldName("amount")
|
250
|
+
|
251
|
+
fieldTable.setFieldCaption("quantity", "Quantity")
|
252
|
+
fieldTable.setFieldCaption("description", "Description")
|
253
|
+
fieldTable.setFieldCaption("price", "Price")
|
254
|
+
fieldTable.setFieldCaption("amount", "Amount")
|
255
|
+
|
256
|
+
fieldTable.setFieldFilter("price", HRecord.new(10))
|
257
|
+
fieldTable.setFieldFilter("amount", HRecord.new(10))
|
258
|
+
|
259
|
+
for i in 0..30
|
260
|
+
fieldTable.setDataByFieldName(i, "quantity", HRecord.new(i))
|
261
|
+
fieldTable.setDataByFieldName(i, "description", HRecord.new(i))
|
262
|
+
fieldTable.setDataByFieldName(i, "price", HRecord.new(rand(10)))
|
263
|
+
fieldTable.setDataByFieldName(i, "amount", HRecord.new(i))
|
264
|
+
end
|
265
|
+
|
266
|
+
#fieldTable.insertRow(1, HRecord.new("ciao"))
|
267
|
+
#fieldTable.deleteRow(1)
|
268
|
+
|
269
|
+
fieldTable.show()
|
270
|
+
fieldTable.allRows,fieldTable.allCols = true, true
|
271
|
+
fieldTable.show()
|
272
|
+
|
273
|
+
fieldTable.sortBy("price", "amount", asc: false)
|
274
|
+
fieldTable.show()
|
275
|
+
|
276
|
+
return fieldTable
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
t1 = Time.now
|
284
|
+
HFieldTable.test2()
|
285
|
+
p "... msecs. #{((Time.now - t1) * 1000).round(2)}"
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "hdatastructures/hrecord"
|
3
|
+
|
4
|
+
class Array
|
5
|
+
|
6
|
+
alias_method :insertFirst, :unshift
|
7
|
+
alias_method :insertLast, :<<
|
8
|
+
alias_method :deleteFirst, :shift
|
9
|
+
alias_method :deleteLast, :pop
|
10
|
+
alias_method :deleteAt, :delete_at
|
11
|
+
alias_method :indexOf, :index
|
12
|
+
|
13
|
+
def addIfNotPresent(value)
|
14
|
+
|
15
|
+
self << value unless self.include?(value)
|
16
|
+
return value
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
def deleteAt(index)
|
21
|
+
self.delete_at(index) if index
|
22
|
+
end
|
23
|
+
|
24
|
+
def swap(index1, index2)
|
25
|
+
# Parallel Assignment: eg a,b = 1,2
|
26
|
+
self[index1], self[index2] = self[index2], self[index1]
|
27
|
+
end
|
28
|
+
|
29
|
+
def < (array)
|
30
|
+
for i in 0...self.count
|
31
|
+
return true unless self[i]
|
32
|
+
return false unless array[i]
|
33
|
+
return true if self[i] < array[i]
|
34
|
+
return false if self[i] > array[i]
|
35
|
+
end
|
36
|
+
return false
|
37
|
+
end
|
38
|
+
|
39
|
+
def hpartition
|
40
|
+
return self.select { |value| value if yield(value) }, self.select { |value| value unless yield(value) }
|
41
|
+
end
|
42
|
+
|
43
|
+
def herbertsort(asc = true, &block)
|
44
|
+
|
45
|
+
#block = lambda { |data| data } unless block
|
46
|
+
block = Proc.new { |data| data } unless block
|
47
|
+
|
48
|
+
return [] if empty?
|
49
|
+
pivot = delete_at(rand(size))
|
50
|
+
left, right = hpartition { |value| block.call(value) < block.call(pivot) } if asc
|
51
|
+
left, right = hpartition { |value| !(block.call(value) < block.call(pivot)) } unless asc
|
52
|
+
return *left.herbertsort(asc, &block), pivot, *right.herbertsort(asc, &block)
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
# [4,2,1,5,3].herbertsort => [1, 2, 3, 4, 5]
|
57
|
+
# [[4,0],[2,0],[1,0],[5,0],[3,0]].herbertsort => [[1, 0], [2, 0], [3, 0], [4, 0], [5, 0]]
|
58
|
+
# [[4,1],[2,0],[1,0],[4,0],[3,0]].herbertsort => [[1, 0], [2, 0], [3, 0], [4, 0], [4, 1]]
|
59
|
+
# Sorting by qty
|
60
|
+
# [{qty:1, price:3}, {qty:2, price:2}, {qty:3, price:1}].herbertsort { |data| data[:qty] } =>
|
61
|
+
# [{:qty=>1, :price=>3}, {:qty=>2, :price=>2}, {:qty=>3, :price=>1}]
|
62
|
+
# Sorting by qty and by price
|
63
|
+
# [{qty:1, price:3}, {qty:1, price:2}, {qty:1, price:1}].herbertsort { |data| [data[:qty], data[:price]] }
|
64
|
+
def herbertsort!(asc = true, &block)
|
65
|
+
self.herbertsort(asc, &block).each_with_index { |data, i| self[i] = data }
|
66
|
+
end
|
67
|
+
|
68
|
+
def show(key = :key)
|
69
|
+
self.each do |data|
|
70
|
+
if data.class == HRecord
|
71
|
+
data.show(key)
|
72
|
+
else
|
73
|
+
puts data.to_s
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.test()
|
79
|
+
list = []
|
80
|
+
#(20).downto(1) { |i|
|
81
|
+
for i in 0..9
|
82
|
+
list.insertLast(HRecord.new(i))
|
83
|
+
end
|
84
|
+
list.deleteFirst()
|
85
|
+
list.deleteLast()
|
86
|
+
list.deleteAt(2)
|
87
|
+
list.insert(0, HRecord.new(0))
|
88
|
+
list.insert(3, "ciao")
|
89
|
+
list.insertLast(HRecord.new(9))
|
90
|
+
list[15] = 20
|
91
|
+
list[16] = :end
|
92
|
+
list.swap(15, 16)
|
93
|
+
list.show()
|
94
|
+
p list.indexOf(HRecord.new(9))
|
95
|
+
p [1,6,5,4,3,23,2].herbertsort
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
#Array.test()
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$hpformat = '%-11.10s'
|
4
|
+
|
5
|
+
class HRecord < Hash
|
6
|
+
include Comparable
|
7
|
+
|
8
|
+
def method_missing(var, *args)
|
9
|
+
if var =~ /^(\w+)=$/
|
10
|
+
if self.include?($1.to_s)
|
11
|
+
self.set($1.to_s, args[0])
|
12
|
+
else
|
13
|
+
self.set($1.to_sym, args[0])
|
14
|
+
end
|
15
|
+
return self
|
16
|
+
else
|
17
|
+
return self.value(var.to_sym) || self.value(var.to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(fieldValue, fieldName = :key)
|
22
|
+
self.setValue(fieldValue, fieldName)
|
23
|
+
end
|
24
|
+
|
25
|
+
def setValue(fieldValue, fieldName = :key)
|
26
|
+
self[fieldName] = fieldValue
|
27
|
+
return self
|
28
|
+
end
|
29
|
+
|
30
|
+
def set(fieldName, fieldValue)
|
31
|
+
self.setValue(fieldValue, fieldName)
|
32
|
+
return self
|
33
|
+
end
|
34
|
+
|
35
|
+
def value(fieldName = :key)
|
36
|
+
puts "hrecord::value: it's exist #{fieldName} symbol and string - #{self}".red if self[fieldName.to_sym] and self[fieldName.to_s]
|
37
|
+
return self[fieldName.to_sym] || self[fieldName.to_s]
|
38
|
+
end
|
39
|
+
|
40
|
+
def <=>(record)
|
41
|
+
self[:key] <=> record[:key]
|
42
|
+
end
|
43
|
+
|
44
|
+
def to_f(fieldName = :key)
|
45
|
+
return self[fieldName].to_f()
|
46
|
+
end
|
47
|
+
|
48
|
+
def show(key = :key)
|
49
|
+
|
50
|
+
color = self.include?(:color) ? self[:color] : "white"
|
51
|
+
value = $hpformat % self.value().to_s()
|
52
|
+
eval("print value.#{color}")
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
def showAll(key = :key)
|
57
|
+
|
58
|
+
self.each do |key, value|
|
59
|
+
puts "#{key}: #{value}"
|
60
|
+
end
|
61
|
+
puts "=" * 20
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.test()
|
66
|
+
rec = HRecord.new("a")
|
67
|
+
rec.setValue("0", "index-0")
|
68
|
+
rec.set("index-1", "1")
|
69
|
+
rec.show()
|
70
|
+
puts rec == rec
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
#HRecord.test
|