Showing 2 changed files with 44 additions and 5 deletions
+15 -5
lib/DBIx/Custom/Model.pm
... ...
@@ -36,7 +36,7 @@ sub AUTOLOAD {
36 36
 }
37 37
 
38 38
 my @methods = qw/insert insert_at update update_at update_all
39
-  delete delete_at delete_all select select_at count update_or_insert/;
39
+  delete delete_at delete_all select select_at count/;
40 40
 for my $method (@methods) {
41 41
     
42 42
     my $code =
... ...
@@ -49,12 +49,8 @@ for my $method (@methods) {
49 49
     my @attrs = qw/table type primary_key bind_type/;
50 50
     my @insert_attrs = qw/created_at updated_at/;
51 51
     my @update_attrs = qw/updated_at/;
52
-    my @update_or_insert_attrs = qw/created_at updated_at/;
53 52
     my @select_attrs = qw/join/;
54 53
     if ($method eq 'insert') { push @attrs, @insert_attrs }
55
-    elsif ($method eq 'update_or_insert') {
56
-        push @attrs, @update_or_insert_attrs;
57
-    }
58 54
     elsif ($method eq 'update') { push @attrs, @update_attrs }
59 55
     elsif (index($method, 'select') != -1) { push @attrs, @select_attrs }
60 56
     
... ...
@@ -70,6 +66,20 @@ for my $method (@methods) {
70 66
     croak $code if $@;
71 67
 }
72 68
 
69
+sub update_or_insert {
70
+    my ($self, $param, %opt) = @_;
71
+    
72
+    croak "update_or_insert method need primary_key and id option "
73
+      unless (defined $opt{id} || defined $self->{id})
74
+          && (defined $opt{primary_key} || defined $self->{primary_key});
75
+    
76
+    my $statement_opt = $opt{option} || {};
77
+    my $row = $self->select(%opt, %{$statement_opt->{select} || {}})->one;
78
+    return $row ? $self->update($param, %opt, %{$statement_opt->{update} || {}})
79
+                : $self->insert($param, %opt, %{$statement_opt->{insert} || {}});
80
+}
81
+
82
+
73 83
 sub execute {
74 84
     my $self = shift;
75 85
     return $self->dbi->execute(
+29
t/mysql.t
... ...
@@ -32,6 +32,7 @@ my $dbname;
32 32
 my $row;
33 33
 my $rows;
34 34
 my $result;
35
+my $model;
35 36
 
36 37
 test 'connect';
37 38
 eval {
... ...
@@ -78,6 +79,34 @@ $dbi->update_or_insert(
78 79
 $row = $dbi->select(id => 1, table => 'table1', primary_key => 'key1')->one;
79 80
 is_deeply($row, {key1 => 1, key2 => 3}, "basic");
80 81
 
82
+$dbi->delete_all(table => 'table1');
83
+$model = $dbi->create_model(
84
+    table => 'table1',
85
+    primary_key => 'key1',
86
+);
87
+$model->update_or_insert(
88
+    {key2 => 2},
89
+    id => 1,
90
+    option => {
91
+        select => {append => 'for update'},
92
+        insert => {append => '    #'},
93
+        update => {append => '     #'}
94
+    }
95
+);
96
+$row = $dbi->select(id => 1, table => 'table1', primary_key => 'key1')->one;
97
+is_deeply($row, {key1 => 1, key2 => 2}, "basic");
98
+$model->update_or_insert(
99
+    {key2 => 3},
100
+    id => 1,
101
+    option => {
102
+        select => {append => 'for update'},
103
+        insert => {append => '    #'},
104
+        update => {append => '     #'}
105
+    }
106
+);
107
+$row = $dbi->select(id => 1, table => 'table1', primary_key => 'key1')->one;
108
+is_deeply($row, {key1 => 1, key2 => 3}, "basic");
109
+
81 110
 # Test memory leaks
82 111
 for (1 .. 200) {
83 112
     $dbi = DBIx::Custom->connect(