OSDN Git Service

Model::Comments: fix 'select' method to make expandable
authorhylom <hylom@users.sourceforge.jp>
Wed, 21 Dec 2016 10:22:51 +0000 (19:22 +0900)
committerhylom <hylom@users.sourceforge.jp>
Wed, 21 Dec 2016 10:22:51 +0000 (19:22 +0900)
src/newslash_web/lib/Newslash/Model/Comments.pm

index 48b1a7e..e50291a 100644 (file)
@@ -47,38 +47,60 @@ ARRAY of comment contents
 =cut
 
 sub select {
-    my ($self, $query_type, $value) = @_;
-    my $target = $query_type;
-
-    if ($target !~ m/\A(discussion_id|cid|pid)\z/) {
-        return undef;
+    my $self = shift;
+    my $params = { @_ };
+
+    my @clauses;
+    my @values;
+    my $unique = 0;
+    for my $k (qw|cid|) {
+        if (defined $params->{$k}) {
+            push @clauses, "$k = ?";
+            push @values, $params->{$k};
+            $unique = 1;
+        }
     }
-    if ($target eq 'discussion_id') {
-        $target = 'sid';
+    for my $k (qw|discussion_id pid|) {
+        if (defined $params->{$k}) {
+            if ($k eq 'discussion_id') { # discussion_id is sid
+                push @clauses, "comments.sid = ?";
+            }
+            else {
+                push @clauses, "comments.$k = ?";
+            }
+            push @values, $params->{$k};
+        }
     }
 
+    return if (@clauses == 0);
+    my $where_clause = join(' ', @clauses);
+
     my $dbh = $self->connect_db;
     my $sql = <<"EOSQL";
 SELECT comments.*, comment_text.*, users.nickname AS author, users.sig AS signature
   FROM comments
     LEFT JOIN comment_text ON comments.cid = comment_text.cid
     LEFT JOIN users ON comments.uid = users.uid
-  WHERE comments.$target = ?
+  WHERE $where_clause
   ORDER BY comments.cid ASC;
 EOSQL
 
     my $sth = $dbh->prepare($sql);
 
-    $sth->execute($value);
+    $sth->execute(@values);
     my $comments = $sth->fetchall_arrayref(+{});
-    $sth->finish;
+    if (!defined $comments) {
+        $self->set_error($dbh->errstr, $dbh->err);
+        $dbh->disconnect;
+        return;
+    }
+    $dbh->disconnect;
 
     if (!$comments) {
-        $dbh->disconnect();
-        return undef;
+        return;
     }
 
-    if ($query_type eq 'cid') {
+    if ($unique) {
         return $comments->[0];
     }
 
@@ -198,7 +220,7 @@ sub create {
     my $signature = $self->generate_signature($params->{comment});
 
     my $users = $self->new_instance_of("Newslash::Model::Users");
-    use Newslash::Model::Moderations;
+    #use Newslash::Model::Moderations;
     my $moderations = $self->new_instance_of("Newslash::Model::Moderations");
     my $user_param = $users->select(uid => $user->{uid}, target => 'param');