OSDN Git Service

Model::Cowrapper: add generic_insert()
authorhylom <hylom@users.sourceforge.jp>
Wed, 26 Sep 2018 11:20:24 +0000 (20:20 +0900)
committerhylom <hylom@users.sourceforge.jp>
Wed, 26 Sep 2018 11:20:24 +0000 (20:20 +0900)
src/newslash_web/lib/Newslash/Model/Cowrapper.pm
src/newslash_web/t/models/cowrapper.t

index fa1a5ec..e3a29c3 100644 (file)
@@ -741,6 +741,78 @@ sub build_order_by_clause {
       : { clause => $clause, values => \@values };
 }
 
+########## Insert method
+
+sub generic_insert {
+    my $self = shift;
+    return if $self->check_readonly;
+    my $args = {@_};
+
+    my $table = $args->{table} || $self->primary_table;
+    if (!$table) {
+        $self->set_error("table not given", -1);
+        return;
+    }
+
+    my $keys;
+    if ($args->{keys}) {
+        $keys = $self->_build_keys($args->{keys});
+    }
+    else {
+        $keys = $self->get_keys("all");
+    }
+
+    my $params = $args->{params};
+    if (!$params) {
+        $self->set_error("params not given", -1);
+        return;
+    };
+
+    my @cols;
+    my @values;
+    my @placeholders;
+
+    # extract key and values
+    for my $k (keys %$keys) {
+        next if !defined $params->{$k};
+        if (!ref($args->{$k})) {
+            push @cols, $keys->{$k};
+            push @values, $params->{$k};
+            push @placeholders, "?";
+        }
+        elsif(ref($args->{$k}) eq "HASH") {
+            for my $subkey (keys %{$params->{$k}}) {
+                if (lc($subkey) eq "function") {
+                    push @cols, $keys->{$k};
+                    push @placeholders, $params->{$k}->{$subkey};
+                }
+            }
+        }
+    }
+
+    if (!@cols || !@values) {
+        $self->set_error("no valid values", -1);
+        return;
+    }
+
+    my $cols_clause = join(", ", @cols);
+    my $values_clause = join(", ", @placeholders);
+
+
+    my $sql = "INSERT INTO $table ($cols_clause) VALUES ($values_clause)";
+    $self->_last_query($sql, \@values);
+
+    #warn $sql;
+    #warn Dumper @values;
+
+    my $dbh = $self->connect_db;
+    my $rs = $dbh->do($sql, undef, @values);
+    $self->disconnect_db;
+    return $rs;
+
+}
+
+
 ########## Select method
 
 =head2 generic_select(table => $table, uniques => $uniques, keys => $keys, params => $params)
@@ -1429,6 +1501,7 @@ sub key_definition { return {}; }
 sub _build_keys {
     my ($self, $target) = @_;
     return {} if !$target;
+    return $target if ref($target) eq "HASH";
     if (!ref($target)) {
         $target = [$target];
     }
index 4c7e307..c27e8a3 100644 (file)
@@ -75,7 +75,11 @@ EOSQL
 INSERT INTO cow_test (foo, bar, hoge) VALUES (?, ?, ?)
 EOSQL
     for my $d (@$test_data) {
-        my $rs = $dbh->do($insert_sql, undef, $d->{foo}, $d->{bar}, $d->{hoge});
+        #my $rs = $dbh->do($insert_sql, undef, $d->{foo}, $d->{bar}, $d->{hoge});
+        my $rs = $c->generic_insert(table => "cow_test",
+                           keys => [qw(foo bar hoge)],
+                           params => $d,
+                          );
         ok($rs, "insert $d->{foo}");
     }