"unittests/test_query.py" did not exist on "060ab961f16a2eff02312ddd01fe1c6cd2022bd2"
Select Git revision
test_authentication_external.py
-
Henrik tom Wörden authoredHenrik tom Wörden authored
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
fix_unversioned.sql 4.23 KiB
/*
* This file is a part of the CaosDB Project.
*
* Copyright (C) 2020 IndiScale GmbH <info@indiscale.com>
* Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
DROP PROCEDURE IF EXISTS _fix_unversioned;
delimiter //
/*
* Generate entries in the entity_version table for all entities which are
* stored in the database and have no entry in the entity_version table yet.
*/
CREATE PROCEDURE _fix_unversioned()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE unversioned_id INT UNSIGNED;
-- cursor for unversioned entities
DECLARE entities_cur CURSOR FOR SELECT e.id
FROM entities AS e
WHERE NOT EXISTS (
SELECT 1 FROM entity_version AS v WHERE v.entity_id = e.id);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN entities_cur;
insert_loop: LOOP
FETCH entities_cur INTO unversioned_id;
IF done THEN
LEAVE insert_loop;
END IF;
-- create an entry in transaction from the latest log in
-- transaction_log, hence the latest update of an entity
INSERT IGNORE INTO transactions (srid, username, realm, seconds, nanos)
SELECT tmp.srid, tmp.username, tmp.realm, tmp.seconds, tmp.nanos FROM (
SELECT
SHA2(CONCAT(username, realm, seconds, nanos), 512) AS srid,
username AS username,
realm AS realm,
seconds AS seconds,
nanos AS nanos
FROM transaction_log
WHERE entity_id = unversioned_id
UNION SELECT
-- this is for the standard entities (id<100)
SHA2("", 512) AS srid,
"administration" As username,
"CaosDB" AS realm,
0 as seconds,
0 as nanos
) AS tmp ORDER BY tmp.seconds DESC, tmp.nanos DESC LIMIT 1;
-- insert single version into entity_version
INSERT INTO entity_version (entity_id, hash, version, _iversion,
_ipparent, srid)
SELECT tmp.entity_id, tmp.hash, tmp.version, tmp._iversion,
tmp._ipparent, tmp.srid
FROM (
SELECT
l.entity_id AS entity_id,
NULL as hash,
SHA1(UUID()) as version,
1 AS _iversion,
NULL AS _ipparent,
t.srid AS srid,
t.seconds AS seconds,
t.nanos AS nanos
FROM transactions AS t JOIN transaction_log as l
ON ( t.seconds = l.seconds
AND t.nanos = l.nanos
AND t.username = l.username
AND t.realm = l.realm )
WHERE l.entity_id = unversioned_id AND unversioned_id > 99
UNION SELECT
unversioned_id AS entity_id,
NULL AS hash,
SHA1(UUID()) AS version,
1 AS _iversion,
NULL AS _ipparent,
t.srid AS srid,
t.seconds AS seconds,
t.nanos AS nanos
FROM transactions AS t
WHERE t.seconds = 0 AND t.nanos = 0 AND unversioned_id<100
) AS tmp ORDER BY tmp.seconds DESC, tmp.nanos DESC LIMIT 1;
END LOOP;
CLOSE entities_cur;
END;
//
delimiter ;
CALL _fix_unversioned();
DROP PROCEDURE _fix_unversioned;