chiark / gitweb /
where-vessels: factor out make-smashers
[ypp-sc-tools.main.git] / yarrg / CommodsDatabase.pm
index e14c0eb401e10a0f299b9b2c0564ce69d492266a..3cb543dc43b3866971cff2cb28e39de7f6061631 100644 (file)
@@ -178,7 +178,12 @@ sub nooutput ($) {
        if $ekindcount;
 }
 
-sub db_check_referential_integrity () {
+sub db_check_referential_integrity ($) {
+    my ($full) = @_;
+    # non-full is done only for market data updates; it avoids
+    # detecting errors which are essentially missing metadata and
+    # old schemas, etc.
+
     foreach my $bs (qw(buy sell)) {
        nooutput(<<END);
 
@@ -196,28 +201,33 @@ sub db_check_referential_integrity () {
 
 END
     }
-    foreach my $end (qw(aiid biid)) {
-       foreach my $tab (qw(dists routes)) {
-           nooutput(<<END);
+
+    nooutput(<<END);
+
+ # Every stall and upload must refer to an island:
+ SELECT * FROM stalls NATURAL LEFT JOIN islands WHERE islandname IS NULL;
+ SELECT * FROM uploads NATURAL LEFT JOIN islands WHERE islandname IS NULL;
+
+END
+    if ($full) {
+       foreach my $end (qw(aiid biid)) {
+           foreach my $tab (qw(dists routes)) {
+               nooutput(<<END);
 
  # Every row in dists and routes must refer to two existing rows in islands:
  SELECT * FROM $tab d LEFT JOIN islands ON d.$end=islandid
        WHERE islandname IS NULL;
 
 END
+           }
        }
-    }
-    nooutput(<<END);
+       nooutput(<<END);
 
  # Every pair of islands must have an entry in dists:
  SELECT * FROM islands ia JOIN islands ib LEFT JOIN dists
        ON ia.islandid=aiid and ib.islandid=biid
        WHERE dist IS NULL;
 
- # Every stall and upload must refer to an island:
- SELECT * FROM stalls NATURAL LEFT JOIN islands WHERE islandname IS NULL;
- SELECT * FROM uploads NATURAL LEFT JOIN islands WHERE islandname IS NULL;
-
  # Every commod must refers to a commodclass and vice versa:
  SELECT * FROM commods NATURAL LEFT JOIN commodclasses
        WHERE commodclass IS NULL;
@@ -248,10 +258,12 @@ END
        WHERE posinclass < 0 OR posinclass > maxposinclass;
 
 END
+    }
 }
 
-sub db_chkcommit () {
-    db_check_referential_integrity();
+sub db_chkcommit ($) {
+    my ($full) = @_;
+    db_check_referential_integrity($full);
     $dbh->commit();
 }