lafcadio 0.7.3 → 0.7.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/lafcadio.rb +1 -2
- data/lib/lafcadio.rb~ +1 -2
- data/lib/lafcadio/dateTime.rb~ +3 -3
- data/lib/lafcadio/depend.rb +5 -1
- data/lib/lafcadio/depend.rb~ +8 -0
- data/lib/lafcadio/domain.rb +92 -27
- data/lib/lafcadio/domain.rb~ +103 -27
- data/lib/lafcadio/mock.rb +28 -13
- data/lib/lafcadio/mock.rb~ +8 -4
- data/lib/lafcadio/objectField.rb +103 -103
- data/lib/lafcadio/objectField.rb~ +102 -99
- data/lib/lafcadio/objectStore.rb +11 -15
- data/lib/lafcadio/objectStore.rb~ +12 -14
- data/lib/lafcadio/query.rb +42 -16
- data/lib/lafcadio/query.rb~ +44 -23
- data/lib/lafcadio/schema.rb +4 -4
- data/lib/lafcadio/schema.rb~ +56 -0
- data/lib/lafcadio/test.rb +1 -1
- data/lib/lafcadio/test.rb~ +6 -1
- data/lib/lafcadio/util.rb +14 -297
- data/lib/lafcadio/util.rb~ +25 -210
- metadata +48 -6
- data/lib/lafcadio/dateTime.rb +0 -93
data/lib/lafcadio.rb
CHANGED
data/lib/lafcadio.rb~
CHANGED
data/lib/lafcadio/dateTime.rb~
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Lafcadio
|
2
|
-
# Represents a specific month in time. With the exception of
|
3
|
-
# (which returns a zero-based array), every usage of the
|
4
|
-
# that 1 equals January and 12 equals December.
|
2
|
+
# Represents a specific month in time. With the exception of
|
3
|
+
# Month.month_names (which returns a zero-based array), every usage of the
|
4
|
+
# month value assumes that 1 equals January and 12 equals December.
|
5
5
|
class Month
|
6
6
|
# Returns an array of the full names of months (in English). Note that
|
7
7
|
# "January" is the 0th element, and "December" is the 11th element.
|
data/lib/lafcadio/depend.rb
CHANGED
data/lib/lafcadio/domain.rb
CHANGED
@@ -98,7 +98,7 @@ module Lafcadio
|
|
98
98
|
|
99
99
|
def value_from_elt( elt )
|
100
100
|
hash = {}
|
101
|
-
elt.elements.each(
|
101
|
+
elt.elements.each( @name.singular ) { |subElt|
|
102
102
|
key = subElt.attributes['key'] == 'true'
|
103
103
|
value = subElt.text.to_s
|
104
104
|
hash[key] = value
|
@@ -155,9 +155,9 @@ module Lafcadio
|
|
155
155
|
# 2. Write one XML file per domain class. For example, a User.xml file
|
156
156
|
# might look like:
|
157
157
|
# <lafcadio_class_definition name="User">
|
158
|
-
# <field name="lastName" class="
|
159
|
-
# <field name="email" class="
|
160
|
-
# <field name="password" class="
|
158
|
+
# <field name="lastName" class="StringField"/>
|
159
|
+
# <field name="email" class="StringField"/>
|
160
|
+
# <field name="password" class="StringField"/>
|
161
161
|
# <field name="birthday" class="DateField"/>
|
162
162
|
# </lafcadio_class_definition>
|
163
163
|
# 2. Overriding DomainObject.get_class_fields. The method should return an Array
|
@@ -166,10 +166,10 @@ module Lafcadio
|
|
166
166
|
# class User < DomainObject
|
167
167
|
# def User.get_class_fields
|
168
168
|
# fields = []
|
169
|
-
# fields <<
|
170
|
-
# fields <<
|
171
|
-
# fields <<
|
172
|
-
# fields <<
|
169
|
+
# fields << StringField.new(self, 'firstName')
|
170
|
+
# fields << StringField.new(self, 'lastName')
|
171
|
+
# fields << StringField.new(self, 'email')
|
172
|
+
# fields << StringField.new(self, 'password')
|
173
173
|
# fields << DateField.new(self, 'birthday')
|
174
174
|
# fields
|
175
175
|
# end
|
@@ -188,13 +188,13 @@ module Lafcadio
|
|
188
188
|
# john.email = 'john.doe@mail.email.com'
|
189
189
|
#
|
190
190
|
# If your domain class has fields that refer to other domain classes, or even
|
191
|
-
# to another row in the same table, you can use a
|
191
|
+
# to another row in the same table, you can use a DomainObjectField to express the
|
192
192
|
# relation.
|
193
193
|
# <lafcadio_class_definition name="Message">
|
194
|
-
# <field name="subject" class="
|
195
|
-
# <field name="body" class="
|
196
|
-
# <field name="author" class="
|
197
|
-
# <field name="recipient" class="
|
194
|
+
# <field name="subject" class="StringField" />
|
195
|
+
# <field name="body" class="StringField" />
|
196
|
+
# <field name="author" class="DomainObjectField" linked_type="User" />
|
197
|
+
# <field name="recipient" class="DomainObjectField" linked_type="User" />
|
198
198
|
# <field name="dateSent" class="DateField" />
|
199
199
|
# </lafcadio_class_definition>
|
200
200
|
#
|
@@ -251,6 +251,9 @@ module Lafcadio
|
|
251
251
|
hash[key] = pk_field
|
252
252
|
}
|
253
253
|
@@sql_primary_keys = Hash.new( 'pk_id' )
|
254
|
+
@@default_field_setup_hashes = Hash.new { |hash, key|
|
255
|
+
hash[key] = Hash.new( {} )
|
256
|
+
}
|
254
257
|
|
255
258
|
COMMIT_ADD = 1
|
256
259
|
COMMIT_EDIT = 2
|
@@ -282,40 +285,56 @@ module Lafcadio
|
|
282
285
|
unless class_fields
|
283
286
|
@@class_fields[self] = self.get_class_fields
|
284
287
|
class_fields = @@class_fields[self]
|
288
|
+
class_fields.each do |class_field|
|
289
|
+
begin
|
290
|
+
undef_method class_field.name.to_sym
|
291
|
+
rescue NameError
|
292
|
+
# not defined globally or in an included Module, skip it
|
293
|
+
end
|
294
|
+
end
|
285
295
|
end
|
286
296
|
class_fields
|
287
297
|
end
|
288
298
|
|
289
299
|
def self.create_field( field_class, *args )
|
290
300
|
class_fields = @@class_fields[self]
|
301
|
+
if args.last.is_a? Hash
|
302
|
+
att_hash = args.last
|
303
|
+
else
|
304
|
+
att_hash = @@default_field_setup_hashes[self][field_class].clone
|
305
|
+
end
|
291
306
|
if class_fields.nil?
|
292
307
|
class_fields = [ @@pk_fields[self] ]
|
293
308
|
@@class_fields[self] = class_fields
|
294
309
|
end
|
295
|
-
if field_class ==
|
296
|
-
att_hash = args.last.is_a?( Hash ) ? args.last : {}
|
310
|
+
if field_class == DomainObjectField
|
297
311
|
att_hash['linked_type'] = args.first
|
298
312
|
att_hash['name'] = args[1] if args[1] and !args[1].is_a? Hash
|
299
313
|
else
|
300
|
-
att_hash = args[1] || {}
|
301
314
|
name = args.first
|
302
315
|
att_hash['name'] = name == String ? name : name.to_s
|
303
316
|
end
|
304
317
|
field = field_class.instantiate_with_parameters( self, att_hash )
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
318
|
+
unless class_fields.any? { |cf| cf.name == field.name }
|
319
|
+
att_hash.each { |field_name, value|
|
320
|
+
setter = field_name + '='
|
321
|
+
field.send( setter, value ) if field.respond_to?( setter )
|
322
|
+
}
|
323
|
+
class_fields << field
|
324
|
+
end
|
310
325
|
end
|
311
326
|
|
327
|
+
def self.default_field_setup_hash( field_class, hash )
|
328
|
+
@@default_field_setup_hashes[self][field_class] = hash
|
329
|
+
end
|
330
|
+
|
312
331
|
def self.dependent_classes #:nodoc:
|
313
332
|
dependent_classes = {}
|
314
333
|
DomainObject.subclasses.each { |aClass|
|
315
334
|
if aClass != DomainObjectProxy &&
|
316
335
|
(!DomainObject.abstract_subclasses.index(aClass))
|
317
336
|
aClass.class_fields.each { |field|
|
318
|
-
if ( field.is_a?(
|
337
|
+
if ( field.is_a?( DomainObjectField ) &&
|
319
338
|
field.linked_type == self.domain_class )
|
320
339
|
dependent_classes[aClass] = field
|
321
340
|
end
|
@@ -325,6 +344,13 @@ module Lafcadio
|
|
325
344
|
dependent_classes
|
326
345
|
end
|
327
346
|
|
347
|
+
def self.exist?( search_term, field_name = :pk_id )
|
348
|
+
query = Query.infer( self ) { |dobj|
|
349
|
+
dobj.send( field_name ).equals( search_term )
|
350
|
+
}
|
351
|
+
!ObjectStore.get_object_store.get_subset( query ).empty?
|
352
|
+
end
|
353
|
+
|
328
354
|
def self.first; all.first; end
|
329
355
|
|
330
356
|
def self.get_class_field(fieldName) #:nodoc:
|
@@ -398,7 +424,7 @@ module Lafcadio
|
|
398
424
|
|
399
425
|
def self.get_link_field( linked_domain_class ) # :nodoc:
|
400
426
|
class_fields.find { |field|
|
401
|
-
field.is_a?
|
427
|
+
field.is_a? DomainObjectField and field.linked_type == linked_domain_class
|
402
428
|
}
|
403
429
|
end
|
404
430
|
|
@@ -422,8 +448,10 @@ module Lafcadio
|
|
422
448
|
if block_given?
|
423
449
|
query = Query.infer( self ) { |dobj| yield( dobj ) }
|
424
450
|
ObjectStore.get_object_store.get_subset( query )
|
425
|
-
|
451
|
+
elsif args.size == 1
|
426
452
|
ObjectStore.get_object_store.get( self, *args )
|
453
|
+
else
|
454
|
+
ObjectStore.get_object_store.get_filtered( self.name, *args )
|
427
455
|
end
|
428
456
|
else
|
429
457
|
maybe_field_class_name = method_name.underscore_to_camel_case + 'Field'
|
@@ -431,7 +459,29 @@ module Lafcadio
|
|
431
459
|
field_class = Lafcadio.const_get( maybe_field_class_name )
|
432
460
|
create_field( field_class, *args )
|
433
461
|
rescue NameError
|
434
|
-
|
462
|
+
singular = method_name.singular
|
463
|
+
if singular
|
464
|
+
maybe_field_class_name = singular.underscore_to_camel_case + 'Field'
|
465
|
+
begin
|
466
|
+
field_class = Lafcadio.const_get( maybe_field_class_name )
|
467
|
+
arg = args.shift
|
468
|
+
until args.empty?
|
469
|
+
next_arg = args.shift
|
470
|
+
if next_arg.is_a? String or next_arg.is_a? Symbol
|
471
|
+
create_field( field_class, arg )
|
472
|
+
arg = next_arg
|
473
|
+
else
|
474
|
+
create_field( field_class, arg, next_arg )
|
475
|
+
arg = args.shift
|
476
|
+
end
|
477
|
+
end
|
478
|
+
create_field( field_class, arg ) unless arg.nil?
|
479
|
+
rescue NameError
|
480
|
+
super
|
481
|
+
end
|
482
|
+
else
|
483
|
+
super
|
484
|
+
end
|
435
485
|
end
|
436
486
|
end
|
437
487
|
end
|
@@ -504,7 +554,7 @@ module Lafcadio
|
|
504
554
|
if (!xmlParser.nil? && table_name = xmlParser.table_name)
|
505
555
|
table_name
|
506
556
|
else
|
507
|
-
|
557
|
+
self.basename.camel_case_to_underscore.plural
|
508
558
|
end
|
509
559
|
end
|
510
560
|
end
|
@@ -555,6 +605,7 @@ module Lafcadio
|
|
555
605
|
@error_messages = []
|
556
606
|
@fields = {}
|
557
607
|
@fields_set = []
|
608
|
+
@original_values = OriginalValuesHash.new( @fieldHash )
|
558
609
|
check_fields = LafcadioConfig.new()['checkFields']
|
559
610
|
verify if %w( onInstantiate onAllStates ).include?( check_fields )
|
560
611
|
end
|
@@ -580,6 +631,11 @@ module Lafcadio
|
|
580
631
|
end
|
581
632
|
@delete = value
|
582
633
|
end
|
634
|
+
|
635
|
+
def delete!
|
636
|
+
self.delete = true
|
637
|
+
commit
|
638
|
+
end
|
583
639
|
|
584
640
|
def get_field( field ) #:nodoc:
|
585
641
|
unless @fields_set.include?( field )
|
@@ -645,7 +701,7 @@ module Lafcadio
|
|
645
701
|
end
|
646
702
|
|
647
703
|
def set_field( field, value ) #:nodoc:
|
648
|
-
if field.class <=
|
704
|
+
if field.class <= DomainObjectField
|
649
705
|
if value.class != DomainObjectProxy && value
|
650
706
|
value = DomainObjectProxy.new(value)
|
651
707
|
end
|
@@ -658,6 +714,11 @@ module Lafcadio
|
|
658
714
|
@fields_set << field
|
659
715
|
end
|
660
716
|
|
717
|
+
def update!( changes )
|
718
|
+
changes.each do |sym, value| self.send( sym.to_s + '=', value ); end
|
719
|
+
commit
|
720
|
+
end
|
721
|
+
|
661
722
|
def verify
|
662
723
|
if ObjectStore.get_object_store.mock?
|
663
724
|
self.class.get_class_fields.each { |field|
|
@@ -665,6 +726,10 @@ module Lafcadio
|
|
665
726
|
}
|
666
727
|
end
|
667
728
|
end
|
729
|
+
|
730
|
+
class OriginalValuesHash < DelegateClass( Hash )
|
731
|
+
def []=( key, val ); raise NoMethodError; end
|
732
|
+
end
|
668
733
|
end
|
669
734
|
|
670
735
|
# Any domain class that is used mostly to map between two other domain
|
data/lib/lafcadio/domain.rb~
CHANGED
@@ -98,7 +98,7 @@ module Lafcadio
|
|
98
98
|
|
99
99
|
def value_from_elt( elt )
|
100
100
|
hash = {}
|
101
|
-
elt.elements.each(
|
101
|
+
elt.elements.each( @name.singular ) { |subElt|
|
102
102
|
key = subElt.attributes['key'] == 'true'
|
103
103
|
value = subElt.text.to_s
|
104
104
|
hash[key] = value
|
@@ -155,9 +155,9 @@ module Lafcadio
|
|
155
155
|
# 2. Write one XML file per domain class. For example, a User.xml file
|
156
156
|
# might look like:
|
157
157
|
# <lafcadio_class_definition name="User">
|
158
|
-
# <field name="lastName" class="
|
159
|
-
# <field name="email" class="
|
160
|
-
# <field name="password" class="
|
158
|
+
# <field name="lastName" class="StringField"/>
|
159
|
+
# <field name="email" class="StringField"/>
|
160
|
+
# <field name="password" class="StringField"/>
|
161
161
|
# <field name="birthday" class="DateField"/>
|
162
162
|
# </lafcadio_class_definition>
|
163
163
|
# 2. Overriding DomainObject.get_class_fields. The method should return an Array
|
@@ -166,10 +166,10 @@ module Lafcadio
|
|
166
166
|
# class User < DomainObject
|
167
167
|
# def User.get_class_fields
|
168
168
|
# fields = []
|
169
|
-
# fields <<
|
170
|
-
# fields <<
|
171
|
-
# fields <<
|
172
|
-
# fields <<
|
169
|
+
# fields << StringField.new(self, 'firstName')
|
170
|
+
# fields << StringField.new(self, 'lastName')
|
171
|
+
# fields << StringField.new(self, 'email')
|
172
|
+
# fields << StringField.new(self, 'password')
|
173
173
|
# fields << DateField.new(self, 'birthday')
|
174
174
|
# fields
|
175
175
|
# end
|
@@ -188,13 +188,13 @@ module Lafcadio
|
|
188
188
|
# john.email = 'john.doe@mail.email.com'
|
189
189
|
#
|
190
190
|
# If your domain class has fields that refer to other domain classes, or even
|
191
|
-
# to another row in the same table, you can use a
|
191
|
+
# to another row in the same table, you can use a DomainObjectField to express the
|
192
192
|
# relation.
|
193
193
|
# <lafcadio_class_definition name="Message">
|
194
|
-
# <field name="subject" class="
|
195
|
-
# <field name="body" class="
|
196
|
-
# <field name="author" class="
|
197
|
-
# <field name="recipient" class="
|
194
|
+
# <field name="subject" class="StringField" />
|
195
|
+
# <field name="body" class="StringField" />
|
196
|
+
# <field name="author" class="DomainObjectField" linked_type="User" />
|
197
|
+
# <field name="recipient" class="DomainObjectField" linked_type="User" />
|
198
198
|
# <field name="dateSent" class="DateField" />
|
199
199
|
# </lafcadio_class_definition>
|
200
200
|
#
|
@@ -251,6 +251,9 @@ module Lafcadio
|
|
251
251
|
hash[key] = pk_field
|
252
252
|
}
|
253
253
|
@@sql_primary_keys = Hash.new( 'pk_id' )
|
254
|
+
@@default_field_setup_hashes = Hash.new { |hash, key|
|
255
|
+
hash[key] = Hash.new( {} )
|
256
|
+
}
|
254
257
|
|
255
258
|
COMMIT_ADD = 1
|
256
259
|
COMMIT_EDIT = 2
|
@@ -258,11 +261,15 @@ module Lafcadio
|
|
258
261
|
|
259
262
|
include DomainComparable
|
260
263
|
|
264
|
+
def self.[]( pk_id ); get( pk_id ); end
|
265
|
+
|
261
266
|
def self.abstract_subclasses #:nodoc:
|
262
267
|
require 'lafcadio/domain'
|
263
268
|
[ MapObject ]
|
264
269
|
end
|
265
270
|
|
271
|
+
def self.all; ObjectStore.get_object_store.get_all( self ); end
|
272
|
+
|
266
273
|
# Returns an array of all fields defined for this class and all concrete
|
267
274
|
# superclasses.
|
268
275
|
def self.all_fields
|
@@ -278,22 +285,32 @@ module Lafcadio
|
|
278
285
|
unless class_fields
|
279
286
|
@@class_fields[self] = self.get_class_fields
|
280
287
|
class_fields = @@class_fields[self]
|
288
|
+
class_fields.each do |class_field|
|
289
|
+
begin
|
290
|
+
undef_method class_field.name.to_sym
|
291
|
+
rescue NameError
|
292
|
+
# not defined globally or in an included Module, skip it
|
293
|
+
end
|
294
|
+
end
|
281
295
|
end
|
282
296
|
class_fields
|
283
297
|
end
|
284
298
|
|
285
299
|
def self.create_field( field_class, *args )
|
286
300
|
class_fields = @@class_fields[self]
|
301
|
+
if args.last.is_a? Hash
|
302
|
+
att_hash = args.last
|
303
|
+
else
|
304
|
+
att_hash = @@default_field_setup_hashes[self][field_class].clone
|
305
|
+
end
|
287
306
|
if class_fields.nil?
|
288
307
|
class_fields = [ @@pk_fields[self] ]
|
289
308
|
@@class_fields[self] = class_fields
|
290
309
|
end
|
291
|
-
if field_class ==
|
292
|
-
att_hash = args.last.is_a?( Hash ) ? args.last : {}
|
310
|
+
if field_class == DomainObjectField
|
293
311
|
att_hash['linked_type'] = args.first
|
294
312
|
att_hash['name'] = args[1] if args[1] and !args[1].is_a? Hash
|
295
313
|
else
|
296
|
-
att_hash = args[1] || {}
|
297
314
|
name = args.first
|
298
315
|
att_hash['name'] = name == String ? name : name.to_s
|
299
316
|
end
|
@@ -305,13 +322,17 @@ module Lafcadio
|
|
305
322
|
class_fields << field
|
306
323
|
end
|
307
324
|
|
325
|
+
def self.default_field_setup_hash( field_class, hash )
|
326
|
+
@@default_field_setup_hashes[self][field_class] = hash
|
327
|
+
end
|
328
|
+
|
308
329
|
def self.dependent_classes #:nodoc:
|
309
330
|
dependent_classes = {}
|
310
331
|
DomainObject.subclasses.each { |aClass|
|
311
332
|
if aClass != DomainObjectProxy &&
|
312
333
|
(!DomainObject.abstract_subclasses.index(aClass))
|
313
334
|
aClass.class_fields.each { |field|
|
314
|
-
if ( field.is_a?(
|
335
|
+
if ( field.is_a?( DomainObjectField ) &&
|
315
336
|
field.linked_type == self.domain_class )
|
316
337
|
dependent_classes[aClass] = field
|
317
338
|
end
|
@@ -320,6 +341,15 @@ module Lafcadio
|
|
320
341
|
}
|
321
342
|
dependent_classes
|
322
343
|
end
|
344
|
+
|
345
|
+
def self.exist?( search_term, field_name = :pk_id )
|
346
|
+
query = Query.infer( self ) { |dobj|
|
347
|
+
dobj.send( field_name ).equals( search_term )
|
348
|
+
}
|
349
|
+
!ObjectStore.get_object_store.get_subset( query ).empty?
|
350
|
+
end
|
351
|
+
|
352
|
+
def self.first; all.first; end
|
323
353
|
|
324
354
|
def self.get_class_field(fieldName) #:nodoc:
|
325
355
|
field = nil
|
@@ -392,7 +422,7 @@ module Lafcadio
|
|
392
422
|
|
393
423
|
def self.get_link_field( linked_domain_class ) # :nodoc:
|
394
424
|
class_fields.find { |field|
|
395
|
-
field.is_a?
|
425
|
+
field.is_a? DomainObjectField and field.linked_type == linked_domain_class
|
396
426
|
}
|
397
427
|
end
|
398
428
|
|
@@ -408,14 +438,18 @@ module Lafcadio
|
|
408
438
|
(self != DomainObject && abstract_subclasses.index(self).nil?)
|
409
439
|
end
|
410
440
|
|
441
|
+
def self.last; all.last; end
|
442
|
+
|
411
443
|
def self.method_missing( methodId, *args ) #:nodoc:
|
412
444
|
method_name = methodId.id2name
|
413
445
|
if method_name == 'get'
|
414
446
|
if block_given?
|
415
447
|
query = Query.infer( self ) { |dobj| yield( dobj ) }
|
416
448
|
ObjectStore.get_object_store.get_subset( query )
|
417
|
-
|
449
|
+
elsif args.size == 1
|
418
450
|
ObjectStore.get_object_store.get( self, *args )
|
451
|
+
else
|
452
|
+
ObjectStore.get_object_store.get_filtered( self.name, *args )
|
419
453
|
end
|
420
454
|
else
|
421
455
|
maybe_field_class_name = method_name.underscore_to_camel_case + 'Field'
|
@@ -423,10 +457,34 @@ module Lafcadio
|
|
423
457
|
field_class = Lafcadio.const_get( maybe_field_class_name )
|
424
458
|
create_field( field_class, *args )
|
425
459
|
rescue NameError
|
426
|
-
|
460
|
+
singular = method_name.singular
|
461
|
+
if singular
|
462
|
+
maybe_field_class_name = singular.underscore_to_camel_case + 'Field'
|
463
|
+
begin
|
464
|
+
field_class = Lafcadio.const_get( maybe_field_class_name )
|
465
|
+
arg = args.shift
|
466
|
+
until args.empty?
|
467
|
+
next_arg = args.shift
|
468
|
+
if next_arg.is_a? String or next_arg.is_a? Symbol
|
469
|
+
create_field( field_class, arg )
|
470
|
+
arg = next_arg
|
471
|
+
else
|
472
|
+
create_field( field_class, arg, next_arg )
|
473
|
+
arg = args.shift
|
474
|
+
end
|
475
|
+
end
|
476
|
+
create_field( field_class, arg ) unless arg.nil?
|
477
|
+
rescue NameError
|
478
|
+
super
|
479
|
+
end
|
480
|
+
else
|
481
|
+
super
|
482
|
+
end
|
427
483
|
end
|
428
484
|
end
|
429
485
|
end
|
486
|
+
|
487
|
+
def self.only; all.only; end
|
430
488
|
|
431
489
|
def self.domain_class #:nodoc:
|
432
490
|
self
|
@@ -494,7 +552,7 @@ module Lafcadio
|
|
494
552
|
if (!xmlParser.nil? && table_name = xmlParser.table_name)
|
495
553
|
table_name
|
496
554
|
else
|
497
|
-
|
555
|
+
self.basename.camel_case_to_underscore.plural
|
498
556
|
end
|
499
557
|
end
|
500
558
|
end
|
@@ -545,6 +603,7 @@ module Lafcadio
|
|
545
603
|
@error_messages = []
|
546
604
|
@fields = {}
|
547
605
|
@fields_set = []
|
606
|
+
@original_values = OriginalValuesHash.new( @fieldHash )
|
548
607
|
check_fields = LafcadioConfig.new()['checkFields']
|
549
608
|
verify if %w( onInstantiate onAllStates ).include?( check_fields )
|
550
609
|
end
|
@@ -570,6 +629,11 @@ module Lafcadio
|
|
570
629
|
end
|
571
630
|
@delete = value
|
572
631
|
end
|
632
|
+
|
633
|
+
def delete!
|
634
|
+
self.delete = true
|
635
|
+
commit
|
636
|
+
end
|
573
637
|
|
574
638
|
def get_field( field ) #:nodoc:
|
575
639
|
unless @fields_set.include?( field )
|
@@ -603,12 +667,15 @@ module Lafcadio
|
|
603
667
|
set_field( field, args.first )
|
604
668
|
elsif ( field = get_getter_field( methId ) )
|
605
669
|
get_field( field )
|
606
|
-
elsif ( methId.to_s =~ /^get_/ and
|
607
|
-
ObjectStore.get_object_store.respond_to?( methId ) )
|
608
|
-
args = [ self ].concat( args )
|
609
|
-
ObjectStore.get_object_store.send( methId, *args )
|
610
670
|
else
|
611
|
-
|
671
|
+
new_symbol = ( 'get_' + methId.id2name ).to_sym
|
672
|
+
object_store = ObjectStore.get_object_store
|
673
|
+
if object_store.respond_to? new_symbol
|
674
|
+
args = [ self ].concat args
|
675
|
+
object_store.send( 'get_' + methId.id2name, *args )
|
676
|
+
else
|
677
|
+
super( methId, *args )
|
678
|
+
end
|
612
679
|
end
|
613
680
|
end
|
614
681
|
|
@@ -632,7 +699,7 @@ module Lafcadio
|
|
632
699
|
end
|
633
700
|
|
634
701
|
def set_field( field, value ) #:nodoc:
|
635
|
-
if field.class <=
|
702
|
+
if field.class <= DomainObjectField
|
636
703
|
if value.class != DomainObjectProxy && value
|
637
704
|
value = DomainObjectProxy.new(value)
|
638
705
|
end
|
@@ -645,6 +712,11 @@ module Lafcadio
|
|
645
712
|
@fields_set << field
|
646
713
|
end
|
647
714
|
|
715
|
+
def update!( changes )
|
716
|
+
changes.each do |sym, value| self.send( sym.to_s + '=', value ); end
|
717
|
+
commit
|
718
|
+
end
|
719
|
+
|
648
720
|
def verify
|
649
721
|
if ObjectStore.get_object_store.mock?
|
650
722
|
self.class.get_class_fields.each { |field|
|
@@ -652,6 +724,10 @@ module Lafcadio
|
|
652
724
|
}
|
653
725
|
end
|
654
726
|
end
|
727
|
+
|
728
|
+
class OriginalValuesHash < DelegateClass( Hash )
|
729
|
+
def []=( key, val ); raise NoMethodError; end
|
730
|
+
end
|
655
731
|
end
|
656
732
|
|
657
733
|
# Any domain class that is used mostly to map between two other domain
|