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.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/lib/hdatastructures/hfieldtable.rb +285 -0
  3. data/lib/hdatastructures/hhash.rb +9 -0
  4. data/lib/hdatastructures/hlist.rb +100 -0
  5. data/lib/hdatastructures/hrecord.rb +75 -0
  6. data/lib/hdatastructures/hspreadfieldtable.rb +129 -0
  7. data/lib/hdb/hdataloader.rb +75 -0
  8. data/lib/hdb/hdb.rb +357 -0
  9. data/lib/hdb/hdb_test.rb +248 -0
  10. data/lib/hdb/hdbgenerator.rb +211 -0
  11. data/lib/hdb/hdbi.rb +63 -0
  12. data/lib/hdb/hdbi_test.rb +133 -0
  13. data/lib/hdb/hfield.rb +180 -0
  14. data/lib/hdb/hmysql.rb +99 -0
  15. data/lib/hdb/hmysql2.rb +96 -0
  16. data/lib/hdb/hodb.rb +948 -0
  17. data/lib/hdb/hpgsql.rb +54 -0
  18. data/lib/hengine/application_controller.rb +204 -0
  19. data/lib/hengine/hconfiguration.rb +40 -0
  20. data/lib/hengine/hhotlogger.rb +13 -0
  21. data/lib/hengine/hlogger.rb +119 -0
  22. data/lib/hengine/hmalloc.rb +275 -0
  23. data/lib/hengine/hmoduleloader.rb +15 -0
  24. data/lib/hengine/hsessiondata.rb +79 -0
  25. data/lib/hengine/hshareddata.rb +60 -0
  26. data/lib/hengine/htranslate.rb +40 -0
  27. data/lib/hengine/hviewloader.rb +99 -0
  28. data/lib/hinit/hinit.rb +3 -0
  29. data/lib/hmisc/hcolorize.rb +100 -0
  30. data/lib/hmisc/hdecoratorfunctions.rb +15 -0
  31. data/lib/hmisc/hdir.rb +19 -0
  32. data/lib/hmisc/hhtmlnode.rb +27 -0
  33. data/lib/hmisc/hinputvalidator.rb +95 -0
  34. data/lib/hmisc/hio.rb +142 -0
  35. data/lib/hmisc/hjson.rb +16 -0
  36. data/lib/hsqlmanager/hpgsqldatabasemanager.rb +76 -0
  37. data/lib/hsqlmanager/hsqldatabasemanager.rb +349 -0
  38. data/lib/hsqlmanager/hsqltable.rb +16 -0
  39. data/lib/husermanager/husermanager.rb +122 -0
  40. data/lib/hwidgets/haccordionmenu.rb +117 -0
  41. data/lib/hwidgets/hcheckboxtag.rb +33 -0
  42. data/lib/hwidgets/hdbactionbuttons.rb +26 -0
  43. data/lib/hwidgets/hdbcombobox.rb +71 -0
  44. data/lib/hwidgets/hdbdialogview.rb +190 -0
  45. data/lib/hwidgets/hdbfilterview.rb +28 -0
  46. data/lib/hwidgets/hdbtableview.rb +213 -0
  47. data/lib/hwidgets/hdbview.rb +63 -0
  48. data/lib/hwidgets/hdivtag.rb +9 -0
  49. data/lib/hwidgets/hdropdown.rb +44 -0
  50. data/lib/hwidgets/hformfield.rb +91 -0
  51. data/lib/hwidgets/hgrouptag.rb +65 -0
  52. data/lib/hwidgets/hhiddeninputtag.rb +12 -0
  53. data/lib/hwidgets/hinputtag.rb +55 -0
  54. data/lib/hwidgets/hlabeltag.rb +30 -0
  55. data/lib/hwidgets/hmainview.rb +37 -0
  56. data/lib/hwidgets/hpagination.rb +65 -0
  57. data/lib/hwidgets/hradiobuttontag.rb +30 -0
  58. data/lib/hwidgets/hselecttag.rb +32 -0
  59. data/lib/hwidgets/htableview.rb +262 -0
  60. data/lib/hwidgets/htabview.rb +84 -0
  61. data/lib/hwidgets/htextareatag.rb +20 -0
  62. data/lib/hwidgets/htopnav.rb +85 -0
  63. data/lib/hwidgets/hwidget.rb +423 -0
  64. data/lib/hypersonic.rb +9 -0
  65. 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
+
@@ -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
+