| /* wc-checks.sql -- trigger-based checks for the wc-metadata database. |
| * This is intended for use with SQLite 3 |
| * |
| * ==================================================================== |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * ==================================================================== |
| */ |
| |
| |
| -- STMT_VERIFICATION_TRIGGERS |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| CREATE TEMPORARY TRIGGER no_repository_updates BEFORE UPDATE ON repository |
| BEGIN |
| SELECT RAISE(FAIL, 'Updates to REPOSITORY are not allowed.'); |
| END; |
| |
| /* ------------------------------------------------------------------------- */ |
| |
| /* Verify: on every NODES row: parent_relpath is parent of local_relpath */ |
| CREATE TEMPORARY TRIGGER validation_01 BEFORE INSERT ON nodes |
| WHEN NOT ((new.local_relpath = '' AND new.parent_relpath IS NULL) |
| OR (relpath_depth(new.local_relpath) |
| = relpath_depth(new.parent_relpath) + 1)) |
| BEGIN |
| SELECT RAISE(FAIL, 'WC DB validity check 01 failed'); |
| END; |
| |
| /* Verify: on every NODES row: its op-depth <= its own depth */ |
| CREATE TEMPORARY TRIGGER validation_02 BEFORE INSERT ON nodes |
| WHEN NOT new.op_depth <= relpath_depth(new.local_relpath) |
| BEGIN |
| SELECT RAISE(FAIL, 'WC DB validity check 02 failed'); |
| END; |
| |
| /* Verify: on every NODES row: it is an op-root or it has a parent with the |
| sames op-depth. (Except when the node is a file external) */ |
| CREATE TEMPORARY TRIGGER validation_03 BEFORE INSERT ON nodes |
| WHEN NOT ( |
| (new.op_depth = relpath_depth(new.local_relpath)) |
| OR |
| (EXISTS (SELECT 1 FROM nodes |
| WHERE wc_id = new.wc_id AND op_depth = new.op_depth |
| AND local_relpath = new.parent_relpath)) |
| ) |
| AND NOT (new.file_external IS NOT NULL AND new.op_depth = 0) |
| BEGIN |
| SELECT RAISE(FAIL, 'WC DB validity check 03 failed'); |
| END; |
| |
| /* Verify: on every ACTUAL row (except root): a NODES row exists at its |
| * parent path. */ |
| CREATE TEMPORARY TRIGGER validation_04 BEFORE INSERT ON actual_node |
| WHEN NOT (new.local_relpath = '' |
| OR EXISTS (SELECT 1 FROM nodes |
| WHERE wc_id = new.wc_id |
| AND local_relpath = new.parent_relpath)) |
| BEGIN |
| SELECT RAISE(FAIL, 'WC DB validity check 04 failed'); |
| END; |
| |