diff options
author | Yorhel <git@yorhel.nl> | 2019-09-25 18:37:29 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2019-09-25 18:49:19 +0200 |
commit | d735e66d7d9b2d8c9a965ec96753864ff8c306c2 (patch) | |
tree | ce0214b9e3cc819252b9192e7518f7768e568c77 /lib/VNWeb/DB.pm | |
parent | c7642c03d99ed0255614a43fb82e55a1dde66753 (diff) |
v2rw: Add Elm & db_edit framework + Convert doc page editing
Most of this is copied from v3. I did improve on a few aspects:
- db_edit() and db_entry() use VNDB::Schema rather than dynamically
querying the DB. This has the minor advantage of a faster startup.
- The Elm code generator now writes to multiple files, this avoids
the namespace pollution seen in v3's Lib.Gen and makes the dependency
graph a bit more lean (i.e. faster incremental builds).
- The Elm code generator doesn't update the timestamp of files that
haven't been modified. This also speeds up incremental builds, the elm
compiler can now skip rebuilding unmodified files.
- The Elm API response generator code now uses plain functions rather
than code references and all possible responses are now defined in
Elm.pm. Turns out most API responses were used from more than a single
place, so it makes sense to have them centrally defined.
The doc page preview function is also much nicer; I'd like to apply this
to all BBCode textareas as well.
(Elm.pm itself is ugly as hell though. And we will prolly need some HTML
form generation functions in Elm to make that part less verbose)
Diffstat (limited to 'lib/VNWeb/DB.pm')
-rw-r--r-- | lib/VNWeb/DB.pm | 51 |
1 files changed, 50 insertions, 1 deletions
diff --git a/lib/VNWeb/DB.pm b/lib/VNWeb/DB.pm index b839baf3..7ef2e161 100644 --- a/lib/VNWeb/DB.pm +++ b/lib/VNWeb/DB.pm @@ -12,7 +12,7 @@ our @EXPORT = qw/ sql sql_join sql_comma sql_and sql_array sql_func sql_fromhex sql_tohex sql_fromtime sql_totime enrich enrich_merge enrich_flatten - db_entry + db_entry db_edit /; @@ -222,6 +222,7 @@ my $entry_types = do { # TODO: # - Use non _hist tables if $maxrev == $rev (should be faster) # - Combine the enrich_merge() calls into a single query. +# - Fixed ordering of arrays (use primary keys) sub db_entry { my($type, $id, $rev) = @_; my $t = $entry_types->{$type}||die; @@ -261,4 +262,52 @@ sub db_entry { $entry } + +# Edit or create an entry, usage: +# ($id, $chid, $rev) = db_edit $type, $id, $data, $uid; +# +# $id should be undef to create a new entry. +# $uid should be undef to use the currently logged in user. +# $data should have the same format as returned by db_entry(), but instead with +# the following additional keys in the top-level hash: +# +# hidden, locked, editsum +sub db_edit { + my($type, $id, $data, $uid) = @_; + $id ||= undef; + my $t = $entry_types->{$type}||die; + + tuwf->dbExeci("SELECT edit_${type}_init(", \$id, ', (SELECT MAX(rev) FROM changes WHERE type = ', \$type, ' AND itemid = ', \$id, '))'); + tuwf->dbExeci('UPDATE edit_revision SET', { + requester => $uid // scalar VNWeb::Auth::auth()->uid(), + ip => scalar tuwf->reqIP(), + comments => $data->{editsum}, + ihid => $data->{hidden}, + ilock => $data->{locked}, + }); + + { + my $base = $t->{base}{name} =~ s/_hist$//r; + tuwf->dbExeci("UPDATE edit_${base} SET ", sql_comma( + map sql("\"$_->{name}\"", ' = ', \$data->{$_->{name}}), + grep exists $data->{$_->{name}}, $t->{base}{cols}->@* + )); + } + + while(my($name, $tbl) = each $t->{tables}->%*) { + my $base = $tbl->{name} =~ s/_hist$//r; + my @cols = map sql_comma(map "\"$_->{name}\""), $tbl->{cols}->$@; + my @rows = map { + my $d = $_; + sql '(', sql_comma(map \$d, $tbl->{cols}->@*), ')' + } $data->{$name}->@*; + + tuwf->dbExeci("DELETE FROM edit_${base}"); + tuwf->dbExeci("INSERT INTO edit_${base} (", @cols, ') VALUES ', sql_comma @rows) if @rows; + } + + my $r = tuwf->dbRow("SELECT * FROM edit_${type}_commit()"); + ($r->{itemid}, $r->{chid}, $r->{rev}) +} + 1; |