X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?a=blobdiff_plain;ds=sidebyside;f=yarrg%2FCommodsDatabase.pm;fp=yarrg%2FCommodsDatabase.pm;h=e14c0eb401e10a0f299b9b2c0564ce69d492266a;hb=9089113ed14d3a01ebe805ee15bd08705a59f172;hp=d978358e4460e70c6e6e676b53a93817550238d3;hpb=bb95133fcfbd4698daa59debdbaa73a4d1e6252a;p=ypp-sc-tools.db-test.git diff --git a/yarrg/CommodsDatabase.pm b/yarrg/CommodsDatabase.pm index d978358..e14c0eb 100644 --- a/yarrg/CommodsDatabase.pm +++ b/yarrg/CommodsDatabase.pm @@ -46,6 +46,7 @@ BEGIN { @EXPORT = qw(&db_setocean &db_writer &db_connect $dbh &db_filename &db_doall &db_onconflict &dbr_filename &dbr_connect &db_connect_core + &dumptab_head &dumptab_row_hashref &db_chkcommit &db_check_referential_integrity); %EXPORT_TAGS = ( ); @@ -120,6 +121,22 @@ sub db_doall ($) { } } +#---------- table dump helper ---------- + +sub dumptab_head ($$$) { + my ($fh,$w,$cols) = @_; + printf $fh "|%-${w}s", $_ foreach @$cols; print $fh "|\n"; + print $fh "+",('-'x$w) foreach @$cols; print $fh "+\n"; +} + +sub dumptab_row_hashref ($$$$) { + my ($fh,$w,$cols,$row) = @_; + printf $fh "|%-$w.${w}s", + (defined $row->{$_} ? $row->{$_} : 'NULL') + foreach @$cols; + print $fh "\n"; +} + #---------- referential integrity constraints ---------- # SQLite doesn't support foreign key constraints so we do it by steam: @@ -147,14 +164,10 @@ sub nooutput ($) { if (!$ecount++) { print STDERR "REFERENTIAL INTEGRITY ERROR\n"; print STDERR "\n$etxt\n $stmt\n\n"; - printf STDERR "|%-${w}s", $_ foreach @cols; print STDERR "|\n"; - print STDERR "+",('-'x$w) foreach @cols; print STDERR "+\n"; + dumptab_head(\*STDERR,$w,\@cols); } if ($ecount>5) { print STDERR "...\n"; last; } - printf STDERR "|%-$w.${w}s", - (defined $row->{$_} ? $row->{$_} : 'NULL') - foreach @cols; - print STDERR "\n"; + dumptab_row_hashref(\*STDERR,$w,\@cols,$row); } next unless $ecount; @@ -205,20 +218,35 @@ END SELECT * FROM stalls NATURAL LEFT JOIN islands WHERE islandname IS NULL; SELECT * FROM uploads NATURAL LEFT JOIN islands WHERE islandname IS NULL; - # Every commod which refers to a commodclass refers to an existing one: - SELECT * FROM commods WHERE commodclass NOT IN - (SELECT commodclass FROM commodclasses); - - # There are no empty commodclasses: + # Every commod must refers to a commodclass and vice versa: + SELECT * FROM commods NATURAL LEFT JOIN commodclasses + WHERE commodclass IS NULL; SELECT * FROM commodclasses NATURAL LEFT JOIN commods WHERE commodname IS NULL; - # Ordvals which are not zero are unique: - SELECT ordval,count(*) FROM COMMODS - WHERE ordval IS NOT NULL AND ordval != 0 + # Ordvals which are not commodclass ordvals are unique: + SELECT ordval,count(*),commodname,commodid,posinclass + FROM commods + WHERE posinclass > 0 GROUP BY ordval HAVING count(*) > 1; + # For every class, posinclass is dense from 1 to maxposinclass, + # apart from the commods for which it is zero. + SELECT commodclass,commodclassid,posinclass,count(*) + FROM commods NATURAL JOIN commodclasses + WHERE posinclass > 0 + GROUP BY commodclassid,posinclass + HAVING count(*) > 1; + SELECT commodclass,commodclassid,count(*) + FROM commods NATURAL JOIN commodclasses + WHERE posinclass > 0 + GROUP BY commodclassid + HAVING count(*) != maxposinclass; + SELECT * + FROM commods NATURAL JOIN commodclasses + WHERE posinclass < 0 OR posinclass > maxposinclass; + END }