m4dbi 0.8.3 → 0.8.4
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.
- data/lib/m4dbi/model.rb +54 -25
- data/lib/m4dbi/version.rb +1 -1
- data/spec/model.rb +79 -3
- metadata +1 -1
data/lib/m4dbi/model.rb
CHANGED
@@ -2,7 +2,7 @@ module M4DBI
|
|
2
2
|
class Model
|
3
3
|
#attr_reader :row
|
4
4
|
ancestral_trait_reader :dbh, :table
|
5
|
-
ancestral_trait_class_reader :dbh, :table, :pk, :columns, :st, :
|
5
|
+
ancestral_trait_class_reader :dbh, :table, :pk, :columns, :st, :hooks
|
6
6
|
|
7
7
|
M4DBI_UNASSIGNED = '__m4dbi_unassigned__'
|
8
8
|
|
@@ -142,21 +142,21 @@ module M4DBI
|
|
142
142
|
end
|
143
143
|
if ! pk_hash.empty?
|
144
144
|
rec = self.one_where( pk_hash )
|
145
|
-
if
|
146
|
-
|
147
|
-
|
145
|
+
if hooks[:active]
|
146
|
+
hooks[:after_create].each do |block|
|
147
|
+
hooks[:active] = false
|
148
148
|
block.yield rec
|
149
|
-
|
149
|
+
hooks[:active] = true
|
150
150
|
end
|
151
151
|
end
|
152
152
|
else
|
153
153
|
begin
|
154
154
|
rec = last_record( dbh_ )
|
155
|
-
if
|
156
|
-
|
157
|
-
|
155
|
+
if hooks[:active]
|
156
|
+
hooks[:after_create].each do |block|
|
157
|
+
hooks[:active] = false
|
158
158
|
block.yield rec
|
159
|
-
|
159
|
+
hooks[:active] = true
|
160
160
|
end
|
161
161
|
end
|
162
162
|
rescue NoMethodError => e
|
@@ -236,15 +236,35 @@ module M4DBI
|
|
236
236
|
end
|
237
237
|
|
238
238
|
def self.after_create(&block)
|
239
|
-
|
239
|
+
hooks[:after_create] << block
|
240
|
+
end
|
241
|
+
|
242
|
+
def self.remove_after_create_hooks
|
243
|
+
hooks[:after_create].clear
|
240
244
|
end
|
241
245
|
|
242
246
|
def self.after_update(&block)
|
243
|
-
|
247
|
+
hooks[:after_update] << block
|
248
|
+
end
|
249
|
+
|
250
|
+
def self.remove_after_update_hooks
|
251
|
+
hooks[:after_update].clear
|
252
|
+
end
|
253
|
+
|
254
|
+
def self.before_delete(&block)
|
255
|
+
hooks[:before_delete] << block
|
244
256
|
end
|
245
257
|
|
246
258
|
def self.after_delete(&block)
|
247
|
-
|
259
|
+
hooks[:after_delete] << block
|
260
|
+
end
|
261
|
+
|
262
|
+
def self.remove_before_delete_hooks
|
263
|
+
hooks[:before_delete].clear
|
264
|
+
end
|
265
|
+
|
266
|
+
def self.remove_after_delete_hooks
|
267
|
+
hooks[:after_delete].clear
|
248
268
|
end
|
249
269
|
|
250
270
|
# Example:
|
@@ -395,11 +415,11 @@ module M4DBI
|
|
395
415
|
hash.each do |key,value|
|
396
416
|
@row[ key ] = value
|
397
417
|
end
|
398
|
-
if self.class.
|
399
|
-
self.class.
|
400
|
-
self.class.
|
418
|
+
if self.class.hooks[:active]
|
419
|
+
self.class.hooks[:after_update].each do |block|
|
420
|
+
self.class.hooks[:active] = false
|
401
421
|
block.yield self
|
402
|
-
self.class.
|
422
|
+
self.class.hooks[:active] = true
|
403
423
|
end
|
404
424
|
end
|
405
425
|
end
|
@@ -408,16 +428,24 @@ module M4DBI
|
|
408
428
|
|
409
429
|
# Returns true iff the record and only the record was successfully deleted.
|
410
430
|
def delete
|
431
|
+
if self.class.hooks[:active]
|
432
|
+
self.class.hooks[:before_delete].each do |block|
|
433
|
+
self.class.hooks[:active] = false
|
434
|
+
block.yield self
|
435
|
+
self.class.hooks[:active] = true
|
436
|
+
end
|
437
|
+
end
|
438
|
+
|
411
439
|
st = prepare("DELETE FROM #{table} WHERE #{pk_clause}")
|
412
440
|
num_deleted = st.execute( *pk_values ).affected_count
|
413
441
|
if num_deleted != 1
|
414
442
|
false
|
415
443
|
else
|
416
|
-
if self.class.
|
417
|
-
self.class.
|
418
|
-
self.class.
|
444
|
+
if self.class.hooks[:active]
|
445
|
+
self.class.hooks[:after_delete].each do |block|
|
446
|
+
self.class.hooks[:active] = false
|
419
447
|
block.yield self
|
420
|
-
self.class.
|
448
|
+
self.class.hooks[:active] = true
|
421
449
|
end
|
422
450
|
end
|
423
451
|
true
|
@@ -462,9 +490,10 @@ module M4DBI
|
|
462
490
|
:pk => pk_,
|
463
491
|
:columns => h.table_schema( table.to_sym ).columns,
|
464
492
|
:st => Hash.new, # prepared statements for all queries
|
465
|
-
:
|
493
|
+
:hooks => {
|
466
494
|
after_create: [],
|
467
495
|
after_update: [],
|
496
|
+
before_delete: [],
|
468
497
|
after_delete: [],
|
469
498
|
active: true,
|
470
499
|
},
|
@@ -518,11 +547,11 @@ module M4DBI
|
|
518
547
|
if num_changed > 0
|
519
548
|
@row[ colname ] = new_value
|
520
549
|
end
|
521
|
-
if self.class.
|
522
|
-
self.class.
|
523
|
-
self.class.
|
550
|
+
if self.class.hooks[:active]
|
551
|
+
self.class.hooks[:after_update].each do |block|
|
552
|
+
self.class.hooks[:active] = false
|
524
553
|
block.yield self
|
525
|
-
self.class.
|
554
|
+
self.class.hooks[:active] = true
|
526
555
|
end
|
527
556
|
end
|
528
557
|
new_value
|
data/lib/m4dbi/version.rb
CHANGED
data/spec/model.rb
CHANGED
@@ -41,7 +41,11 @@ describe 'A M4DBI::Model subclass' do
|
|
41
41
|
@m_mc = Class.new( M4DBI::Model( :many_col_table ) )
|
42
42
|
@m_nipk = Class.new( M4DBI::Model( :non_id_pk, :pk => [ :str ] ) )
|
43
43
|
@m_mcpk = Class.new( M4DBI::Model( :mcpk, :pk => [ :kc1, :kc2 ] ) )
|
44
|
-
class Author < M4DBI::Model( :authors )
|
44
|
+
class Author < M4DBI::Model( :authors )
|
45
|
+
remove_after_create_hooks
|
46
|
+
remove_after_update_hooks
|
47
|
+
remove_after_delete_hooks
|
48
|
+
end
|
45
49
|
end
|
46
50
|
|
47
51
|
it 'can be defined' do
|
@@ -85,7 +89,7 @@ describe 'A M4DBI::Model subclass' do
|
|
85
89
|
end
|
86
90
|
end
|
87
91
|
|
88
|
-
it 'provides the database handle it is using' do
|
92
|
+
# it 'provides the database handle it is using' do
|
89
93
|
# begin
|
90
94
|
# @m_author.dbh.should.equal $dbh
|
91
95
|
|
@@ -96,7 +100,7 @@ describe 'A M4DBI::Model subclass' do
|
|
96
100
|
# # Clean up handles for later specs
|
97
101
|
# connect_to_spec_database
|
98
102
|
# end
|
99
|
-
end
|
103
|
+
# end
|
100
104
|
|
101
105
|
it 'maintains distinction from models of the same name in different databases' do
|
102
106
|
begin
|
@@ -683,6 +687,20 @@ describe 'A M4DBI::Model subclass' do
|
|
683
687
|
$test.should.equal 2
|
684
688
|
a.name.should.equal 'different name'
|
685
689
|
end
|
690
|
+
|
691
|
+
it 'provides a means to remove all after_create hooks' do
|
692
|
+
class Author < M4DBI::Model( :authors )
|
693
|
+
after_create do |author|
|
694
|
+
$test = 'remove after_create'
|
695
|
+
end
|
696
|
+
end
|
697
|
+
class Author < M4DBI::Model( :authors )
|
698
|
+
remove_after_create_hooks
|
699
|
+
end
|
700
|
+
$test.should.not.equal 'remove after_create'
|
701
|
+
a = Author.create(name: 'theauthor')
|
702
|
+
$test.should.not.equal 'remove after_create'
|
703
|
+
end
|
686
704
|
end
|
687
705
|
|
688
706
|
describe 'A created M4DBI::Model subclass instance' do
|
@@ -846,6 +864,51 @@ describe 'A created M4DBI::Model subclass instance' do
|
|
846
864
|
$test.should.equal 3
|
847
865
|
a.name.should.equal 'different name'
|
848
866
|
end
|
867
|
+
|
868
|
+
it 'provides a means to remove all after_update hooks' do
|
869
|
+
class Author < M4DBI::Model( :authors )
|
870
|
+
after_update do |author|
|
871
|
+
$test = 'remove after_update'
|
872
|
+
end
|
873
|
+
end
|
874
|
+
class Author < M4DBI::Model( :authors )
|
875
|
+
remove_after_update_hooks
|
876
|
+
end
|
877
|
+
$test.should.not.equal 'remove after_update'
|
878
|
+
a = Author.create(name: 'theauthor')
|
879
|
+
a.name = 'another author'
|
880
|
+
$test.should.not.equal 'remove after_update'
|
881
|
+
end
|
882
|
+
|
883
|
+
it 'provides a means to remove all before_delete hooks' do
|
884
|
+
class Author < M4DBI::Model( :authors )
|
885
|
+
before_delete do |author|
|
886
|
+
$test = 'remove before_update'
|
887
|
+
end
|
888
|
+
end
|
889
|
+
class Author < M4DBI::Model( :authors )
|
890
|
+
remove_before_delete_hooks
|
891
|
+
end
|
892
|
+
$test.should.not.equal 'remove before_delete'
|
893
|
+
a = Author.create(name: 'theauthor')
|
894
|
+
a.delete
|
895
|
+
$test.should.not.equal 'remove before_delete'
|
896
|
+
end
|
897
|
+
|
898
|
+
it 'provides a means to remove all after_delete hooks' do
|
899
|
+
class Author < M4DBI::Model( :authors )
|
900
|
+
after_delete do |author|
|
901
|
+
$test = 'remove after_update'
|
902
|
+
end
|
903
|
+
end
|
904
|
+
class Author < M4DBI::Model( :authors )
|
905
|
+
remove_after_delete_hooks
|
906
|
+
end
|
907
|
+
$test.should.not.equal 'remove after_delete'
|
908
|
+
a = Author.create(name: 'theauthor')
|
909
|
+
a.delete
|
910
|
+
$test.should.not.equal 'remove after_delete'
|
911
|
+
end
|
849
912
|
end
|
850
913
|
|
851
914
|
describe 'A found M4DBI::Model subclass instance' do
|
@@ -973,6 +1036,19 @@ describe 'A found M4DBI::Model subclass instance' do
|
|
973
1036
|
reset_data
|
974
1037
|
end
|
975
1038
|
|
1039
|
+
it 'before deletion, executes code provided in an before_delete hook' do
|
1040
|
+
class Author < M4DBI::Model( :authors )
|
1041
|
+
before_delete do |author|
|
1042
|
+
$test = author.name
|
1043
|
+
end
|
1044
|
+
end
|
1045
|
+
$test.should.not.equal 'theauthor'
|
1046
|
+
a = Author.create(name: 'theauthor')
|
1047
|
+
$test.should.not.equal 'theauthor'
|
1048
|
+
a.delete
|
1049
|
+
$test.should.equal 'theauthor'
|
1050
|
+
end
|
1051
|
+
|
976
1052
|
it 'after deletion, executes code provided in an after_delete hook' do
|
977
1053
|
class Author < M4DBI::Model( :authors )
|
978
1054
|
after_delete do |author|
|