Skip to content
Snippets Groups Projects
Select Git revision
  • da07a1d7dc29384b6608be9567364ecd082361f5
  • main default protected
  • f-prefill
  • dev
  • f-docs-pylib
  • f-parse-value
  • f-compare
  • f-string-ids
  • f-217-set-special-property
  • f-filesystem-import
  • f-filesystem-link
  • f-filesystem-directory
  • f-filesystem-core
  • f-filesystem-cleanup
  • f-check-merge-entities
  • f-compare-enid
  • f-select-subproperties
  • v0.18.0
  • v0.17.0
  • v0.16.0
  • v0.15.1
  • v0.15.0
  • v0.14.0
  • v0.13.2
  • v0.13.1
  • v0.13.0
  • linkahead-rename-step-2
  • linkahead-rename-step-1
  • v0.12.0
  • v0.11.2
  • v0.11.1
  • v0.11.0
  • v0.10.0
  • v0.9.0
  • v0.8.0
  • v0.7.4
  • v0.7.3
37 results

test_authentication_external.py

Blame
  • 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;