hypersonicplus 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,129 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require "hdatastructures/hfieldtable"
|
3
|
+
|
4
|
+
class HSpreadFieldTable < HFieldTable
|
5
|
+
|
6
|
+
attr_accessor :decorator
|
7
|
+
attr_reader :summaryList
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
super
|
11
|
+
@decorator = false
|
12
|
+
@summaryList = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def addSummary(summaryName, summaryValue)
|
16
|
+
|
17
|
+
record = HRecord.new(summaryName)
|
18
|
+
record.setValue(summaryName)
|
19
|
+
record.set(:value, summaryValue)
|
20
|
+
@summaryList << record
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
def noname(data, value)
|
25
|
+
return data.class == HRecord ? data.dup.setValue(value) : value
|
26
|
+
end
|
27
|
+
|
28
|
+
def decorate(data, value, fieldName)
|
29
|
+
decorator = @fields[fieldName].decorator
|
30
|
+
value = decorator.gsub("§arg§", value) if (@decorator and decorator)
|
31
|
+
return self.noname(data, value)
|
32
|
+
end
|
33
|
+
|
34
|
+
def evalDataByFieldName(row, fieldName)
|
35
|
+
|
36
|
+
value = self.valueByFieldName(row, fieldName)
|
37
|
+
return value if value.class == Fixnum
|
38
|
+
value = value.gsub(/`([a-zA-Z_]+[a-zA-Z_0-9]*)/) { |var| self.evalDataByFieldName(row, $1) }
|
39
|
+
return eval(value)
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
def dataByFieldName(row, fieldName)
|
44
|
+
|
45
|
+
value = data = super(row, fieldName)
|
46
|
+
value = data.value() if (data.class == HRecord)
|
47
|
+
return self.noname(data, self.evalDataByFieldName(row, fieldName)) if value.class == String and value.index('`')
|
48
|
+
return self.decorate(data, value, fieldName)
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
def showSummary()
|
53
|
+
|
54
|
+
@summaryList.each do |data|
|
55
|
+
if data
|
56
|
+
print $hpformat % data.value()
|
57
|
+
print $hpformat % data.value(:value)
|
58
|
+
end
|
59
|
+
puts
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
|
64
|
+
def self.test()
|
65
|
+
|
66
|
+
fieldTable = HSpreadFieldTable.new()
|
67
|
+
fieldTable.addFieldName("quantity")
|
68
|
+
fieldTable.addFieldName("description")
|
69
|
+
fieldTable.addFieldName("price")
|
70
|
+
fieldTable.addFieldName("amount", false)
|
71
|
+
fieldTable.addFieldName("score")
|
72
|
+
fieldTable.addFieldName("other")
|
73
|
+
|
74
|
+
fieldTable.setFieldCaption("quantity", "Quantity")
|
75
|
+
fieldTable.setFieldCaption("description", "Description")
|
76
|
+
fieldTable.setFieldCaption("price", "Price")
|
77
|
+
fieldTable.setFieldCaption("amount", "Amount")
|
78
|
+
fieldTable.setFieldCaption("score", "Score")
|
79
|
+
fieldTable.setFieldCaption("other", "Other")
|
80
|
+
|
81
|
+
fieldTable.setFieldFilter("price", 3)
|
82
|
+
fieldTable.setFieldFilter("score", HRecord.new(18))
|
83
|
+
|
84
|
+
fieldTable.setFieldDecorator("description", "Item: §arg§")
|
85
|
+
|
86
|
+
fieldTable.setFieldTotalizer("price", "P R I C E")
|
87
|
+
fieldTable.setFieldTotalizer("amount", "T O T A L")
|
88
|
+
fieldTable.setFieldTotalizer("score", "S C O R E")
|
89
|
+
fieldTable.addSummary("SUMMARY", "2.000 Euro")
|
90
|
+
|
91
|
+
for i in 0..5
|
92
|
+
(other = HRecord.new(i)).color = "green"
|
93
|
+
(amount = HRecord.new("`quantity * `price")).color = "yellow"
|
94
|
+
fieldTable.setIntoRecordByFieldName(i, "quantity", i)
|
95
|
+
fieldTable.setIntoRecordByFieldName(i, "description", "Product #{i}")
|
96
|
+
fieldTable.setIntoRecordByFieldName(i, "price", i)
|
97
|
+
fieldTable.setDataByFieldName(i, "amount", amount)
|
98
|
+
fieldTable.setIntoRecordByFieldName(i, "score", "`amount * 2")
|
99
|
+
fieldTable.setDataByFieldName(i, "other", other)
|
100
|
+
end
|
101
|
+
|
102
|
+
fieldTable.show()
|
103
|
+
fieldTable.allRows,fieldTable.allCols = true, true
|
104
|
+
fieldTable.decorator = true
|
105
|
+
fieldTable.show()
|
106
|
+
fieldTable.showTotalizers()
|
107
|
+
fieldTable.showSummary()
|
108
|
+
|
109
|
+
return fieldTable
|
110
|
+
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.test2
|
114
|
+
fieldTable = HSpreadFieldTable.test()
|
115
|
+
fieldTable.eachWithFieldName do |row|
|
116
|
+
row.each do |key, data|
|
117
|
+
p key, data
|
118
|
+
end
|
119
|
+
puts
|
120
|
+
end
|
121
|
+
return fieldTable
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
|
126
|
+
t1 = Time.now
|
127
|
+
HSpreadFieldTable.test()
|
128
|
+
#HSpreadFieldTable.test2()
|
129
|
+
p "... msecs. #{((Time.now - t1) * 1000).round(2)}"
|
@@ -0,0 +1,75 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'hdb/hdb'
|
3
|
+
require "yaml"
|
4
|
+
|
5
|
+
class HDataLoader
|
6
|
+
|
7
|
+
def initialize(filename, connectionName = "default")
|
8
|
+
@filename = filename
|
9
|
+
@connectionName = connectionName
|
10
|
+
end
|
11
|
+
|
12
|
+
|
13
|
+
def load
|
14
|
+
|
15
|
+
return unless File.file?(@filename)
|
16
|
+
@data = YAML.load_file(@filename)
|
17
|
+
oodb = HODB.new(connectionName: @connectionName)
|
18
|
+
@data.each do |modelName, record|
|
19
|
+
model = oodb.newHODB(modelName)
|
20
|
+
record.each do |recordName, recordValue|
|
21
|
+
model.create(recordValue)
|
22
|
+
end
|
23
|
+
model.writeAll
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def recordGenerator(tableName, record, min, max, overwrite = false)
|
29
|
+
|
30
|
+
@file = overwrite ? File.new(@filename, "w+") : File.new(@filename, "a+")
|
31
|
+
|
32
|
+
@file << "#{tableName}:\n"
|
33
|
+
for i in min...max
|
34
|
+
@file << " record_#{i}:\n"
|
35
|
+
record.each do |fieldName, fieldValue|
|
36
|
+
fieldValue = fieldValue.gsub('$', i.to_s)
|
37
|
+
@file << " #{fieldName}: '#{fieldValue}'\n"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
@file.close if(@file)
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
def addRecord(record, i)
|
46
|
+
@file = File.new(@filename, "a+")
|
47
|
+
@file << " record_#{i}:\n"
|
48
|
+
record.each do |fieldName, fieldValue|
|
49
|
+
fieldValue = fieldValue.gsub('$', i.to_s)
|
50
|
+
@file << " #{fieldName}: '#{fieldValue}'\n"
|
51
|
+
end
|
52
|
+
@file.close if(@file)
|
53
|
+
end
|
54
|
+
|
55
|
+
|
56
|
+
def example(count = 10)
|
57
|
+
|
58
|
+
record = {id: '#default', name: 'name-$', name_d: 'name_d_$', d: 'd_$'}
|
59
|
+
self.recordGenerator("d_tables", record, 1, count, true)
|
60
|
+
record = {id: '#default', name: 'name-$', name_a: 'name_a_$', a: 'a_$'}
|
61
|
+
self.recordGenerator("a_tables", record, 1, count)
|
62
|
+
record = {id: '#default', name: 'name-$', name_b: 'name_b-$', b: 'b-$', d_tables_id: '#$ % 5 + 1', a_tables_id: '$'}
|
63
|
+
self.recordGenerator("b_tables", record, 1, count)
|
64
|
+
record = {id: '#default', name: 'name-$', name_c: 'name_c-$', c: 'c-$', b_tables_id: '$'}
|
65
|
+
self.recordGenerator("c_tables", record, 1, count)
|
66
|
+
self.recordGenerator("name_table", {name: 'name-$'}, 1, count)
|
67
|
+
self.recordGenerator("surname_table", {surname: 'surname-$'}, 1, count)
|
68
|
+
self.recordGenerator("name_table_surname_table_join", {name_table_id: '#$', surname_table_id: '#$'}, 1, count)
|
69
|
+
self.addRecord({name_table_id: '#1', surname_table_id: '#2'}, 10)
|
70
|
+
self.addRecord({name_table_id: '#1', surname_table_id: '#3'}, 11)
|
71
|
+
self.load
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
data/lib/hdb/hdb.rb
ADDED
@@ -0,0 +1,357 @@
|
|
1
|
+
class Hash
|
2
|
+
|
3
|
+
def join(separator)
|
4
|
+
|
5
|
+
arr = []
|
6
|
+
self.each do |key, value|
|
7
|
+
arr << "\"#{key}\" = #{value}"
|
8
|
+
end
|
9
|
+
return arr.join(separator)
|
10
|
+
|
11
|
+
end
|
12
|
+
|
13
|
+
def intersect(hash)
|
14
|
+
|
15
|
+
self.select {|k,v| hash.include?(k)}
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def hprint
|
20
|
+
|
21
|
+
hashView = self.dup
|
22
|
+
#'*ptr'
|
23
|
+
hashView.each { |k, v| hashView[k] = v.object_id if v.class != String and v.class != Fixnum and v.class != NilClass and v.class != Float }
|
24
|
+
puts hashView
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_js_format
|
29
|
+
result = []
|
30
|
+
self.each do |k, v|
|
31
|
+
tmp = (v.class <= String) ? "#{k}:#{v.to_js_format}" : "#{k}:#{v}"
|
32
|
+
result << tmp
|
33
|
+
end
|
34
|
+
return "{#{result.join(", ")}}"
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class Array
|
41
|
+
|
42
|
+
def hjoin(separator, quoteChar = '"')
|
43
|
+
|
44
|
+
arr = []
|
45
|
+
self.each { |value| arr << "#{quoteChar}#{value}#{quoteChar}" }
|
46
|
+
return arr.join(separator)
|
47
|
+
end
|
48
|
+
|
49
|
+
def to_js_format # used in HWidget::buildSignature
|
50
|
+
result = []
|
51
|
+
self.each do |value|
|
52
|
+
tmp = (value.class <= String) ? "#{value.to_js_format}" : value
|
53
|
+
result << tmp
|
54
|
+
end
|
55
|
+
return "[#{result.join(", ")}]"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
class String
|
61
|
+
|
62
|
+
def hcapitalize
|
63
|
+
|
64
|
+
self.split('_').map(&:capitalize) * ''
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
def to_js_format
|
69
|
+
return "'#{self.gsub("'", "\\\\'")}'"
|
70
|
+
end
|
71
|
+
|
72
|
+
def to_b
|
73
|
+
return self == "true"
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
|
78
|
+
class HDB
|
79
|
+
|
80
|
+
attr_reader :resultTable, :connection, :sth, :table
|
81
|
+
|
82
|
+
def initialize(host, port, dbname, user, password, timezone, connectionName = "default", connector = "Pg")
|
83
|
+
|
84
|
+
@host = host
|
85
|
+
@port = port
|
86
|
+
@dbname = dbname
|
87
|
+
@user = user
|
88
|
+
@password = password
|
89
|
+
@timezone = timezone
|
90
|
+
@connectionName = connectionName
|
91
|
+
|
92
|
+
@connection = nil
|
93
|
+
|
94
|
+
@select = nil
|
95
|
+
@from = nil
|
96
|
+
@where = nil
|
97
|
+
@orderBy = nil
|
98
|
+
@direction = nil
|
99
|
+
@limit = nil
|
100
|
+
@offset = nil
|
101
|
+
|
102
|
+
@resultTable = nil
|
103
|
+
@table = nil
|
104
|
+
|
105
|
+
end
|
106
|
+
|
107
|
+
def method_missing(methodeName, *args)
|
108
|
+
return eval("HODB.new($1, @connectionName).find_by_#{$2}(*args)") if methodeName.to_s =~ /^find_on_(.+)_by_(.+)$/
|
109
|
+
end
|
110
|
+
|
111
|
+
# posso passare anche un array di campi
|
112
|
+
def select(select)
|
113
|
+
select = select.hjoin(', ') if(select.class == Array)
|
114
|
+
@select = select
|
115
|
+
return self
|
116
|
+
end
|
117
|
+
def from(from)
|
118
|
+
from = from.hjoin(', ') if(from.class == Array)
|
119
|
+
@from = from
|
120
|
+
return self
|
121
|
+
end
|
122
|
+
def normalizeWhereFormat(where, operator = 'AND')
|
123
|
+
where = self.quote(where) if where.class == Hash
|
124
|
+
where = where.join(" #{operator} ") if(where.class == Array || where.class == Hash)
|
125
|
+
return where
|
126
|
+
end
|
127
|
+
def where(where, operator = 'AND')
|
128
|
+
@where = self.normalizeWhereFormat(where, operator)
|
129
|
+
return self
|
130
|
+
end
|
131
|
+
def orderBy(orderBy)
|
132
|
+
orderBy = orderBy.hjoin(', ') if(orderBy.class == Array)
|
133
|
+
@orderBy = orderBy
|
134
|
+
return self
|
135
|
+
end
|
136
|
+
def direction(direction)
|
137
|
+
@direction = direction
|
138
|
+
return self
|
139
|
+
end
|
140
|
+
def limit(limit)
|
141
|
+
@limit = limit
|
142
|
+
return self
|
143
|
+
end
|
144
|
+
def offset(offset)
|
145
|
+
@offset = offset
|
146
|
+
return self
|
147
|
+
end
|
148
|
+
|
149
|
+
def queryStr()
|
150
|
+
|
151
|
+
where = "WHERE #{@where}" if(@where)
|
152
|
+
orderBy = "ORDER BY #{@orderBy}" if(@orderBy)
|
153
|
+
limit = "LIMIT #{@limit}" if(@limit)
|
154
|
+
offset = "OFFSET #{@offset}" if(@offset)
|
155
|
+
return "SELECT #{@select} FROM #{@from} #{where} #{orderBy} #{@direction} #{limit} #{offset}"
|
156
|
+
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
def openConnection()
|
161
|
+
|
162
|
+
hl << "connectionName: #{@connectionName}".red
|
163
|
+
hl << "host: #{@host}".red
|
164
|
+
hl << "port: #{@port}".red
|
165
|
+
hl << "db: #{@dbname}".red
|
166
|
+
hl << "user: #{@user}".red
|
167
|
+
hl << "password: #{@password}".red
|
168
|
+
hl << "timezone: #{@timezone}".red
|
169
|
+
@connection = self.connect() unless @connection
|
170
|
+
|
171
|
+
end
|
172
|
+
|
173
|
+
|
174
|
+
def closeConnection()
|
175
|
+
|
176
|
+
self.disconnect() if @connection
|
177
|
+
@connection = nil
|
178
|
+
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
def execute(queryStr = self.queryStr, pageSize: "all", page: 0)
|
183
|
+
|
184
|
+
limit = "LIMIT #{pageSize}"
|
185
|
+
offset = "OFFSET #{page} * #{pageSize}"
|
186
|
+
if(pageSize == "all")
|
187
|
+
limit = offset = ""
|
188
|
+
end
|
189
|
+
|
190
|
+
queryStr += " #{limit} #{offset}"
|
191
|
+
|
192
|
+
t1 = Time.now
|
193
|
+
hl << queryStr.hight_yellow
|
194
|
+
result = self._execute(queryStr)
|
195
|
+
hl << "... msecs. #{((Time.now - t1) * 1000).round(2)}".hight_cyan
|
196
|
+
return result
|
197
|
+
|
198
|
+
end
|
199
|
+
|
200
|
+
def quoteValue(value)
|
201
|
+
|
202
|
+
return 'NULL' if value == nil
|
203
|
+
value = value.to_s.gsub("'", "''")
|
204
|
+
return (value[0] != '#') ? "'#{value}'" : value[1, value.size - 1]
|
205
|
+
|
206
|
+
end
|
207
|
+
|
208
|
+
def primitiveType?(value)
|
209
|
+
|
210
|
+
return (value.class == String or
|
211
|
+
value.class == Fixnum or
|
212
|
+
value.class == TrueClass or
|
213
|
+
value.class == FalseClass)
|
214
|
+
|
215
|
+
end
|
216
|
+
|
217
|
+
# quota tutti i valori tranne quelli che iniziano con #
|
218
|
+
# quindi se nella mia query devo richiamare una funzione basta farla precedere dal cancelletto
|
219
|
+
def quote(args)
|
220
|
+
|
221
|
+
return 'NULL' if args == nil
|
222
|
+
return self.quoteValue(args) if self.primitiveType?(args)
|
223
|
+
|
224
|
+
result = Hash.new()
|
225
|
+
|
226
|
+
args.each do |key, value|
|
227
|
+
result[key] = self.quoteValue(args[key])
|
228
|
+
end
|
229
|
+
return result
|
230
|
+
|
231
|
+
end
|
232
|
+
|
233
|
+
alias_method :q, :quote
|
234
|
+
|
235
|
+
def toClassName(tableName)
|
236
|
+
return tableName.hcapitalize()
|
237
|
+
end
|
238
|
+
|
239
|
+
def insertValues(args)
|
240
|
+
|
241
|
+
return "(id) values(default)" unless(args)
|
242
|
+
args = self.quote(args)
|
243
|
+
return "(#{args.keys.hjoin(', ')}) values(#{args.values.join(', ')})"
|
244
|
+
|
245
|
+
end
|
246
|
+
|
247
|
+
def insert(tableName, values)
|
248
|
+
|
249
|
+
return self.execute("INSERT INTO \"#{tableName}\" #{self.insertValues(values)} RETURNING id").data(0,"id")
|
250
|
+
|
251
|
+
end
|
252
|
+
|
253
|
+
def updateValues(args)
|
254
|
+
|
255
|
+
return "" unless(args)
|
256
|
+
args = self.quote(args)
|
257
|
+
result = []
|
258
|
+
args.each { |key, value| result << "\"#{key}\" = #{value}" }
|
259
|
+
return result.join(', ')
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
def update(tableName, values, where = "TRUE", operator = "AND")
|
264
|
+
|
265
|
+
where = where.join(" #{operator} ") if(where.class == Array || where.class == Hash)
|
266
|
+
self.execute("UPDATE \"#{tableName}\" SET #{self.updateValues(values)} WHERE #{where}")
|
267
|
+
return self.rowsAffected()
|
268
|
+
|
269
|
+
end
|
270
|
+
|
271
|
+
def delete(tableName, where = "TRUE", operator = "AND")
|
272
|
+
|
273
|
+
where = self.quote(where) if where.class == Hash
|
274
|
+
where = where.join(" #{operator} ") if(where.class == Array || where.class == Hash)
|
275
|
+
self.execute("DELETE FROM \"#{tableName}\" WHERE #{where}")
|
276
|
+
return self.rowsAffected() # rows affected
|
277
|
+
|
278
|
+
end
|
279
|
+
|
280
|
+
def rowCount()
|
281
|
+
|
282
|
+
return self.rowsAffected()
|
283
|
+
|
284
|
+
end
|
285
|
+
|
286
|
+
def columnCount()
|
287
|
+
|
288
|
+
return self.fieldNameList.length
|
289
|
+
|
290
|
+
end
|
291
|
+
|
292
|
+
def data(row, idOrFieldName)
|
293
|
+
|
294
|
+
return (idOrFieldName.class == Fixnum) ? @table[row][@table[row].keys[idOrFieldName]] : @table[row][idOrFieldName.to_s]
|
295
|
+
|
296
|
+
end
|
297
|
+
|
298
|
+
def show()
|
299
|
+
|
300
|
+
@table.each do |row|
|
301
|
+
p row
|
302
|
+
end
|
303
|
+
|
304
|
+
end
|
305
|
+
|
306
|
+
def self.newHDB(connectionName = "default")
|
307
|
+
|
308
|
+
params = hc.value(connectionName)
|
309
|
+
|
310
|
+
host = params["host"]
|
311
|
+
port = params["port"]
|
312
|
+
dbname = params["dbname"]
|
313
|
+
user = params["user"]
|
314
|
+
password = params["password"]
|
315
|
+
timezone = params["timezone"]
|
316
|
+
connector = params["connector"]
|
317
|
+
|
318
|
+
connector = connector.split('-')
|
319
|
+
|
320
|
+
if (connector[0] == "hdbi")
|
321
|
+
hdb = HDBI.new(host, port, dbname, user, password, timezone, connectionName, connector[1])
|
322
|
+
elsif (connector[0] == "hpgsql")
|
323
|
+
hdb = HPgSql.new(host, port, dbname, user, password, timezone, connectionName)
|
324
|
+
elsif (connector[0] == "hmysql")
|
325
|
+
hdb = HMySql.new(host, port, dbname, user, password, timezone, connectionName)
|
326
|
+
elsif (connector[0] == "hmysql2")
|
327
|
+
hdb = HMySql2.new(host, port, dbname, user, password, timezone, connectionName)
|
328
|
+
end
|
329
|
+
|
330
|
+
hdb.openConnection()
|
331
|
+
HSharedData.instance().setValue(hdb, "hdb-#{connectionName}")
|
332
|
+
return hdb
|
333
|
+
|
334
|
+
end
|
335
|
+
|
336
|
+
def self.HDB(connectionName = "default")
|
337
|
+
|
338
|
+
hdb = HSharedData.instance().value("hdb-#{connectionName}")
|
339
|
+
return (hdb) ? hdb : self.newHDB(connectionName)
|
340
|
+
|
341
|
+
end
|
342
|
+
|
343
|
+
def self.destroy(connectionName = "default")
|
344
|
+
|
345
|
+
self.HDB(connectionName).closeConnection()
|
346
|
+
HSharedData.instance().setValue(nil, "hdb-#{connectionName}")
|
347
|
+
|
348
|
+
end
|
349
|
+
|
350
|
+
end
|
351
|
+
|
352
|
+
def hdb(connectionName = "default")
|
353
|
+
|
354
|
+
return HDB.HDB(connectionName)
|
355
|
+
|
356
|
+
end
|
357
|
+
|