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,95 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Go to http://rubular.com to try the regex strings
4
+
5
+ class HInputValidator
6
+
7
+ def self.isValid?(input) # General Validation
8
+
9
+ return self.isLengthValid?(input)
10
+
11
+ end
12
+
13
+ def self.isLengthValid?(input)
14
+
15
+ regex = /\A.{0,40}\z/
16
+ return !(input !~ regex)
17
+
18
+ end
19
+
20
+ def self.isMandatory?(input)
21
+
22
+ regex = /\A.{1,500}\z/
23
+ return !(input !~ regex) && self.isValid?(input)
24
+
25
+ end
26
+
27
+ def self.isPassword?(input)
28
+
29
+ regex = /^[\w.@!$\-]{5,}$/ # at least 5 character, are allow the follows special chars: . @ ! $ -
30
+ return !(input !~ regex) && self.isValid?(input)
31
+
32
+ end
33
+
34
+ def self.isReal?(input)
35
+
36
+ regex = /^-?[0-9]\d*(\.\d+)?$/
37
+ return !(input !~ regex) && self.isValid?(input)
38
+
39
+ end
40
+
41
+ def self.isInteger?(input)
42
+
43
+ regex = /\A-?[0-9]+\z/
44
+ return !(input !~ regex) && self.isValid?(input)
45
+
46
+ end
47
+
48
+ def self.isNatural?(input)
49
+
50
+ regex = /\A[0-9]+\z/
51
+ return !(input !~ regex) && self.isValid?(input)
52
+
53
+ end
54
+
55
+ def self.isEmail?(input)
56
+
57
+ regex = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
58
+ return !(input !~ regex) && self.isValid?(input)
59
+
60
+ end
61
+
62
+ def self.isUnique?(fieldValue, fieldName, modelName)
63
+
64
+ result = HSqlTable.new().loadFromQuery("select count(*) from #{modelName} where #{fieldName} = '#{fieldValue}'")[0][0]
65
+ return (result == "1") && self.isValid?(fieldValue)
66
+
67
+ end
68
+
69
+ # isValid("hb@gmail.com", "email,unique", "email", "users")
70
+ def self.isValid(fieldValue, fieldType, fieldName, modelName)
71
+
72
+ result = true
73
+ types = fieldType.split(",")
74
+ types.each do |type|
75
+ type = type.strip()
76
+ result &&= self.isLengthValid?(fieldValue) if (type == "length")
77
+ result &&= self.isMandatory?(fieldValue) if (type == "mandatory")
78
+ result &&= self.isPassword?(fieldValue) if (type == "password")
79
+ result &&= self.isReal?(fieldValue) if (type == "real")
80
+ result &&= self.isInteger?(fieldValue) if (type == "integer")
81
+ result &&= self.isNatural?(fieldValue) if (type == "natural")
82
+ result &&= self.isEmail?(fieldValue) if (type == "email")
83
+ result &&= self.isUnique?(fieldValue, fieldName, modelName) if (type == "unique")
84
+ end
85
+
86
+ return (result) ? "true": "false"
87
+
88
+ end
89
+
90
+ def self.valid?(fieldValue: nil, fieldType: nil, fieldName: nil, modelName: nil)
91
+ return self.isValid(fieldValue, fieldType, fieldName, modelName)
92
+ end
93
+
94
+
95
+ end
@@ -0,0 +1,142 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'net/smtp'
4
+ require 'mail'
5
+
6
+ def puta(array, margin: 0)
7
+ array.each do |value|
8
+ puts " " * margin + "#{value}".green if value.class != Hash and value.class != Array
9
+ puth(value, margin: margin + 3) if value.class == Hash
10
+ end
11
+ end
12
+
13
+ def puth(hash, margin: 0)
14
+ hash.each do |key, value|
15
+ puts " " * margin + "#{key}:".hight_cyan
16
+ puts " " * (margin + 3) + "#{value}".hight_cyan if value.class != Hash and value.class != Array
17
+ puta(value, margin: margin + 3) if value.class == Array
18
+ end
19
+ end
20
+
21
+ class HIO
22
+
23
+ @@indentSpace = 0
24
+
25
+ def self.htmlEcholn(str)
26
+ return "" if (str == "")
27
+ #return str.to_s
28
+ return str.to_s + "\n"
29
+ end
30
+
31
+ def self.htmlEcholnOpenBlock(str)
32
+
33
+ result = self.htmlEcholn(str)
34
+ @@indentSpace += 1
35
+ return result
36
+
37
+ end
38
+
39
+ def self.htmlEcholnCloseBlock(str)
40
+
41
+ @@indentSpace -= 1
42
+ return self.htmlEcholn(str);
43
+
44
+ end
45
+
46
+ def self.quote(str)
47
+ return "'#{str}'";
48
+ end
49
+
50
+ def self.isQuoted(str)
51
+
52
+ return (str[0] == "'" && str[-1] == "'")
53
+
54
+ end
55
+
56
+ def self.unQuote(str)
57
+
58
+ return isQuoted(str) ? str[1..-2] : str
59
+
60
+ end
61
+
62
+ def self.gmailOptions(username, password)
63
+
64
+ return options = {
65
+ :address => "smtp.gmail.com",
66
+ :port => 587,
67
+ :user_name => username,
68
+ :password => password,
69
+ :authentication => 'plain',
70
+ :enable_starttls_auto => true
71
+ }
72
+
73
+ end
74
+
75
+
76
+ def self.gmxOptions(username, password)
77
+
78
+ return options = {
79
+ :address => "mail.gmx.com",
80
+ :port => 587,
81
+ :user_name => username,
82
+ :password => password,
83
+ :authentication => 'plain',
84
+ :enable_starttls_auto => true
85
+ }
86
+
87
+ end
88
+
89
+ def self.options(emailFrom, emailPassword)
90
+
91
+ provider = emailFrom[emailFrom.index('@') + 1, emailFrom.size - 1]
92
+ return self.gmxOptions(emailFrom, emailPassword) if(provider == "gmx.com")
93
+ return self.gmailOptions(emailFrom, emailPassword) if(provider == "gmail.com")
94
+
95
+ end
96
+
97
+
98
+ def self.sendEmail(emailFrom, emailTo, emailSubject, emailBody, emailPassword = "quickorder", emailFromName = "")
99
+
100
+ Mail.defaults do
101
+ delivery_method :smtp, self.options(emailFrom, emailPassword)
102
+ end
103
+
104
+ Mail.deliver do
105
+ to emailTo
106
+ from emailFrom
107
+ subject emailSubject
108
+ body emailBody
109
+ end
110
+
111
+
112
+
113
+ =begin
114
+ message = <<MESSAGE_END
115
+ From: Private Person <herbert.bonaffini@gmx.com>
116
+ To: A Test User <herbert.bonaffini@gmail.com>
117
+ Subject: SMTP e-mail test
118
+
119
+ This is a test e-mail message.
120
+ MESSAGE_END
121
+
122
+ Net::SMTP.start('smtp.gmx.com', 465, 'localhost', 'herbert.bonaffini@gmx.com', 'quickorder', :plain) do |smtp|
123
+ smtp.send_message message, 'herbert.bonaffini@gmx.com',
124
+ 'herbert.bonaffini@gmail.com'
125
+ end
126
+
127
+
128
+ provider = substr($emailFrom, strpos($emailFrom, '@') + 1);
129
+
130
+ if(provider == "gmx.com")
131
+ phpMailer = HIO::gmxPHPmailer();
132
+ else
133
+ phpMailer = HIO::gmailPHPmailer();
134
+
135
+ phpMailer->Username = emailFrom;
136
+ phpMailer->Password = password;
137
+ =end
138
+
139
+ end
140
+
141
+ end
142
+
@@ -0,0 +1,16 @@
1
+ ESCAPED_CHARS = {
2
+ '>' => '\u003e',
3
+ '<' => '\u003c',
4
+ '&' => '\u0026',
5
+ "\u2028" => '\u2028',
6
+ "\u2029" => '\u2029',
7
+ }
8
+
9
+ ESCAPE_REGEX_WITH_HTML_ENTITIES = /[\u2028\u2029><&]/u
10
+
11
+ class String
12
+ def to_json
13
+ super.gsub ESCAPE_REGEX_WITH_HTML_ENTITIES, ESCAPED_CHARS
14
+ end
15
+ end
16
+
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "hsqlmanager/hsqldatabasemanager"
4
+
5
+ class HPgSqlDatabaseManager < HSqlDatabaseManager
6
+
7
+ def connect()
8
+
9
+ timezone = hc.value("timezone")
10
+
11
+ return @connection if(@connection != nil)
12
+
13
+ connectionPtr = HSharedData.instance().value("pg-#{@dbname}")
14
+ return connectionPtr.connection if (connectionPtr != nil)
15
+
16
+ connection = PGconn.new(@host, @port, "", "", @dbname, @user, @password)
17
+ HSharedData.instance().setValue(self, "pg-#{@dbname}")
18
+ puts "Server version: #{connection.query("SHOW server_version").to_s}"
19
+ connection.query("SET TIME ZONE '#{timezone}'");
20
+ return connection
21
+
22
+ end
23
+
24
+ def close()
25
+
26
+ HSharedData.instance().setValue(nil, "pg-#{@dbname}")
27
+
28
+ end
29
+
30
+ def self.setPgSqlConnection()
31
+
32
+ host = hc.value("host")
33
+ port = hc.value("port")
34
+ dbname = hc.value("dbname")
35
+ user = hc.value("user")
36
+ password = hc.value("password")
37
+
38
+ pgSqlDatabaseManager = HPgSqlDatabaseManager.new(host, port, dbname, user, password)
39
+ pgSqlDatabaseManager.openConnection()
40
+ return pgSqlDatabaseManager
41
+
42
+ end
43
+
44
+
45
+ def self.defaultPgSqlDatabaseManager()
46
+
47
+ pgDbName = hc.value("pg_dbname")
48
+ pgSqlDatabaseManager = HSharedData.instance().value("pg-#{pgDbName}")
49
+ return (pgSqlDatabaseManager == nil) ? self.setPgSqlConnection() : pgSqlDatabaseManager
50
+
51
+ end
52
+
53
+
54
+ def self.test1()
55
+
56
+ pgSqlDatabaseManager = HPgSqlDatabaseManager.new("127.0.0.1", "5432", "quickorder", "quickorder", "quickorder")
57
+ pgSqlDatabaseManager.openConnection()
58
+ # la seguente query genera 3 colonne invece di 4
59
+ # si tratta di un bug
60
+ result = pgSqlDatabaseManager.run("select id, name, price, name from cookbook")
61
+ # come toppa si puo' usare la seguente query
62
+ #result = pgSqlDatabaseManager.run("select id, name, price, name as ciao from cookbook")
63
+ pgSqlDatabaseManager.show()
64
+
65
+ end
66
+
67
+ end
68
+
69
+ def hpgsql()
70
+
71
+ return HPgSqlDatabaseManager.defaultPgSqlDatabaseManager()
72
+
73
+ end
74
+
75
+ #hpgsql.test1
76
+
@@ -0,0 +1,349 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # databaseManager.select("id, name").from("cookbook").where("id > 10").orderBy("id").limit(5).offset(5).run().show()
4
+
5
+
6
+ class HSqlDatabaseManager
7
+
8
+ attr_reader :resultTable, :connection
9
+
10
+ def initialize(host, port, dbname, user, password)
11
+
12
+ @host = host
13
+ @port = port
14
+ @dbname = dbname
15
+ @user = user
16
+ @password = password
17
+
18
+ @connection = nil
19
+
20
+ @select = nil
21
+ @from = nil
22
+ @where = nil
23
+ @orderBy = nil
24
+ @limit = nil
25
+ @offset = nil
26
+
27
+ @resultTable = nil
28
+
29
+ end
30
+
31
+ # posso passare anche un array di campi
32
+ def select(select)
33
+ select = select.join(',') if(select.class == Array)
34
+ @select = select
35
+ return self
36
+ end
37
+ def from(from)
38
+ @from = from
39
+ return self
40
+ end
41
+ def where(where)
42
+ @where = where
43
+ return self
44
+ end
45
+ def orderBy(orderBy)
46
+ @orderBy = orderBy
47
+ return self
48
+ end
49
+ def limit(limit)
50
+ @limit = limit
51
+ return self
52
+ end
53
+ def offset(offset)
54
+ @offset = offset
55
+ return self
56
+ end
57
+
58
+ def queryStr()
59
+
60
+ where = "where #{@where}" if(@where)
61
+ orderBy = "order by #{@orderBy}" if(@orderBy)
62
+ limit = "limit #{@limit}" if(@limit)
63
+ offset = "offset #{@offset}" if(@offset)
64
+ return "select #{@select} from #{@from} #{where} #{orderBy} #{limit} #{offset}"
65
+
66
+ end
67
+
68
+
69
+ def openConnection()
70
+
71
+ @connection = self.connect() if(@connection == nil)
72
+
73
+ end
74
+
75
+
76
+ def closeConnection()
77
+
78
+ @connection.close() if(@connection != nil)
79
+ @connection = nil
80
+ self.close()
81
+
82
+ end
83
+
84
+
85
+ def fieldNameList()
86
+
87
+ fieldList = HList.new()
88
+
89
+ for i in (0..@resultTable.nfields() - 1)
90
+ fieldList.insertTail(HRecord.new(@resultTable.fname(i)))
91
+ end
92
+
93
+ return fieldList
94
+
95
+ end
96
+
97
+ def run(queryStr = self.queryStr)
98
+
99
+ @resultTable = @connection.query(queryStr)
100
+ return self
101
+
102
+ end
103
+
104
+ # def setQuery(queryStr)
105
+ # return self.run(queryStr)
106
+ # end
107
+
108
+ def runWithPaging(pageSize = "all", page = 0, queryStr = self.queryStr)
109
+
110
+ limit = "limit #{pageSize}"
111
+ offset = "offset #{page} * #{pageSize}"
112
+ if(pageSize == "all")
113
+ limit = offset = ""
114
+ end
115
+
116
+ queryStr += " #{limit} #{offset}"
117
+
118
+ return self.run(queryStr)
119
+
120
+ end
121
+
122
+ def dataByFieldName(row, fieldName)
123
+
124
+ return nil if(@resultTable.count() == 0)
125
+ return @resultTable[row][fieldName]
126
+
127
+ end
128
+
129
+ def dataByFieldIndex(row, fieldIndex)
130
+
131
+ return self.dataByFieldName(row, @resultTable.keys[fieldIndex])
132
+
133
+ end
134
+
135
+ # Se si vuole efficienza conviene non usare la seguente funzione
136
+ # ma le precedenti
137
+ def toSqlTable()
138
+
139
+ sqlTable = HSqlTable.new()
140
+
141
+ fieldNameList = self.fieldNameList()
142
+
143
+ fieldNameList.eachWithIndex do |fieldName, i|
144
+ sqlTable.setFieldName(i, fieldName.value(), "true");
145
+ end
146
+
147
+ @resultTable.each_with_index do |row, i|
148
+ j = 0
149
+ row.each do |key, value|
150
+ sqlTable.setDataByFieldIndex(i, j, HRecord.new(value))
151
+ j += 1
152
+ end
153
+ end
154
+
155
+ return sqlTable
156
+
157
+ end
158
+
159
+ def rowCount()
160
+
161
+ return @resultTable.count()
162
+
163
+ end
164
+
165
+ def columnCount()
166
+
167
+ return 0 if(self.rowCount() == 0)
168
+ return @resultTable[0].count()
169
+
170
+ end
171
+
172
+
173
+ def quoteValue(value)
174
+
175
+ return nil unless(value)
176
+ return (value[0] != '#') ? "'#{value}'" : value[1, value.size - 1]
177
+
178
+ end
179
+
180
+
181
+ # quota tutti i valori tranne quelli che iniziano con #
182
+ # quindi se nella mia query devo richiamare una funzione basta farla precedere dal cancelletto
183
+ def quote(args)
184
+
185
+ return nil unless(args)
186
+
187
+ result = Hash.new()
188
+
189
+ args.each do |key, value|
190
+ result[key] = self.quoteValue(args[key])
191
+ end
192
+ return result
193
+
194
+ end
195
+
196
+
197
+ def insertValues(args)
198
+
199
+ return "(id) values(default)" unless(args)
200
+
201
+ args = self.quote(args)
202
+
203
+ keys = args.keys
204
+
205
+ result = "("
206
+ i = -1
207
+ for i in (0..args.count - 2) do
208
+ result += "#{keys[i]}, "
209
+ end
210
+ result += "#{keys[i + 1]}) values("
211
+ i = -1
212
+ for i in (0..args.count - 2) do
213
+ result += "#{args[keys[i]]}, "
214
+ end
215
+ result += "#{args[keys[i + 1]]})"
216
+ return result
217
+
218
+ end
219
+
220
+ def updateValues(args)
221
+
222
+ return "" unless(args)
223
+
224
+ args = self.quote(args)
225
+
226
+ keys = args.keys
227
+
228
+ result = ""
229
+ i = -1
230
+ for i in (0..args.count - 2) do
231
+ result += "#{keys[i]} = #{args[keys[i]]}, "
232
+ end
233
+ result += "#{keys[i + 1]} = #{args[keys[i + 1]]}"
234
+
235
+ return result
236
+
237
+ end
238
+
239
+ def insertOrUpdateIfExist(tableName, where, values = nil)
240
+
241
+ resultTable = self.run("select id from #{tableName} where #{where} ").resultTable
242
+ if(resultTable.count == 0)
243
+ insertQuery = "insert into #{tableName} #{self.insertValues(values)} returning id"
244
+ p "================= insertOrUpdateIfExist ================== ", insertQuery
245
+ newId = self.run(insertQuery).resultTable[0]["id"]
246
+ return newId
247
+ else
248
+ p values
249
+ updateQuery = "update #{tableName} set #{self.updateValues(values)} where #{where}"
250
+ p updateQuery
251
+ self.run(updateQuery) if(values)
252
+ return resultTable[0]["id"]
253
+ end
254
+
255
+ end
256
+
257
+ def insertOrUpdateIfExistCached(tableName, dialogViewLevel, id, values)
258
+
259
+ value = {}
260
+ value[:view_level] = dialogViewLevel
261
+ value[:table_name] = tableName
262
+ value[:field_id] = id
263
+ value[:field_value] = values
264
+ value[:state] = "none"
265
+
266
+ return self.insertOrUpdateIfExist("cache_table", "table_name = '#{tableName}' and field_id = #{id}", value)
267
+
268
+ end
269
+
270
+ def unloadCache(tableName, dialogViewLevel, id)
271
+
272
+ p "unloadCache"
273
+ resultTable = self.run("select field_id, field_value from cache_table where table_name = '#{tableName}'").resultTable
274
+ resultTable.each do |row|
275
+ self.insertOrUpdateIfExist(tableName, "id = #{row['field_id']}", eval(row['field_value']))
276
+ end
277
+ self.run("delete from cache_table where table_name = '#{tableName}'").resultTable
278
+
279
+ end
280
+
281
+ def deleteCacheBranch(tableName, dialogViewLevel)
282
+
283
+ self.run("delete from cache_table where table_name = '#{tableName}' and view_level >= #{dialogViewLevel}").resultTable
284
+
285
+ end
286
+
287
+ def setParentChildTableValues(parentTableName, childTableName, where, parentValues, childValues)
288
+
289
+ parentTableId = self.insertOrUpdateIfExist("#{parentTableName}_table", where, parentValues)
290
+
291
+ i = 0
292
+ record = Hash.new()
293
+ childValues.each do |key, value|
294
+ childRecord = {"#{parentTableName}_id" => parentTableId,
295
+ :field_name => key,
296
+ :field_value => value,
297
+ :ordering => i}
298
+ recordWhere = "#{parentTableName}_id = #{parentTableId} and field_name = '#{key}'"
299
+ self.insertOrUpdateIfExist("#{childTableName}_table", recordWhere, childRecord)
300
+ i += 1
301
+
302
+ end
303
+ end
304
+
305
+ def extractFromHash(value, key = nil)
306
+
307
+ return nil unless(value)
308
+ value = eval(value) if(value[0] == '{' && value[-1] == '}') # E' un hash table
309
+ return value[key] if(value && key)
310
+ return value
311
+
312
+ end
313
+
314
+ def parentChildValueOf(parentTableName, childTableName, parentTableId, fieldName, key = nil)
315
+
316
+ return nil if(parentTableId == -1)
317
+
318
+ selectQuery = "select field_value from #{childTableName}_table where field_name = '#{fieldName}' and #{parentTableName}_id = #{parentTableId}"
319
+ value = self.run(selectQuery).dataByFieldName(0, "field_value")
320
+ return extractFromHash(value, key)
321
+
322
+ end
323
+
324
+ def parentChildValueOfByUsername(parentTableName, childTableName, username, fieldName, key = nil)
325
+
326
+ selectQuery = "select id from #{parentTableName}_table where username = '#{username}'"
327
+ parentTableId = self.run(selectQuery).dataByFieldName(0, "id")
328
+ return self.parentChildValueOf(parentTableName, childTableName, parentTableId, fieldName, key)
329
+
330
+ end
331
+
332
+ def show()
333
+
334
+ self.fieldNameList().show()
335
+ puts
336
+ @resultTable.each do |row|
337
+ row.each do |key, value|
338
+ print "%-15s" % row[key]
339
+ end
340
+ puts
341
+ end
342
+
343
+ end
344
+
345
+ end
346
+
347
+
348
+
349
+