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,248 @@
1
+ #!/usr/bin/env ruby
2
+ require 'hdb/hdbi.rb'
3
+
4
+ class HODB
5
+
6
+ def self.test_1
7
+ contacts = Contacts.new
8
+ contacts.create({surname: 'Bonaffini',
9
+ name: 'Herbert',
10
+ address: 'Herbert Strasse',
11
+ delivery_address: 'Herbert - Delivery',
12
+ invoice_address: 'Herbert - Invoice'})
13
+ contacts.show('hight_red', false)
14
+ contacts.writeAll
15
+ contacts.all
16
+ contacts.show('hight_yellow', false)
17
+ end
18
+
19
+ def self.test_2
20
+ suppliers = Suppliers.new
21
+ suppliers.create({surname: 'Viola',
22
+ name: 'Ugo',
23
+ address: 'Viola Strasse',
24
+ delivery_address: 'Viola - Delivery',
25
+ invoice_address: 'Viola - Invoice',
26
+ company_name: 'VIOLA SPA'})
27
+ suppliers.show('hight_cyan', false)
28
+ suppliers.writeAll
29
+ suppliers.all
30
+ suppliers.show('hight_cyan', false)
31
+ end
32
+
33
+ def self.test_3
34
+
35
+ suppliers = Suppliers.new
36
+ supplier = suppliers.findBy_name_and_surname("Mario", "Rossi")
37
+ supplier.show
38
+
39
+ end
40
+
41
+ def self.test_4
42
+ foods = Foods.new
43
+ foods.all
44
+ foods.each do |record|
45
+ p record.name
46
+ p record.categories_id.name
47
+ end
48
+
49
+ end
50
+
51
+ def self.test_showCategories
52
+
53
+ categories = Categories.new
54
+ categories.all
55
+ categories.show
56
+ categories.each do |record|
57
+ p record.name
58
+ record.foods_table.show # polimorfismo runtime
59
+ end
60
+
61
+ end
62
+
63
+ def self.oneToMany
64
+
65
+ printers = Printers.new
66
+ kitchen = printers.create({name: 'KITCHEN'})
67
+ pizzeria = printers.create({name: 'PIZZERIA'})
68
+ bar = printers.create({name: 'BAR'})
69
+
70
+ categories = Categories.new
71
+ pizze = categories.create({name: 'PIZZE BABY'}).foods_table
72
+ primi = categories.create({name: 'PRIMI BABY'})
73
+ beverage = categories.create({name: 'BEVERAGE'}).foods_table
74
+
75
+ pizze.create({name: 'Margherita Baby', description: 'Pomodoro, Mozzarella, Basilico', price: 10, printers_id: pizzeria})
76
+ pizze.create({name: 'Marinara Baby', description: 'Pomodoro, Aglio, Olio', price: 10, printers_id: pizzeria})
77
+ pizze.create({name: 'Capricciosa Baby', description: 'Pomodoro, Mozzarella, Funghi, Olive, Uovo, Piselli, Wurstell', price: 10, printers_id: pizzeria})
78
+ pizze.create({name: 'Capricciosa Baby', description: 'Pomodoro, Mozzarella, Funghi, Olive, Uovo, Piselli, Wurstell', price: 10, printers_id: pizzeria})
79
+ pizze.create({name: 'Napoli Baby', description: 'Pomodoro, Mozzarella, Acciughe', price: 10, printers_id: pizzeria})
80
+ pizze.create({name: 'Taggiasca Baby', description: 'Pomodoro, Mozzarella, Olive', price: 10, printers_id: pizzeria})
81
+
82
+ primi.foods_table.create({name: 'Tagliatelle ai Porcini', description: 'Fresh Mushrooms', price: 10, printers_id: kitchen})
83
+
84
+ primi.name = "PRIMI ITALIANI"
85
+
86
+ beverage.create({name: 'Coke', description: 'Water and Sugar', price: 2, printers_id: bar})
87
+
88
+ categories.writeAll
89
+
90
+ end
91
+
92
+ def self.oneToOne
93
+
94
+ margherita = Foods.new.findBy_name("Margherita Baby")
95
+ margherita.printers_id.show # oneToOne
96
+ margherita.categories_id.show # manyToOne
97
+
98
+ end
99
+
100
+ def self.manyToMany
101
+
102
+ models = Models.new
103
+ baby = models.create({name: 'Baby Format', description: 'baby format'})
104
+ family = models.create({name: 'Family Format', description: 'family format'})
105
+
106
+ categories = Categories.new
107
+ konditorei = categories.create({name: 'KONDITOREI'}).foods_table
108
+ sacher = konditorei.create({name: 'Sacher Torte', description: 'schokolade und marmelade', price: 10})
109
+
110
+ sacher_modelds_join = sacher.models_join
111
+
112
+ sacher_modelds_join.create({models_id: baby})
113
+ sacher_modelds_join.create({models_id: family})
114
+
115
+ categories.writeAll
116
+
117
+ end
118
+
119
+ def self.manyToMany_2
120
+
121
+ sacher = Foods.new.findBy_name("Sacher Torte")
122
+ sacher.models_join.rightModel.show
123
+
124
+ end
125
+
126
+ def self.manyToMany_3
127
+
128
+ family = Models.new.findBy_name("Family Format")
129
+
130
+ margherita = Foods.new.findBy_name("Margherita Baby")
131
+ margherita_models_join = margherita.models_join
132
+ margherita_models_join.create({models_id: family})
133
+
134
+ # margherita.writeAll non funzionerebbe perche' non proviene da una create
135
+ # la writeAll deve quindi essere eseguita dalla create radice in questo caso margherita_models_join
136
+ margherita_models_join.writeAll
137
+
138
+ end
139
+
140
+ def self.test_save
141
+
142
+ pizze = Categories.new.findBy_name("PIZZE").foods_table
143
+ pizze.create({name: 'Diavola', description: 'Pomodoro, Mozzarella, Salamino e Peperoncino', price: 10})
144
+ pizze.each do |pizza|
145
+ pizza.price = 1 #Random.rand(10)
146
+ pizza.printers_id = 1
147
+ end
148
+ #pizze.show
149
+ pizze.writeAll
150
+ pizze.saveAll
151
+
152
+ end
153
+
154
+ def self.test_save2
155
+
156
+ capricciosa = Foods.new.findBy_name("Capricciosa")
157
+ capricciosa.printers_id.name = "pizzeria"
158
+ #capricciosa.show
159
+ capricciosa.saveAll
160
+
161
+
162
+ puts "§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§".red
163
+ pizze = Categories.new.findBy_name("PIZZE")
164
+ pizze.foods_table.each do |pizza|
165
+ pizza.printers_id.name = "pippo"
166
+ end
167
+ #pizze.saveAll
168
+ pizze.ok
169
+
170
+
171
+ end
172
+
173
+ def self.test_delete
174
+
175
+ pizze = Categories.new.findBy_name("PIZZE").foods_table
176
+
177
+ rustica = pizze.create({name: 'Rustica', description: 'Pomodoro, Mozzarella, Olive', price: 10})
178
+ biancaneve = pizze.create({name: 'Biancaneve', description: 'Aglio, Olio', price: 10})
179
+ pizze.show
180
+ capricciosa = Foods.new.findBy_name("Capricciosa")
181
+ pizze.remove(rustica)
182
+ pizze.remove(capricciosa)
183
+ pizze.writeAll
184
+
185
+ end
186
+
187
+ # Ci sono diversi modi per creare dei campi virtuali
188
+ # Il primo e' quello di creare una funzione all'interno nel modello es. per creare il campo amount:
189
+ #
190
+ # self.amount_virtual = HField.magic()
191
+ #
192
+ # def amount
193
+ # return price.to_i * 2
194
+ # end
195
+ #
196
+ # In realta' se togliamo l'istruzione magic funziona lo stesso ma non si capisce che amount e' un campo del modello
197
+ #
198
+ # Il secondo e' quello di creare il campo fuori dal modello in modo da avere piu' versatilita'
199
+ # In tal modo posso aggiungere i campi runtime
200
+ #
201
+ # - products = Products.new
202
+ # - products.amount = HField.virtual(:amount, self) # dove amount e' la funzione e self e' l'oggetto contenente la funzione
203
+ #
204
+ # Il terzo e' quello di passare direttamente un blocco es.
205
+ #
206
+ # - products.amount = HField.virtual { |this| this.price.to_i }
207
+
208
+ def self.amount(this)
209
+ return this.quantity * this.price.to_i
210
+ end
211
+
212
+ def self.virtualFields
213
+
214
+ products = Products.new
215
+ products.quantity = HField.virtual { |this| this.categories_id.id.to_i }
216
+ products.amount = HField.virtual(:amount, HODB) # Secondo metodo ma passando il nome della classe essendo statica
217
+ #products.amount = HField.virtual { |this| this.quantity * this.price.to_i } # Terzo metodo
218
+ products.all
219
+ products.show("red", [:id, :quantity, :price, :amount, :score, :random])
220
+
221
+ end
222
+
223
+ def self.test
224
+
225
+ #HDBGenerator.new(true)
226
+ #self.test_save2
227
+ #self.virtualFields
228
+ #return
229
+ HDBGenerator.new(true)
230
+ self.test_1
231
+ self.test_2
232
+ self.test_3
233
+ self.test_4
234
+ self.oneToMany
235
+ self.oneToOne
236
+ self.manyToMany
237
+ self.manyToMany_2
238
+ self.manyToMany_3
239
+ self.test_showCategories
240
+ self.test_save
241
+ self.test_save2
242
+ self.virtualFields
243
+ #self.test_delete
244
+
245
+ end
246
+
247
+
248
+ end
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env ruby
2
+ require 'hdb/hdb'
3
+
4
+ class HDBGenerator
5
+
6
+ def newOdb(modelName)
7
+ className = modelName.hcapitalize
8
+ return eval("#{className}.new")
9
+ end
10
+
11
+ def initialize(dropTables = false, connectionName = "default")
12
+ self.initModule("quickmanager", dropTables, connectionName)
13
+ return
14
+ HDir.new("#{Dir.pwd}/app/modules/*").onlyDirectories().each do |moduleName|
15
+ self.initModule(moduleName, dropTables, connectionName)
16
+ end
17
+ end
18
+
19
+
20
+ def initModule(moduleName, dropTables = false, connectionName = "default")
21
+ @moduleName = moduleName
22
+ @connectionName = connectionName
23
+ @dropTables = dropTables
24
+
25
+ databases = self.databases()
26
+ @dbTables = self.tables()
27
+
28
+ @htables = {} # hypersonic tables
29
+ for filename in Dir.glob("#{Dir.pwd}/app/modules/#{@moduleName}/*/*.rb") do
30
+ modelName = File.basename(filename).chomp('.rb')
31
+ @htables[modelName] = {}
32
+ self.createScaffoldTable(modelName)
33
+ end
34
+
35
+ @htables.each do |modelName, emptyHash|
36
+ oodb = self.newOdb(modelName)
37
+ emptyHash[:oodb] = oodb if oodb.generate
38
+ end
39
+
40
+ @htables.each { |modelName, oodb| self.dropTable(modelName) }
41
+
42
+ @dbTables = self.tables()
43
+ @htables.each { |modelName, oodb| self.createScaffoldTable(modelName) }
44
+ @htables.each do |modelName, oodb|
45
+ fields = self.fields(modelName)
46
+ hfields = oodb[:oodb].hfields(false)
47
+
48
+ fieldsToDrop = fields - hfields.keys - oodb[:oodb].systemFields().keys()
49
+ self.dropFields(modelName, fieldsToDrop)
50
+
51
+ self.before(modelName)
52
+ hfields.each do |fieldName, fieldAttrs|
53
+ hl << "#{modelName}.#{fieldName} #{fieldAttrs}"
54
+
55
+ next if fields.include?(fieldName)
56
+ next if (fieldAttrs[:type] == "oneToMany")
57
+ if (fieldAttrs[:type] == "manyToMany")
58
+ self.createTableManyToMany(modelName, fieldAttrs)
59
+ next
60
+ end
61
+
62
+ type = self.toType(fieldAttrs[:type])
63
+ self.addField(modelName,
64
+ fieldName,
65
+ type,
66
+ fieldAttrs[:constraint],
67
+ fieldAttrs[:default],
68
+ fieldAttrs[:modelNameReference],
69
+ fieldAttrs[:onDelete],
70
+ fieldAttrs[:onUpdate])
71
+ end
72
+ self.after(modelName)
73
+ end
74
+
75
+ @htables.each do |modelName, oodb|
76
+ self.dataLoader(modelName) if oodb[:generated]
77
+ end
78
+
79
+ end
80
+
81
+ def createScaffoldTable(modelName)
82
+ unless @dbTables.include?(modelName)
83
+ self.createTable(modelName)
84
+ self.addSystemFields(modelName)
85
+ @htables[modelName][:generated] = true
86
+ end
87
+ end
88
+
89
+ def createTableManyToMany(modelName, fieldAttrs)
90
+ p fieldAttrs
91
+ type = self.toType(fieldAttrs[:type])
92
+ _modelName = fieldAttrs[:joinTable]
93
+ return if !@dropTables and @dbTables.include?(_modelName)
94
+ self.dropTable(_modelName)
95
+ self.createTable(_modelName)
96
+ self.addSystemFields(_modelName)
97
+ self.addField(_modelName, fieldAttrs[:referenceFieldName], type,
98
+ fieldAttrs[:constraint], fieldAttrs[:default], modelName)
99
+ self.addField(_modelName, fieldAttrs[:referenceFieldName2], type,
100
+ fieldAttrs[:constraint], fieldAttrs[:default], fieldAttrs[:modelNameReference])
101
+ end
102
+
103
+ def dropTable(modelName)
104
+ return unless @dbTables.include?(modelName)
105
+ return unless @dropTables
106
+ hdb(@connectionName).execute("DROP TABLE #{modelName} CASCADE")
107
+ @dbTables.delete(modelName)
108
+ end
109
+
110
+ def createTable(modelName)
111
+ return if @dbTables.include?(modelName)
112
+ hdb(@connectionName).execute("CREATE TABLE #{modelName} ()")
113
+ @dbTables << modelName
114
+ end
115
+
116
+
117
+ def addSystemFields(modelName)
118
+ self.addField(modelName, :id, 'SERIAL', 'PRIMARY KEY')
119
+ end
120
+
121
+ def before(modelName)
122
+ end
123
+
124
+ def after(modelName)
125
+ end
126
+
127
+ def disableTrigger(modelName)
128
+ @htables[modelName][:oodb].allParents().each do |parent|
129
+ hdb(@connectionName).execute("ALTER TABLE #{parent.modelName} DISABLE TRIGGER ALL")
130
+ end
131
+ end
132
+
133
+ def enableTrigger(modelName)
134
+ @htables[modelName][:oodb].allParents().each do |parent|
135
+ hdb(@connectionName).execute("ALTER TABLE #{parent.modelName} ENABLE TRIGGER ALL")
136
+ end
137
+ end
138
+
139
+ def dataLoader(modelName)
140
+
141
+ self.disableTrigger(modelName)
142
+ filename = "modules/#{@moduleName}/models/#{modelName}/default_data.yml"
143
+ HDataLoader.new(filename, @connectionName).load()
144
+ self.enableTrigger(modelName)
145
+
146
+ end
147
+
148
+ def dropFields(modelName, fields)
149
+
150
+ fields.each do |field|
151
+ self.dropField(modelName, field)
152
+ end
153
+
154
+ end
155
+
156
+ def dropField(modelName, fieldName)
157
+ hdb(@connectionName).execute("ALTER TABLE #{modelName} DROP COLUMN #{fieldName}")
158
+ end
159
+
160
+ def addField(modelName, fieldName, type, constraint = nil, default = nil, reference = nil, onDelete = nil, onUpdate = nil)
161
+ onDelete = " ON DELETE #{onDelete}" if onDelete
162
+ onUpdate = " ON UPDATE #{onUpdate}" if onUpdate
163
+ reference = " REFERENCES #{reference}(id)" if reference
164
+ constraint = " #{constraint}" if constraint != nil
165
+ default = " DEFAULT #{hdb.q(default)}" if default != nil # default could be false and so is correct default != nil
166
+ hdb(@connectionName).execute("ALTER TABLE #{modelName} ADD COLUMN #{fieldName} #{type}#{constraint}#{reference}#{onDelete}#{onUpdate}#{default}") if type
167
+ end
168
+
169
+ def toType(type)
170
+
171
+ toPgTypes = {
172
+ boolean: 'bool',
173
+ integer: 'int4',
174
+ float: 'real',
175
+ text: 'text',
176
+ html: 'text',
177
+ date: 'date',
178
+ datetime: 'timestamp',
179
+ binary: 'bytea',
180
+ oneToOne: 'int4',
181
+ manyToOne: 'int4',
182
+ oneToMany: 'int4',
183
+ manyToMany: 'int4',
184
+ serialized: 'text',
185
+ virtual: nil
186
+ }
187
+ return toPgTypes.include?(type.to_sym) ? toPgTypes[type.to_sym] : type
188
+
189
+ end
190
+
191
+
192
+ def databases
193
+ result = hdb(@connectionName).select(:datname).from(:pg_database).where({datistemplate: 'false'}).execute
194
+ return result.table.column(:datname)
195
+ end
196
+
197
+ def tables
198
+ result = hdb(@connectionName).select(:tablename).from(:pg_tables).where(["schemaname != 'pg_catalog'", "schemaname != 'information_schema'"]).execute
199
+ return result.table.column(:tablename)
200
+ end
201
+
202
+ # column_name, data_type, column_default, ordinal_position
203
+ def fields(modelName, fieldName = "column_name")
204
+ result = hdb(@connectionName).select(fieldName).from('information_schema.columns').where({table_name: modelName}).execute
205
+ return result.table if fieldName == "*"
206
+ return result.table.column(fieldName)
207
+ end
208
+
209
+ end
210
+
211
+