lore 0.4.5 → 0.4.6
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/lore/table_accessor.rb +59 -30
- data/lib/lore/table_deleter.rb +2 -0
- data/lib/lore/table_inserter.rb +2 -0
- data/lib/lore/table_instance.rb +0 -1
- data/lib/lore/table_selector.rb +4 -34
- data/lib/lore/table_updater.rb +2 -0
- data/lib/lore.rb +1 -1
- data/lore.gemspec +1 -1
- metadata +2 -2
data/lib/lore/table_accessor.rb
CHANGED
@@ -794,7 +794,7 @@ public
|
|
794
794
|
# instance holding it.
|
795
795
|
# Note that this method is operating on a Table_Accessor instance, not
|
796
796
|
# on class Table_Accessor itself.
|
797
|
-
def initialize(instance_attrib_values,
|
797
|
+
def initialize(instance_attrib_values, joined_models=[], cache=nil)
|
798
798
|
# {{{
|
799
799
|
@loaded_from_cache = (cache == :cached)
|
800
800
|
# set instance variables.
|
@@ -821,6 +821,7 @@ public
|
|
821
821
|
}
|
822
822
|
}
|
823
823
|
end
|
824
|
+
|
824
825
|
setup_instance()
|
825
826
|
end # }}}
|
826
827
|
|
@@ -1544,19 +1545,66 @@ private
|
|
1544
1545
|
|
1545
1546
|
end # }}}
|
1546
1547
|
|
1548
|
+
private
|
1549
|
+
|
1550
|
+
def self.distribute_attrib_values(attrib_values)
|
1551
|
+
# {{{
|
1552
|
+
values = Hash.new
|
1553
|
+
# Predefine
|
1554
|
+
attrib_name_array = Array.new
|
1555
|
+
# distribute attrib names to tables:
|
1556
|
+
get_attributes().each_pair { |table, attribs|
|
1557
|
+
table_values = Hash.new
|
1558
|
+
|
1559
|
+
attrib_name_array = Array.new
|
1560
|
+
attrib_values.each_pair { |attrib_name, attrib_value|
|
1561
|
+
attrib_name = attrib_name.to_s
|
1562
|
+
attrib_name_array = attrib_name.split('.')
|
1563
|
+
|
1564
|
+
if attribs.include? attrib_name then
|
1565
|
+
table_values[attrib_name] = attrib_value
|
1566
|
+
elsif attribs.include? attrib_name_array.at(2) and
|
1567
|
+
attrib_name_array.at(0)+'.'+attrib_name_array.at(1) == table then
|
1568
|
+
table_values[attrib_name_array.at(2)] = attrib_value
|
1569
|
+
end
|
1570
|
+
}
|
1571
|
+
values[table] = table_values
|
1572
|
+
}
|
1573
|
+
values
|
1574
|
+
end # }}}
|
1575
|
+
|
1576
|
+
public
|
1577
|
+
|
1578
|
+
# Create a shallow instance, that is: An instance with no reference to
|
1579
|
+
# DB model. Attribute values passed to Table_Accessor.create_shallow are
|
1580
|
+
# not processed through hooks, filters, and validation.
|
1581
|
+
# Values are, however, processed through output filters.
|
1582
|
+
# Usage and result is
|
1583
|
+
# the same as for Table_Accessor.create, but it only returns
|
1584
|
+
# an accessor instance, without storing it in the database.
|
1585
|
+
# To commit a shallow copy to database (and thus process given attribute
|
1586
|
+
# values through stages mentioned before), call #commit.
|
1587
|
+
def self.create_shallow(attrib_values)
|
1588
|
+
before_create(attrib_values)
|
1589
|
+
values = distribute_attrib_values(attrib_values)
|
1590
|
+
flat_attribs = []
|
1591
|
+
get_all_table_names.each { |table|
|
1592
|
+
get_attributes[table].each { |attrib|
|
1593
|
+
flat_attribs << (values[table][attrib])
|
1594
|
+
}
|
1595
|
+
}
|
1596
|
+
instance = self.new(flat_attribs)
|
1597
|
+
end
|
1598
|
+
|
1547
1599
|
public
|
1548
1600
|
|
1549
1601
|
##########################################################################
|
1550
1602
|
# Returns a new Table_Accessor instance by inserting given attribute
|
1551
1603
|
# values into db and returning an instance for further operations.
|
1552
|
-
def self.create(attrib_values)
|
1604
|
+
def self.create(attrib_values={})
|
1553
1605
|
# {{{
|
1554
1606
|
before_create(attrib_values)
|
1555
1607
|
|
1556
|
-
values = Hash.new
|
1557
|
-
|
1558
|
-
Lore.log { 'KLASS: ' << attrib_values.class.to_s }
|
1559
|
-
Lore.log { 'INSERTING VALUES: ' << attrib_values.inspect }
|
1560
1608
|
input_filters = get_input_filters
|
1561
1609
|
attrib_key = ''
|
1562
1610
|
attrib_name = ''
|
@@ -1574,26 +1622,7 @@ public
|
|
1574
1622
|
}
|
1575
1623
|
after_filters(attrib_values)
|
1576
1624
|
|
1577
|
-
|
1578
|
-
attrib_name_array = Array.new
|
1579
|
-
# distribute attrib names to tables:
|
1580
|
-
get_attributes().each_pair { |table, attribs|
|
1581
|
-
table_values = Hash.new
|
1582
|
-
|
1583
|
-
attrib_name_array = Array.new
|
1584
|
-
attrib_values.each_pair { |attrib_name, attrib_value|
|
1585
|
-
attrib_name = attrib_name.to_s
|
1586
|
-
attrib_name_array = attrib_name.split('.')
|
1587
|
-
|
1588
|
-
if attribs.include? attrib_name then
|
1589
|
-
table_values[attrib_name] = attrib_value
|
1590
|
-
elsif attribs.include? attrib_name_array.at(2) and
|
1591
|
-
attrib_name_array.at(0)+'.'+attrib_name_array.at(1) == table then
|
1592
|
-
table_values[attrib_name_array.at(2)] = attrib_value
|
1593
|
-
end
|
1594
|
-
}
|
1595
|
-
values[table] = table_values
|
1596
|
-
}
|
1625
|
+
values = distribute_attrib_values(attrib_values)
|
1597
1626
|
|
1598
1627
|
begin
|
1599
1628
|
before_validation(values)
|
@@ -1621,10 +1650,6 @@ public
|
|
1621
1650
|
}
|
1622
1651
|
end
|
1623
1652
|
|
1624
|
-
# Create klass instance via new:
|
1625
|
-
# Cuba::Module.new(self, attrib_values)
|
1626
|
-
|
1627
|
-
# Create klass instance via load (wrapper of new):
|
1628
1653
|
obj = self.load(select_keys)
|
1629
1654
|
after_create(obj)
|
1630
1655
|
|
@@ -1657,6 +1682,10 @@ public
|
|
1657
1682
|
|
1658
1683
|
return false if select_keys.empty?
|
1659
1684
|
|
1685
|
+
# We have to perform a select here instead of returning
|
1686
|
+
# the instance with given attribute values, as this is the
|
1687
|
+
# only way to retreive attribute values set in the DB via
|
1688
|
+
# default values, triggers, etc.
|
1660
1689
|
cp = Clause.for(self)
|
1661
1690
|
c = Clause.new
|
1662
1691
|
select_keys.each_pair { |k,v|
|
data/lib/lore/table_deleter.rb
CHANGED
@@ -102,6 +102,8 @@ module Table_Deleter # :nodoc:
|
|
102
102
|
Context.enter(accessor.get_context) unless accessor.get_context.nil?
|
103
103
|
begin
|
104
104
|
Lore::Connection.perform("BEGIN;\n#{query_string}\nCOMMIT;")
|
105
|
+
rescue ::Exception => excep
|
106
|
+
Lore::Connection.perform("ROLLBACK;")
|
105
107
|
ensure
|
106
108
|
Context.leave unless accessor.get_context.nil?
|
107
109
|
end
|
data/lib/lore/table_inserter.rb
CHANGED
@@ -154,6 +154,8 @@ module Table_Inserter # :nodoc:
|
|
154
154
|
|
155
155
|
begin
|
156
156
|
Lore::Connection.perform("BEGIN;\n#{query_string}\nCOMMIT;")
|
157
|
+
rescue ::Exception => excep
|
158
|
+
Lore::Connection.perform("ROLLBACK;")
|
157
159
|
ensure
|
158
160
|
Lore::Context.leave unless accessor.get_context.nil?
|
159
161
|
end
|
data/lib/lore/table_instance.rb
CHANGED
data/lib/lore/table_selector.rb
CHANGED
@@ -70,35 +70,6 @@ public
|
|
70
70
|
return query_string
|
71
71
|
end # def
|
72
72
|
|
73
|
-
public
|
74
|
-
|
75
|
-
# Extracted, recursive method for building the AS-part of
|
76
|
-
# a SELECT query.
|
77
|
-
def self.build_as_query(table_fields,
|
78
|
-
query_string='')
|
79
|
-
|
80
|
-
return '*'
|
81
|
-
|
82
|
-
first = query_string == ''
|
83
|
-
|
84
|
-
table_fields.each_pair { |table_name, fields|
|
85
|
-
|
86
|
-
fields.each { |foreign_field|
|
87
|
-
|
88
|
-
# base.table.foreign_field =
|
89
|
-
query_string << ', ' unless first
|
90
|
-
query_string << "\n #{table_name}.#{foreign_field} AS "
|
91
|
-
query_string << "\"#{table_name}.#{foreign_field}\""
|
92
|
-
|
93
|
-
first = false
|
94
|
-
}
|
95
|
-
|
96
|
-
}
|
97
|
-
|
98
|
-
query_string
|
99
|
-
|
100
|
-
end #def
|
101
|
-
|
102
73
|
protected
|
103
74
|
|
104
75
|
def self.build_select_query(accessor,
|
@@ -106,8 +77,7 @@ protected
|
|
106
77
|
# this is to be wrapped in an adapter to provide DB abstraction:
|
107
78
|
|
108
79
|
table_name = accessor.get_table_name
|
109
|
-
query_string = 'SELECT '
|
110
|
-
query_string << build_as_query(accessor.get_attributes)
|
80
|
+
query_string = 'SELECT * '
|
111
81
|
query_string << ' FROM ' << table_name + ' '
|
112
82
|
query_string << build_joined_query(accessor)
|
113
83
|
query_string << "\n WHERE "
|
@@ -151,7 +121,7 @@ protected
|
|
151
121
|
end
|
152
122
|
|
153
123
|
if(what.nil? || what == '*' || what == '') then
|
154
|
-
query_as_part =
|
124
|
+
query_as_part = '*'
|
155
125
|
else
|
156
126
|
query_as_part = what.to_s
|
157
127
|
end
|
@@ -232,7 +202,7 @@ protected
|
|
232
202
|
else
|
233
203
|
db_result = perform_select(accessor, query_string[:query]).get_rows()
|
234
204
|
db_result[:values].each { |row|
|
235
|
-
result.push(accessor.new(row,
|
205
|
+
result.push(accessor.new(row, query_string[:joined_models]))
|
236
206
|
}
|
237
207
|
if Lore.cache_enabled? && accessor.entity_cache then
|
238
208
|
accessor.entity_cache.create(accessor, query_string, result)
|
@@ -276,7 +246,7 @@ protected
|
|
276
246
|
else
|
277
247
|
db_result = perform_select(accessor, query_string).get_rows()
|
278
248
|
db_result[:values].each { |row|
|
279
|
-
result.push(accessor.new(row
|
249
|
+
result.push(accessor.new(row))
|
280
250
|
}
|
281
251
|
if Lore.cache_enabled? && accessor.entity_cache then
|
282
252
|
accessor.create_entity_cache(query_string, result)
|
data/lib/lore/table_updater.rb
CHANGED
@@ -142,6 +142,8 @@ module Table_Updater # :nodoc:
|
|
142
142
|
Context.enter(accessor.get_context) unless accessor.get_context.nil?
|
143
143
|
begin
|
144
144
|
Lore::Connection.perform("BEGIN;\n#{query_string}\nCOMMIT;")
|
145
|
+
rescue ::Exception => excep
|
146
|
+
Lore::Connection.perform("ROLLBACK;")
|
145
147
|
ensure
|
146
148
|
Context.leave unless accessor.get_context.nil?
|
147
149
|
end
|
data/lib/lore.rb
CHANGED
data/lore.gemspec
CHANGED
@@ -16,7 +16,7 @@ spec = Gem::Specification.new { |s|
|
|
16
16
|
high coverage of native SQL functions and features.
|
17
17
|
Lore is currently using PostgreSQL as database backend.
|
18
18
|
EOF
|
19
|
-
s.version = '0.4.
|
19
|
+
s.version = '0.4.6'
|
20
20
|
s.author = 'Tobias Fuchs'
|
21
21
|
s.email = 'fuchs@atomnode.net'
|
22
22
|
s.date = Time.now
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lore
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Fuchs
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-11-
|
12
|
+
date: 2008-11-24 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|