}
sub _select_acl2 {
- my ($self, $key, $uid) = @_;
- return if ($key ne 'uid');
+ my ($self, $key, $value) = @_;
+ my $sql;
- my $sql = <<"EOSQL";
+ if ($key eq 'uid') {
+ $sql = <<"EOSQL";
SELECT * FROM al2
WHERE srcid = ?
EOSQL
+ }
+ elsif ($key eq 'srcid') {
+ $sql = <<"EOSQL";
+SELECT * FROM al2
+ WHERE srcid = CAST(CONV(?, 16, 10) AS UNSIGNED)
+EOSQL
+ }
+ else {
+ return;
+ }
+
my $dbh = $self->connect_db;
my $sth = $dbh->prepare($sql);
- $sth->execute($uid);
+ $sth->execute($value);
my $rs = $sth->fetchall_arrayref(+{});
$self->disconnect_db();
return if !$rs;
- return {srcid => $uid, value => 0, values => [], updatecount => 0} if @$rs == 0;
+ return {srcid => $value, value => 0, values => [], updatecount => 0} if @$rs == 0;
my @values;
}
sub _select_acl2_log {
- my ($self, $key, $uid) = @_;
- return if ($key ne 'uid');
+ my ($self, $key, $value) = @_;
+ my $sql;
- my $sql = <<"EOSQL";
+ if ($key eq 'uid') {
+ $sql = <<"EOSQL";
SELECT al2_log.*, al2_log_comments.comment, al2_types.title, users.nickname FROM al2_log
JOIN al2_types USING(al2tid)
JOIN al2_log_comments USING(al2lid)
JOIN users ON users.uid = al2_log.adminuid
WHERE al2_log.srcid = ?
EOSQL
+ } elsif ($key eq 'srcid') {
+ $sql = <<"EOSQL";
+SELECT al2_log.*, al2_log_comments.comment, al2_types.title, users.nickname FROM al2_log
+ JOIN al2_types USING(al2tid)
+ JOIN al2_log_comments USING(al2lid)
+ JOIN users ON users.uid = al2_log.adminuid
+ WHERE al2_log.srcid = CAST(CONV(?, 16, 10) AS UNSIGNED)
+EOSQL
+
+ }
my $dbh = $self->connect_db;
my $sth = $dbh->prepare($sql);
- $sth->execute($uid);
+ $sth->execute($value);
my $rs = $sth->fetchall_arrayref(+{});
$self->disconnect_db();
return $rs;
}
-sub update_acl2 {
- my ($self, $uid, $admin_uid, $types, $comment) = @_;
+sub _update_acl2 {
+ my ($self, $type, $srcid, $admin_uid, $types, $comment) = @_;
my $acl2_types = $self->acl2_types;
my $acl2_tids = [];
my $value = 0;
- my $current_acl2 = $self->select(target => "acl2", uid => $uid);
+ my $sql_srcid;
+ if ($type eq 'srcid') {
+ $sql_srcid = "CAST(CONV(?, 16, 10) AS UNSIGNED)";
+ }
+ elsif ($type eq 'uid') {
+ $sql_srcid = "?";
+ }
+ else {
+ return;
+ }
+
+ my $current_acl2 = $self->_select_acl2($type => $srcid);
my $need_clear = {};
if ($current_acl2) {
for my $val (@{$current_acl2->{values}}) {
my $dbh = $self->start_transaction;
my $sql = <<"EOSQL";
INSERT INTO al2_log
- (srcid, ts, adminuid, al2tid, val)
+ (srcid, ts, adminuid, al2tid, val)
VALUES
- (?, NOW(), ?, ?, "set")
+ ($sql_srcid, NOW(), ?, ?, "set")
EOSQL
my $sth = $dbh->prepare($sql);
for my $type (@$types) {
my $type = $acl2_types->{$type};
next if !$type;
- $rs = $sth->execute($uid, $admin_uid, $type->{al2tid});
+ $rs = $sth->execute($srcid, $admin_uid, $type->{al2tid});
if (!defined $rs) {
$self->set_error($dbh->errstr, $dbh->err);
$self->rollback;
# clear al2_log
$sql = <<"EOSQL";
INSERT INTO al2_log
- (srcid, ts, adminuid, al2tid, val)
+ (srcid, ts, adminuid, al2tid, val)
VALUES
- (?, NOW(), ?, ?, "clear")
+ ($sql_srcid, NOW(), ?, ?, "clear")
EOSQL
$sth = $dbh->prepare($sql);
for my $tid (keys %$need_clear) {
- $rs = $sth->execute($uid, $admin_uid, $tid);
+ $rs = $sth->execute($srcid, $admin_uid, $tid);
if (!defined $rs) {
$self->set_error($dbh->errstr, $dbh->err);
$self->rollback;
# update al2
$sql = <<"EOSQL";
INSERT INTO al2
- (srcid, value, updatecount)
+ (srcid, value, updatecount)
VALUES
- (?, ?, 0)
+ ($sql_srcid, ?, 0)
ON DUPLICATE KEY UPDATE
value = ?,
updatecount = updatecount + 1
EOSQL
$sth = $dbh->prepare($sql);
- $rs = $sth->execute($uid, $value, $value);
+ $rs = $sth->execute($srcid, $value, $value);
if (!defined $rs) {
$self->set_error($dbh->errstr, $dbh->err);
$self->rollback;
return 1;
}
+
+sub update_acl2_by_srcid {
+ return shift->_update_acl2("srcid", @_);
+}
+
+sub update_acl2 {
+ return shift->_update_acl2("uid", @_);
+}
+
sub update_message_config {
my $self = shift;
return if $self->check_readonly;
use Test::Mojo;
use Data::Dumper;
-use Newslash::Util::Test qw(delete_user create_admin_user);
+use Newslash::Util::Test qw(delete_user create_admin_user srcid);
my $t = Test::Mojo->new('Newslash::Web');
my $users = $t->app->model('users');
my $log = pop @$rs;
is($log->{comment}, "testing 3", "valid comment of acl2_log");
+ my $user = $users->select(uid => $uid);
+ my $srcid24 = srcid("192.168.1.1", 24);
+ $rs = $users->update_acl2_by_srcid($srcid24, $admin->{uid}, [qw(spammer)], "testing 4");
+ ok($rs, "update_acl2_by_srcid");
+
+ $rs = $users->_select_acl2(srcid => $srcid24);
+ ok($rs, "select by srcid => acl2");
+ is($rs->{value}, (1 << 9), "valid value of acl2 set by srcid");
+
+ $rs = $users->update_acl2_by_srcid($srcid24, $admin->{uid}, [], "testing 5");
+ ok($rs, "update_acl2_by_srcid (2)");
};
subtest 'update users' => sub {