OSDN Git Service

* Model::Users: select() now fallback to _select_user()
authorhylom <hylom@users.sourceforge.jp>
Mon, 9 Oct 2017 14:27:26 +0000 (23:27 +0900)
committerhylom <hylom@users.sourceforge.jp>
Mon, 9 Oct 2017 14:27:26 +0000 (23:27 +0900)
src/newslash_web/lib/Newslash/Model/Users.pm

index 2f079c5..649d31f 100644 (file)
@@ -179,6 +179,9 @@ sub select {
         elsif (exists $params{author}) {
             $user = $self->_select("users", author => $params{author});
         }
+        else {
+            return $self->_select_user(\%params);
+        }
         if ($user) {
             return $self->_create_user_object($user);
         }
@@ -458,6 +461,65 @@ sub _select {
     return $rs;
 }
 
+sub _select_user {
+    my ($self, $params) = @_;
+
+    my $unique_keys = { id => "users.uid",
+                        uid => "users.uid",
+                        nickname => "users.nickname",
+                        matchname => "users.matchname",
+                      };
+    my $keys = { realemail => "users.realemail",
+                 fakeemail => "users.fakeemail",
+                 seclev => "users.seclev",
+                 security_level => "users.seclev",
+                 author => "users.author",
+               };
+    my $datetime_keys = { journal_last_entry_date => "users.journal_last_entry_date",
+                          newpasswd_ts => "users.newpasswd_ts",
+                        };
+
+    my ($where_clause, $where_values, $unique) = $self->build_where_clause(unique_keys => $unique_keys,
+                                                                           keys => $keys,
+                                                                           datetime_keys => $datetime_keys,
+                                                                           params => $params);
+    my ($limit_clause, $limit_values) = $self->build_limit_clause(params => $params);
+    my ($orderby_clause, $orderby_values) = $self->build_order_by_clause(unique_keys => $unique_keys,
+                                                                         keys => $keys,
+                                                                         params => $params);
+
+    # TODO: give reasonable LIMIT Value...
+    $limit_clause = "LIMIT 50" if !$limit_clause;
+
+    my @attrs;
+    push @attrs, @$where_values, @$limit_values, @$orderby_values;
+
+    my $dbh = $self->connect_db;
+    my $sql = <<"EOSQL";
+SELECT * from users
+    $where_clause
+    $orderby_clause
+    $limit_clause
+EOSQL
+
+    my $sth = $dbh->prepare($sql);
+    $sth->execute(@attrs);
+    my $users = $sth->fetchall_arrayref({});
+
+    if (!$users) {
+        $self->disconnect_db;
+        return;
+    }
+    if (@$users == 0) {
+        $self->disconnect_db;
+        return $unique ? undef : [];
+    }
+
+    return $users->[0] if $unique;
+    return $users;
+
+}
+
 sub _acl2 { return shift->new_instance_of("::Users::ACL2"); }
 sub acl2_types { return shift->_acl2->acl2_types; }