m4dbi 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/m4dbi/model.rb +52 -7
- data/lib/m4dbi/version.rb +1 -1
- data/spec/model.rb +36 -0
- metadata +50 -61
data/lib/m4dbi/model.rb
CHANGED
@@ -142,14 +142,22 @@ module M4DBI
|
|
142
142
|
end
|
143
143
|
if ! pk_hash.empty?
|
144
144
|
rec = self.one_where( pk_hash )
|
145
|
-
callbacks[:
|
146
|
-
|
145
|
+
if callbacks[:active]
|
146
|
+
callbacks[:after_create].each do |block|
|
147
|
+
callbacks[:active] = false
|
148
|
+
block.yield rec
|
149
|
+
callbacks[:active] = true
|
150
|
+
end
|
147
151
|
end
|
148
152
|
else
|
149
153
|
begin
|
150
154
|
rec = last_record( dbh_ )
|
151
|
-
callbacks[:
|
152
|
-
|
155
|
+
if callbacks[:active]
|
156
|
+
callbacks[:after_create].each do |block|
|
157
|
+
callbacks[:active] = false
|
158
|
+
block.yield rec
|
159
|
+
callbacks[:active] = true
|
160
|
+
end
|
153
161
|
end
|
154
162
|
rescue NoMethodError => e
|
155
163
|
# ignore
|
@@ -231,6 +239,14 @@ module M4DBI
|
|
231
239
|
callbacks[:after_create] << block
|
232
240
|
end
|
233
241
|
|
242
|
+
def self.after_update(&block)
|
243
|
+
callbacks[:after_update] << block
|
244
|
+
end
|
245
|
+
|
246
|
+
def self.after_delete(&block)
|
247
|
+
callbacks[:after_delete] << block
|
248
|
+
end
|
249
|
+
|
234
250
|
# Example:
|
235
251
|
# M4DBI::Model.one_to_many( Author, Post, :posts, :author, :author_id )
|
236
252
|
# her_posts = some_author.posts
|
@@ -379,6 +395,13 @@ module M4DBI
|
|
379
395
|
hash.each do |key,value|
|
380
396
|
@row[ key ] = value
|
381
397
|
end
|
398
|
+
if self.class.callbacks[:active]
|
399
|
+
self.class.callbacks[:after_update].each do |block|
|
400
|
+
self.class.callbacks[:active] = false
|
401
|
+
block.yield self
|
402
|
+
self.class.callbacks[:active] = true
|
403
|
+
end
|
404
|
+
end
|
382
405
|
end
|
383
406
|
num_updated
|
384
407
|
end
|
@@ -387,7 +410,18 @@ module M4DBI
|
|
387
410
|
def delete
|
388
411
|
st = prepare("DELETE FROM #{table} WHERE #{pk_clause}")
|
389
412
|
num_deleted = st.execute( *pk_values ).affected_count
|
390
|
-
num_deleted
|
413
|
+
if num_deleted != 1
|
414
|
+
false
|
415
|
+
else
|
416
|
+
if self.class.callbacks[:active]
|
417
|
+
self.class.callbacks[:after_delete].each do |block|
|
418
|
+
self.class.callbacks[:active] = false
|
419
|
+
block.yield self
|
420
|
+
self.class.callbacks[:active] = true
|
421
|
+
end
|
422
|
+
end
|
423
|
+
true
|
424
|
+
end
|
391
425
|
end
|
392
426
|
|
393
427
|
# save does nothing. It exists to provide compatibility with other ORMs.
|
@@ -429,8 +463,11 @@ module M4DBI
|
|
429
463
|
:columns => h.table_schema( table.to_sym ).columns,
|
430
464
|
:st => Hash.new, # prepared statements for all queries
|
431
465
|
:callbacks => {
|
432
|
-
after_create: []
|
433
|
-
|
466
|
+
after_create: [],
|
467
|
+
after_update: [],
|
468
|
+
after_delete: [],
|
469
|
+
active: true,
|
470
|
+
},
|
434
471
|
} )
|
435
472
|
|
436
473
|
meta_def( 'pk_str'.to_sym ) do
|
@@ -481,6 +518,14 @@ module M4DBI
|
|
481
518
|
if num_changed > 0
|
482
519
|
@row[ colname ] = new_value
|
483
520
|
end
|
521
|
+
if self.class.callbacks[:active]
|
522
|
+
self.class.callbacks[:after_update].each do |block|
|
523
|
+
self.class.callbacks[:active] = false
|
524
|
+
block.yield self
|
525
|
+
self.class.callbacks[:active] = true
|
526
|
+
end
|
527
|
+
end
|
528
|
+
new_value
|
484
529
|
end
|
485
530
|
|
486
531
|
class_def( '[]='.to_sym ) do |colname, new_value|
|
data/lib/m4dbi/version.rb
CHANGED
data/spec/model.rb
CHANGED
@@ -823,6 +823,29 @@ describe 'A created M4DBI::Model subclass instance' do
|
|
823
823
|
a_ = @m_author[ 1 ]
|
824
824
|
h[ a_ ].should.equal 123
|
825
825
|
end
|
826
|
+
|
827
|
+
it 'after setting data, executes code provided in an after_update hook' do
|
828
|
+
class Author < M4DBI::Model( :authors )
|
829
|
+
after_update do |author|
|
830
|
+
$test = 3
|
831
|
+
author.name = 'different name'
|
832
|
+
end
|
833
|
+
end
|
834
|
+
|
835
|
+
$test.should.not.equal 3
|
836
|
+
a = Author.create(name: 'theauthor')
|
837
|
+
$test.should.not.equal 3
|
838
|
+
a.set name: 'foobar'
|
839
|
+
$test.should.equal 3
|
840
|
+
a.name.should.equal 'different name'
|
841
|
+
|
842
|
+
$test = nil
|
843
|
+
a = Author.create(name: 'theauthor')
|
844
|
+
$test.should.not.equal 3
|
845
|
+
a.name = 'foobar'
|
846
|
+
$test.should.equal 3
|
847
|
+
a.name.should.equal 'different name'
|
848
|
+
end
|
826
849
|
end
|
827
850
|
|
828
851
|
describe 'A found M4DBI::Model subclass instance' do
|
@@ -950,6 +973,19 @@ describe 'A found M4DBI::Model subclass instance' do
|
|
950
973
|
reset_data
|
951
974
|
end
|
952
975
|
|
976
|
+
it 'after deletion, executes code provided in an after_delete hook' do
|
977
|
+
class Author < M4DBI::Model( :authors )
|
978
|
+
after_delete do |author|
|
979
|
+
$test = 4
|
980
|
+
end
|
981
|
+
end
|
982
|
+
$test.should.not.equal 4
|
983
|
+
a = Author.create(name: 'theauthor')
|
984
|
+
$test.should.not.equal 4
|
985
|
+
a.delete
|
986
|
+
$test.should.equal 4
|
987
|
+
end
|
988
|
+
|
953
989
|
it 'does nothing on #save' do
|
954
990
|
p = @m_post[ 1 ]
|
955
991
|
should.not.raise do
|
metadata
CHANGED
@@ -1,61 +1,58 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: m4dbi
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.8.3
|
5
5
|
prerelease:
|
6
|
-
segments:
|
7
|
-
- 0
|
8
|
-
- 8
|
9
|
-
- 2
|
10
|
-
version: 0.8.2
|
11
6
|
platform: ruby
|
12
|
-
authors:
|
7
|
+
authors:
|
13
8
|
- Pistos
|
14
9
|
autorequire:
|
15
10
|
bindir: bin
|
16
11
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-07-01 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
21
15
|
name: metaid
|
22
|
-
|
23
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
24
17
|
none: false
|
25
|
-
requirements:
|
26
|
-
- -
|
27
|
-
- !ruby/object:Gem::Version
|
28
|
-
|
29
|
-
segments:
|
30
|
-
- 0
|
31
|
-
version: "0"
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
32
22
|
type: :runtime
|
33
|
-
version_requirements: *id001
|
34
|
-
- !ruby/object:Gem::Dependency
|
35
|
-
name: rdbi
|
36
23
|
prerelease: false
|
37
|
-
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rdbi
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
38
33
|
none: false
|
39
|
-
requirements:
|
40
|
-
- -
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
|
43
|
-
segments:
|
44
|
-
- 0
|
45
|
-
version: "0"
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
46
38
|
type: :runtime
|
47
|
-
|
48
|
-
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
description: M4DBI provides models, associations and some convenient extensions to
|
47
|
+
RDBI.
|
49
48
|
email: m4dbi dot pistos at purepistos dot net
|
50
49
|
executables: []
|
51
|
-
|
52
50
|
extensions: []
|
53
|
-
|
54
|
-
extra_rdoc_files:
|
51
|
+
extra_rdoc_files:
|
55
52
|
- README.rdoc
|
56
53
|
- CHANGELOG
|
57
54
|
- LICENCE
|
58
|
-
files:
|
55
|
+
files:
|
59
56
|
- README.rdoc
|
60
57
|
- CHANGELOG
|
61
58
|
- LICENCE
|
@@ -76,38 +73,30 @@ files:
|
|
76
73
|
- spec/hash.rb
|
77
74
|
homepage: https://github.com/Pistos/m4dbi
|
78
75
|
licenses: []
|
79
|
-
|
80
76
|
post_install_message:
|
81
77
|
rdoc_options: []
|
82
|
-
|
83
|
-
require_paths:
|
78
|
+
require_paths:
|
84
79
|
- lib
|
85
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
80
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
86
81
|
none: false
|
87
|
-
requirements:
|
88
|
-
- -
|
89
|
-
- !ruby/object:Gem::Version
|
90
|
-
|
91
|
-
|
92
|
-
- 0
|
93
|
-
version: "0"
|
94
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
87
|
none: false
|
96
|
-
requirements:
|
97
|
-
- -
|
98
|
-
- !ruby/object:Gem::Version
|
99
|
-
|
100
|
-
|
101
|
-
- 0
|
102
|
-
version: "0"
|
103
|
-
requirements:
|
88
|
+
requirements:
|
89
|
+
- - ! '>='
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
92
|
+
requirements:
|
104
93
|
- bacon (optional)
|
105
94
|
rubyforge_project:
|
106
|
-
rubygems_version: 1.8.
|
95
|
+
rubygems_version: 1.8.18
|
107
96
|
signing_key:
|
108
97
|
specification_version: 3
|
109
98
|
summary: Models (and More) for RDBI
|
110
|
-
test_files:
|
99
|
+
test_files:
|
111
100
|
- spec/database.rb
|
112
101
|
- spec/model.rb
|
113
102
|
- spec/helper.rb
|