diff options
Diffstat (limited to 'lib/VNDB/DB/Misc.pm')
-rw-r--r-- | lib/VNDB/DB/Misc.pm | 69 |
1 files changed, 16 insertions, 53 deletions
diff --git a/lib/VNDB/DB/Misc.pm b/lib/VNDB/DB/Misc.pm index e819a1a3..02df0a2b 100644 --- a/lib/VNDB/DB/Misc.pm +++ b/lib/VNDB/DB/Misc.pm @@ -6,7 +6,7 @@ use warnings; use Exporter 'import'; our @EXPORT = qw| - dbStats dbRevisionInsert dbItemInsert dbRevisionGet dbItemMod dbRandomQuote + dbStats dbItemEdit dbRevisionGet dbItemMod dbRandomQuote |; @@ -20,60 +20,23 @@ sub dbStats { } -# Inserts a new revision and updates the item to point to this revision -# This function leaves the DB in an inconsistent state, the actual revision -# will have to be inserted directly after calling this function, otherwise -# the commit will fail. -# Arguments: type [vrp], item ID, edit summary -# Returns: local revision, global revision -sub dbRevisionInsert { - my($self, $type, $iid, $editsum, $uid) = @_; - - my $table = {qw|v vn r releases p producers|}->{$type}; - - my $c = $self->dbRow(q| - INSERT INTO changes (type, requester, ip, comments, rev) - VALUES (?, ?, ?, ?, ( - SELECT c.rev+1 - FROM changes c - JOIN !s_rev ir ON ir.id = c.id - WHERE ir.!sid = ? - ORDER BY c.id DESC - LIMIT 1 - )) - RETURNING id, rev|, - $type, $uid||$self->authInfo->{id}, $self->reqIP, $editsum, - $table, $type, $iid - ); - - $self->dbExec(q|UPDATE !s SET latest = ? WHERE id = ?|, $table, $c->{id}, $iid); +# Inserts a new revision into the database +# Arguments: type [vrp], revision id, %options->{ editsum uid + db[item]RevisionInsert } +# revision id = changes.id of the revision this edit is based on, undef to create a new DB item +# Returns: { iid, cid, rev } +sub dbItemEdit { + my($self, $type, $oid, %o) = @_; - return ($c->{rev}, $c->{id}); -} + my $fun = {qw|v vn r release p producer|}->{$type}; + $self->dbExec('SELECT edit_!s_init(?)', $fun, $oid); + $self->dbExec('UPDATE edit_revision SET requester = ?, ip = ?, comments = ?', + $o{uid}||$self->authInfo->{id}, $self->reqIP, $o{editsum}); + $self->dbVNRevisionInsert( \%o) if $type eq 'v'; + $self->dbProducerRevisionInsert(\%o) if $type eq 'p'; + $self->dbReleaseRevisionInsert( \%o) if $type eq 'r'; -# Comparable to RevisionInsert, but creates a new item with a corresponding -# change. Same things about inconsistent state, etc. -# Argumments: type [vrp], edit summary, [uid] -# Returns: item id, global revision -sub dbItemInsert { - my($self, $type, $editsum, $uid) = @_; - - my $cid = $self->dbRow(q| - INSERT INTO changes (type, requester, ip, comments) - VALUES (?, ?, ?, ?) - RETURNING id|, - $type, $uid||$self->authInfo->{id}, $self->reqIP, $editsum - )->{id}; - - my $iid = $self->dbRow(q| - INSERT INTO !s (latest) - VALUES (?) - RETURNING id|, - {qw|v vn r releases p producers|}->{$type}, $cid - )->{id}; - - return ($iid, $cid); + return $self->dbRow('SELECT * FROM edit_!s_commit()', $fun); } @@ -127,7 +90,7 @@ sub dbRevisionGet { ); my @select = ( - qw|c.id c.type c.requester c.comments c.rev c.causedby|, + qw|c.id c.type c.requester c.comments c.rev|, q|extract('epoch' from c.added) as added|, $o{what} =~ /user/ ? 'u.username' : (), $o{what} =~ /item/ ? ( |