OSDN Git Service

Model::Cowrapper: add generic_insert()
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Model / Cowrapper.pm
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];
     }