From 3286507f9dc1e528059672beee51a9acdb3a0594 Mon Sep 17 00:00:00 2001 From: hylom Date: Wed, 26 Sep 2018 20:20:24 +0900 Subject: [PATCH] Model::Cowrapper: add generic_insert() --- src/newslash_web/lib/Newslash/Model/Cowrapper.pm | 73 ++++++++++++++++++++++++ src/newslash_web/t/models/cowrapper.t | 6 +- 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/src/newslash_web/lib/Newslash/Model/Cowrapper.pm b/src/newslash_web/lib/Newslash/Model/Cowrapper.pm index fa1a5ec3..e3a29c37 100644 --- a/src/newslash_web/lib/Newslash/Model/Cowrapper.pm +++ b/src/newslash_web/lib/Newslash/Model/Cowrapper.pm @@ -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]; } diff --git a/src/newslash_web/t/models/cowrapper.t b/src/newslash_web/t/models/cowrapper.t index 4c7e3072..c27e8a3a 100644 --- a/src/newslash_web/t/models/cowrapper.t +++ b/src/newslash_web/t/models/cowrapper.t @@ -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}"); } -- 2.11.0