Skip to content
Snippets Groups Projects
Verified Commit 2280def3 authored by Timm Fitschen's avatar Timm Fitschen
Browse files

WIP: introduce external ids

parent 8b6d92dd
Branches
Tags
3 merge requests!17Release 6.0,!15External String IDs,!11DRAFT: file system cleanup
Pipeline #30896 failed
Showing
with 373 additions and 216 deletions
...@@ -2,6 +2,10 @@ ...@@ -2,6 +2,10 @@
DROP PROCEDURE IF EXISTS retrieveSubEntity; DROP PROCEDURE IF EXISTS retrieveSubEntity;
DROP PROCEDURE IF EXISTS retrieveDatatype; DROP PROCEDURE IF EXISTS retrieveDatatype;
DROP PROCEDURE IF EXISTS retrieveGroup; DROP PROCEDURE IF EXISTS retrieveGroup;
DROP PROCEDURE IF EXISTS getInfo;
DROP PROCEDURE IF EXISTS getRole;
DROP PROCEDURE IF EXISTS setPassword;
-- new entity_ids table -- new entity_ids table
DROP TABLE IF EXISTS `entity_ids`; DROP TABLE IF EXISTS `entity_ids`;
...@@ -17,3 +21,10 @@ INSERT INTO entity_ids (id, internal_id) SELECT id, id FROM entities WHERE id>0; ...@@ -17,3 +21,10 @@ INSERT INTO entity_ids (id, internal_id) SELECT id, id FROM entities WHERE id>0;
INSERT INTO entity_ids (id, internal_id) SELECT id, id FROM entities WHERE id=0; INSERT INTO entity_ids (id, internal_id) SELECT id, id FROM entities WHERE id=0;
UPDATE entity_ids SET id = internal_id; UPDATE entity_ids SET id = internal_id;
-- ALTER TABLE entity_ids CHANGE id id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'External ID of an entity. This is the id of an entity which is exposed via the CaosDB API.'; -- ALTER TABLE entity_ids CHANGE id id int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'External ID of an entity. This is the id of an entity which is exposed via the CaosDB API.';
ALTER TABLE null_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
ALTER TABLE text_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
ALTER TABLE double_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
ALTER TABLE integer_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
ALTER TABLE reference_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
ALTER TABLE enum_data CHANGE property_id property_id INT UNSIGNED NOT NULL;
...@@ -31,11 +31,11 @@ fi ...@@ -31,11 +31,11 @@ fi
. $UTILSPATH/patch_header.sh $* . $UTILSPATH/patch_header.sh $*
check_version $OLD_VERSION # check_version $OLD_VERSION
mysql_execute_file $PATCH_DIR/create_entity_ids_table.sql mysql_execute_file $PATCH_DIR/create_entity_ids_table.sql
update_version $NEW_VERSION # update_version $NEW_VERSION
success success
...@@ -40,28 +40,34 @@ delimiter // ...@@ -40,28 +40,34 @@ delimiter //
CREATE PROCEDURE db_5_0.deleteEntity(in EntityID INT UNSIGNED) CREATE PROCEDURE db_5_0.deleteEntity(in EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID from entity_ids WHERE id = EntityID;
-- detele file properties -- detele file properties
DELETE FROM files where file_id=EntityID; DELETE FROM files where file_id=InternalEntityID;
-- delete datatype stuff -- delete datatype stuff
DELETE FROM data_type DELETE FROM data_type
WHERE ( domain_id = 0 WHERE ( domain_id = 0
AND entity_id = 0 AND entity_id = 0
AND property_id = EntityID ) AND property_id = InternalEntityID )
OR datatype = EntityID; OR datatype = InternalEntityID;
DELETE FROM collection_type DELETE FROM collection_type
WHERE domain_id = 0 WHERE domain_id = 0
AND entity_id = 0 AND entity_id = 0
AND property_id = EntityID; AND property_id = InternalEntityID;
-- delete primary name (in case this is called without a prior call to deleteEntityProperties) -- delete primary name (in case this is called without a prior call to deleteEntityProperties)
DELETE FROM name_data DELETE FROM name_data
WHERE domain_id = 0 WHERE domain_id = 0
AND entity_id = EntityID AND entity_id = InternalEntityID
AND property_id = 20; AND property_id = 20;
DELETE FROM entities where id=EntityID; DELETE FROM entity_ids
WHERE internal_id = InternalEntityID;
DELETE FROM entities where id=InternalEntityID;
-- clean up unused acl -- clean up unused acl
DELETE FROM entity_acl DELETE FROM entity_acl
......
...@@ -29,13 +29,16 @@ delimiter // ...@@ -29,13 +29,16 @@ delimiter //
CREATE PROCEDURE db_5_0.deleteEntityProperties(in EntityID INT UNSIGNED) CREATE PROCEDURE db_5_0.deleteEntityProperties(in EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE IVersion INT UNSIGNED DEFAULT NULL; DECLARE IVersion INT UNSIGNED DEFAULT NULL;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
CALL deleteIsa(EntityID); SELECT internal_id INTO InternalEntityID from entity_ids WHERE id = EntityID;
CALL deleteIsa(InternalEntityID);
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
SELECT max(e._iversion) INTO IVersion -- What's the latest version? SELECT max(e._iversion) INTO IVersion -- What's the latest version?
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID; WHERE e.entity_id = InternalEntityID;
-- Copy the rows from *_data to archive_*_data --------------------- -- Copy the rows from *_data to archive_*_data ---------------------
INSERT INTO archive_reference_data (domain_id, entity_id, INSERT INTO archive_reference_data (domain_id, entity_id,
...@@ -43,142 +46,142 @@ BEGIN ...@@ -43,142 +46,142 @@ BEGIN
SELECT domain_id, entity_id, property_id, value, value_iversion, SELECT domain_id, entity_id, property_id, value, value_iversion,
status, pidx, IVersion AS _iversion status, pidx, IVersion AS _iversion
FROM reference_data FROM reference_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_null_data (domain_id, entity_id, INSERT INTO archive_null_data (domain_id, entity_id,
property_id, status, pidx, _iversion) property_id, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, status, SELECT domain_id, entity_id, property_id, status,
pidx, IVersion AS _iversion pidx, IVersion AS _iversion
FROM null_data FROM null_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_text_data (domain_id, entity_id, INSERT INTO archive_text_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion) property_id, value, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion pidx, IVersion AS _iversion
FROM text_data FROM text_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_name_data (domain_id, entity_id, INSERT INTO archive_name_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion) property_id, value, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion pidx, IVersion AS _iversion
FROM name_data FROM name_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_enum_data (domain_id, entity_id, INSERT INTO archive_enum_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion) property_id, value, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion pidx, IVersion AS _iversion
FROM enum_data FROM enum_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_integer_data (domain_id, entity_id, INSERT INTO archive_integer_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion, unit_sig) property_id, value, status, pidx, _iversion, unit_sig)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion, unit_sig pidx, IVersion AS _iversion, unit_sig
FROM integer_data FROM integer_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_double_data (domain_id, entity_id, INSERT INTO archive_double_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion, unit_sig) property_id, value, status, pidx, _iversion, unit_sig)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion, unit_sig pidx, IVersion AS _iversion, unit_sig
FROM double_data FROM double_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_datetime_data (domain_id, entity_id, INSERT INTO archive_datetime_data (domain_id, entity_id,
property_id, value, value_ns, status, pidx, _iversion) property_id, value, value_ns, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, value, value_ns, SELECT domain_id, entity_id, property_id, value, value_ns,
status, pidx, IVersion AS _iversion status, pidx, IVersion AS _iversion
FROM datetime_data FROM datetime_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_date_data (domain_id, entity_id, INSERT INTO archive_date_data (domain_id, entity_id,
property_id, value, status, pidx, _iversion) property_id, value, status, pidx, _iversion)
SELECT domain_id, entity_id, property_id, value, status, SELECT domain_id, entity_id, property_id, value, status,
pidx, IVersion AS _iversion pidx, IVersion AS _iversion
FROM date_data FROM date_data
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_name_overrides (domain_id, entity_id, INSERT INTO archive_name_overrides (domain_id, entity_id,
property_id, name, _iversion) property_id, name, _iversion)
SELECT domain_id, entity_id, property_id, name, SELECT domain_id, entity_id, property_id, name,
IVersion AS _iversion IVersion AS _iversion
FROM name_overrides FROM name_overrides
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_desc_overrides (domain_id, entity_id, INSERT INTO archive_desc_overrides (domain_id, entity_id,
property_id, description, _iversion) property_id, description, _iversion)
SELECT domain_id, entity_id, property_id, description, SELECT domain_id, entity_id, property_id, description,
IVersion AS _iversion IVersion AS _iversion
FROM desc_overrides FROM desc_overrides
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_data_type (domain_id, entity_id, INSERT INTO archive_data_type (domain_id, entity_id,
property_id, datatype, _iversion) property_id, datatype, _iversion)
SELECT domain_id, entity_id, property_id, datatype, SELECT domain_id, entity_id, property_id, datatype,
IVersion AS _iversion IVersion AS _iversion
FROM data_type FROM data_type
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_collection_type (domain_id, entity_id, INSERT INTO archive_collection_type (domain_id, entity_id,
property_id, collection, _iversion) property_id, collection, _iversion)
SELECT domain_id, entity_id, property_id, collection, SELECT domain_id, entity_id, property_id, collection,
IVersion AS _iversion IVersion AS _iversion
FROM collection_type FROM collection_type
WHERE (domain_id = 0 AND entity_id = EntityID) WHERE (domain_id = 0 AND entity_id = InternalEntityID)
OR domain_id = EntityID; OR domain_id = InternalEntityID;
INSERT INTO archive_query_template_def (id, definition, _iversion) INSERT INTO archive_query_template_def (id, definition, _iversion)
SELECT id, definition, IVersion AS _iversion SELECT id, definition, IVersion AS _iversion
FROM query_template_def FROM query_template_def
WHERE id = EntityID; WHERE id = InternalEntityID;
END IF; END IF;
DELETE FROM reference_data DELETE FROM reference_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM null_data DELETE FROM null_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM text_data DELETE FROM text_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM name_data DELETE FROM name_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM enum_data DELETE FROM enum_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM integer_data DELETE FROM integer_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM double_data DELETE FROM double_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM datetime_data DELETE FROM datetime_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM date_data DELETE FROM date_data
where (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; where (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM name_overrides DELETE FROM name_overrides
WHERE (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; WHERE (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM desc_overrides DELETE FROM desc_overrides
WHERE (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; WHERE (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM data_type DELETE FROM data_type
WHERE (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; WHERE (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM collection_type DELETE FROM collection_type
WHERE (domain_id=0 AND entity_id=EntityID) OR domain_id=EntityID; WHERE (domain_id=0 AND entity_id=InternalEntityID) OR domain_id=InternalEntityID;
DELETE FROM query_template_def WHERE id=EntityID; DELETE FROM query_template_def WHERE id=InternalEntityID;
END; END;
// //
......
...@@ -44,24 +44,27 @@ Child entity for which all parental relations should be deleted. ...@@ -44,24 +44,27 @@ Child entity for which all parental relations should be deleted.
CREATE PROCEDURE db_5_0.deleteIsa(IN EntityID INT UNSIGNED) CREATE PROCEDURE db_5_0.deleteIsa(IN EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE IVersion INT UNSIGNED DEFAULT NULL; DECLARE IVersion INT UNSIGNED DEFAULT NULL;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID from entity_ids WHERE id = EntityID;
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
SELECT max(_iversion) INTO IVersion SELECT max(_iversion) INTO IVersion
FROM entity_version FROM entity_version
WHERE entity_id = EntityID; WHERE entity_id = InternalEntityID;
-- move to archive_isa before deleting -- move to archive_isa before deleting
INSERT IGNORE INTO archive_isa (child, child_iversion, parent, direct) INSERT IGNORE INTO archive_isa (child, child_iversion, parent, direct)
SELECT e.child, IVersion AS child_iversion, e.parent, rpath = EntityID SELECT e.child, IVersion AS child_iversion, e.parent, rpath = InternalEntityID
FROM isa_cache AS e FROM isa_cache AS e
WHERE e.child = EntityID; WHERE e.child = InternalEntityID;
END IF; END IF;
DELETE FROM isa_cache DELETE FROM isa_cache
WHERE child = EntityID WHERE child = InternalEntityID
OR rpath = EntityID OR rpath = InternalEntityID
OR rpath LIKE concat('%>', EntityID) OR rpath LIKE concat('%>', InternalEntityID)
OR rpath LIKE concat('%>', EntityID, '>%'); OR rpath LIKE concat('%>', InternalEntityID, '>%');
END; END;
// //
......
...@@ -52,12 +52,15 @@ CREATE PROCEDURE db_5_0.insert_single_child_version( ...@@ -52,12 +52,15 @@ CREATE PROCEDURE db_5_0.insert_single_child_version(
BEGIN BEGIN
DECLARE newiversion INT UNSIGNED DEFAULT NULL; DECLARE newiversion INT UNSIGNED DEFAULT NULL;
DECLARE newipparent INT UNSIGNED DEFAULT NULL; DECLARE newipparent INT UNSIGNED DEFAULT NULL;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
-- find _ipparent -- find _ipparent
IF Parent IS NOT NULL THEN IF Parent IS NOT NULL THEN
SELECT e._iversion INTO newipparent SELECT e._iversion INTO newipparent
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
AND e.version = Parent; AND e.version = Parent;
IF newipparent IS NULL THEN IF newipparent IS NULL THEN
-- throw error; -- throw error;
...@@ -70,7 +73,7 @@ BEGIN ...@@ -70,7 +73,7 @@ BEGIN
-- generate _iversion -- generate _iversion
SELECT max(e._iversion)+1 INTO newiversion SELECT max(e._iversion)+1 INTO newiversion
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id=EntityID; WHERE e.entity_id=InternalEntityID;
IF newiversion IS NULL THEN IF newiversion IS NULL THEN
SET newiversion = 1; SET newiversion = 1;
END IF; END IF;
...@@ -78,7 +81,7 @@ BEGIN ...@@ -78,7 +81,7 @@ BEGIN
INSERT INTO entity_version INSERT INTO entity_version
(entity_id, hash, version, _iversion, _ipparent, srid) (entity_id, hash, version, _iversion, _ipparent, srid)
VALUES VALUES
(EntityID, Hash, Version, newiversion, newipparent, Transaction); (InternalEntityID, Hash, Version, newiversion, newipparent, Transaction);
...@@ -98,8 +101,11 @@ DROP PROCEDURE IF EXISTS db_5_0.delete_all_entity_versions // ...@@ -98,8 +101,11 @@ DROP PROCEDURE IF EXISTS db_5_0.delete_all_entity_versions //
CREATE PROCEDURE db_5_0.delete_all_entity_versions( CREATE PROCEDURE db_5_0.delete_all_entity_versions(
in EntityID INT UNSIGNED) in EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
DELETE FROM entity_version WHERE entity_id = EntityID; DELETE FROM entity_version WHERE entity_id = InternalEntityID;
END; END;
// //
...@@ -126,10 +132,14 @@ CREATE FUNCTION db_5_0.get_iversion( ...@@ -126,10 +132,14 @@ CREATE FUNCTION db_5_0.get_iversion(
RETURNS INT UNSIGNED RETURNS INT UNSIGNED
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
RETURN ( RETURN (
SELECT e._iversion SELECT e._iversion
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
AND e.version = Version AND e.version = Version
); );
END; END;
...@@ -158,12 +168,16 @@ CREATE FUNCTION db_5_0.get_primary_parent_version( ...@@ -158,12 +168,16 @@ CREATE FUNCTION db_5_0.get_primary_parent_version(
RETURNS VARBINARY(255) RETURNS VARBINARY(255)
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
RETURN ( RETURN (
SELECT p.version SELECT p.version
FROM entity_version AS e INNER JOIN entity_version AS p FROM entity_version AS e INNER JOIN entity_version AS p
ON (e._ipparent = p._iversion ON (e._ipparent = p._iversion
AND e.entity_id = p.entity_id) AND e.entity_id = p.entity_id)
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
AND e.version = Version AND e.version = Version
); );
END; END;
...@@ -193,11 +207,15 @@ CREATE FUNCTION db_5_0.get_version_timestamp( ...@@ -193,11 +207,15 @@ CREATE FUNCTION db_5_0.get_version_timestamp(
RETURNS VARCHAR(255) RETURNS VARCHAR(255)
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
RETURN ( RETURN (
SELECT concat(t.seconds, '.', t.nanos) SELECT concat(t.seconds, '.', t.nanos)
FROM entity_version AS e INNER JOIN transactions AS t FROM entity_version AS e INNER JOIN transactions AS t
ON ( e.srid = t.srid ) ON ( e.srid = t.srid )
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
AND e.version = Version AND e.version = Version
); );
END; END;
...@@ -245,6 +263,10 @@ CREATE FUNCTION db_5_0._get_head_iversion( ...@@ -245,6 +263,10 @@ CREATE FUNCTION db_5_0._get_head_iversion(
RETURNS INT UNSIGNED RETURNS INT UNSIGNED
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
-- This implementation assumes that the history is linear and the highest -- This implementation assumes that the history is linear and the highest
-- _iversion number is always the head. This will not be correct anymore -- _iversion number is always the head. This will not be correct anymore
-- as soon as branches may split and merge. Then, a walk over the primary -- as soon as branches may split and merge. Then, a walk over the primary
...@@ -252,7 +274,7 @@ BEGIN ...@@ -252,7 +274,7 @@ BEGIN
RETURN ( RETURN (
SELECT e._iversion SELECT e._iversion
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
ORDER BY e._iversion DESC ORDER BY e._iversion DESC
LIMIT 1 LIMIT 1
); );
...@@ -284,6 +306,10 @@ CREATE FUNCTION db_5_0.get_head_relative( ...@@ -284,6 +306,10 @@ CREATE FUNCTION db_5_0.get_head_relative(
RETURNS VARBINARY(255) RETURNS VARBINARY(255)
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
-- This implementation assumes that the distance from the head equals the -- This implementation assumes that the distance from the head equals the
-- difference between the _iversion numbers. This will not be correct anymore -- difference between the _iversion numbers. This will not be correct anymore
-- as soon as branches may split and merge. Then, a walk over the primary -- as soon as branches may split and merge. Then, a walk over the primary
...@@ -291,7 +317,7 @@ BEGIN ...@@ -291,7 +317,7 @@ BEGIN
RETURN ( RETURN (
SELECT e.version SELECT e.version
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
ORDER BY e._iversion DESC ORDER BY e._iversion DESC
LIMIT 1 OFFSET Offset LIMIT 1 OFFSET Offset
); );
...@@ -319,9 +345,13 @@ CREATE FUNCTION db_5_0._get_version( ...@@ -319,9 +345,13 @@ CREATE FUNCTION db_5_0._get_version(
RETURNS VARBINARY(255) RETURNS VARBINARY(255)
READS SQL DATA READS SQL DATA
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
RETURN ( RETURN (
SELECT version FROM entity_version SELECT version FROM entity_version
WHERE entity_id = EntityID WHERE entity_id = InternalEntityID
AND _iversion = IVersion AND _iversion = IVersion
); );
END; END;
...@@ -346,6 +376,10 @@ DROP PROCEDURE IF EXISTS db_5_0.get_version_history // ...@@ -346,6 +376,10 @@ DROP PROCEDURE IF EXISTS db_5_0.get_version_history //
CREATE PROCEDURE db_5_0.get_version_history( CREATE PROCEDURE db_5_0.get_version_history(
in EntityID INT UNSIGNED) in EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
-- retrieve root(s) (initial versions) -- retrieve root(s) (initial versions)
SELECT c.version AS child, SELECT c.version AS child,
NULL as parent, NULL as parent,
...@@ -355,7 +389,7 @@ BEGIN ...@@ -355,7 +389,7 @@ BEGIN
t.realm AS child_realm t.realm AS child_realm
FROM entity_version AS c INNER JOIN transactions as t FROM entity_version AS c INNER JOIN transactions as t
ON ( c.srid = t.srid ) ON ( c.srid = t.srid )
WHERE c.entity_id = EntityID WHERE c.entity_id = InternalEntityID
AND c._ipparent is Null AND c._ipparent is Null
-- TODO This first SELECT statement is necessary because the second one -- TODO This first SELECT statement is necessary because the second one
...@@ -375,7 +409,7 @@ BEGIN ...@@ -375,7 +409,7 @@ BEGIN
ON (c._ipparent = p._iversion ON (c._ipparent = p._iversion
AND c.entity_id = p.entity_id AND c.entity_id = p.entity_id
AND t.srid = c.srid) AND t.srid = c.srid)
WHERE p.entity_id = EntityID; WHERE p.entity_id = InternalEntityID;
END; END;
// //
...@@ -439,24 +473,28 @@ CREATE PROCEDURE setFileProperties ( ...@@ -439,24 +473,28 @@ CREATE PROCEDURE setFileProperties (
in FileHash VARCHAR(255) in FileHash VARCHAR(255)
) )
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
DECLARE IVersion INT UNSIGNED DEFAULT NULL; DECLARE IVersion INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
SELECT max(e._iversion) INTO IVersion SELECT max(e._iversion) INTO IVersion
FROM entity_version AS e FROM entity_version AS e
WHERE e.entity_id = EntityID; WHERE e.entity_id = InternalEntityID;
INSERT INTO archive_files (file_id, path, size, hash, INSERT INTO archive_files (file_id, path, size, hash,
_iversion) _iversion)
SELECT file_id, path, size, hash, IVersion AS _iversion SELECT file_id, path, size, hash, IVersion AS _iversion
FROM files FROM files
WHERE file_id = EntityID; WHERE file_id = InternalEntityID;
END IF; END IF;
DELETE FROM files WHERE file_id = EntityID; DELETE FROM files WHERE file_id = InternalEntityID;
IF FilePath IS NOT NULL THEN IF FilePath IS NOT NULL THEN
INSERT INTO files (file_id, path, size, hash) INSERT INTO files (file_id, path, size, hash)
VALUES (EntityID, FilePath, FileSize, unhex(FileHash)); VALUES (InternalEntityID, FilePath, FileSize, unhex(FileHash));
END IF; END IF;
END // END //
...@@ -486,6 +524,10 @@ retrieveQueryTemplateDefBody: BEGIN ...@@ -486,6 +524,10 @@ retrieveQueryTemplateDefBody: BEGIN
DECLARE IVersion INT UNSIGNED DEFAULT NULL; DECLARE IVersion INT UNSIGNED DEFAULT NULL;
DECLARE IsHead BOOLEAN DEFAULT TRUE; DECLARE IsHead BOOLEAN DEFAULT TRUE;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id = EntityID;
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
-- Are we at the head? -- Are we at the head?
...@@ -497,7 +539,7 @@ retrieveQueryTemplateDefBody: BEGIN ...@@ -497,7 +539,7 @@ retrieveQueryTemplateDefBody: BEGIN
-- TODO Use get_iversion(EntityID, Version) instead? Or will that be much slower? -- TODO Use get_iversion(EntityID, Version) instead? Or will that be much slower?
SELECT e._iversion INTO IVersion SELECT e._iversion INTO IVersion
FROM entity_version as e FROM entity_version as e
WHERE e.entity_id = EntityID WHERE e.entity_id = InternalEntityID
AND e.version = Version; AND e.version = Version;
IF IVersion IS NULL THEN IF IVersion IS NULL THEN
...@@ -507,7 +549,7 @@ retrieveQueryTemplateDefBody: BEGIN ...@@ -507,7 +549,7 @@ retrieveQueryTemplateDefBody: BEGIN
SELECT definition SELECT definition
FROM archive_query_template_def FROM archive_query_template_def
WHERE id = EntityID WHERE id = InternalEntityID
AND _iversion = IVersion; AND _iversion = IVersion;
LEAVE retrieveQueryTemplateDefBody; LEAVE retrieveQueryTemplateDefBody;
...@@ -516,7 +558,7 @@ retrieveQueryTemplateDefBody: BEGIN ...@@ -516,7 +558,7 @@ retrieveQueryTemplateDefBody: BEGIN
SELECT definition SELECT definition
FROM query_template_def FROM query_template_def
WHERE id = EntityID; WHERE id = InternalEntityID;
END // END //
......
...@@ -29,43 +29,47 @@ delimiter // ...@@ -29,43 +29,47 @@ delimiter //
CREATE PROCEDURE db_5_0.getDependentEntities(in EntityID INT UNSIGNED) CREATE PROCEDURE db_5_0.getDependentEntities(in EntityID INT UNSIGNED)
BEGIN BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
DROP TEMPORARY TABLE IF EXISTS refering; DROP TEMPORARY TABLE IF EXISTS refering;
CREATE TEMPORARY TABLE refering ( CREATE TEMPORARY TABLE refering (
id INT UNSIGNED UNIQUE id INT UNSIGNED UNIQUE
); );
INSERT IGNORE INTO refering (id) SELECT entity_id FROM reference_data WHERE (value=EntityID OR property_id=EntityID) AND domain_id=0 AND entity_id!=EntityID; SELECT internal_id INTO InternalEntityID from entity_ids WHERE id = EntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM reference_data WHERE (value=EntityID OR property_id=EntityID) AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM reference_data WHERE (value=InternalEntityID OR property_id=InternalEntityID) AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM reference_data WHERE (value=InternalEntityID OR property_id=InternalEntityID) AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM text_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM text_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM text_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM text_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM enum_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM enum_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM enum_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM enum_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM name_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM name_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM name_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM name_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM integer_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM integer_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM integer_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM integer_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM double_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM double_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM double_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM double_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM datetime_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM datetime_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM datetime_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM datetime_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM date_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM date_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM date_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM date_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id FROM null_data WHERE property_id=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id FROM null_data WHERE property_id=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id FROM null_data WHERE property_id=EntityID AND domain_id!=EntityID AND entity_id!=EntityID AND domain_id!=0; INSERT IGNORE INTO refering (id) SELECT domain_id FROM null_data WHERE property_id=InternalEntityID AND domain_id!=InternalEntityID AND entity_id!=InternalEntityID AND domain_id!=0;
INSERT IGNORE INTO refering (id) SELECT entity_id from data_type WHERE datatype=EntityID AND domain_id=0 AND entity_id!=EntityID; INSERT IGNORE INTO refering (id) SELECT entity_id from data_type WHERE datatype=InternalEntityID AND domain_id=0 AND entity_id!=InternalEntityID;
INSERT IGNORE INTO refering (id) SELECT domain_id from data_type WHERE datatype=EntityID; INSERT IGNORE INTO refering (id) SELECT domain_id from data_type WHERE datatype=InternalEntityID;
Select id from refering WHERE id!=0 and id!=EntityID; SELECT e.id FROM refering AS r LEFT JOIN entity_ids AS e ON r.id = e.internal_id WHERE r.id!=0 AND e.internal_id!=InternalEntityID;
DROP TEMPORARY TABLE refering; DROP TEMPORARY TABLE refering;
......
...@@ -26,7 +26,7 @@ Delimiter // ...@@ -26,7 +26,7 @@ Delimiter //
Create Procedure db_5_0.getFileIdByPath (in FilePath VARCHAR(255)) Create Procedure db_5_0.getFileIdByPath (in FilePath VARCHAR(255))
BEGIN BEGIN
Select file_id as FileID from files where path=FilePath LIMIT 1; SELECT e.id AS FileID FROM files AS f LEFT JOIN entity_ids ON e.internal_in = f.file_id WHERE f.path=FilePath LIMIT 1;
END; END;
// //
......
DROP PROCEDURE IF EXISTS db_5_0.getIdByName;
DELIMITER //
CREATE PROCEDURE db_5_0.getIdByName(in Name VARCHAR(255), in Role VARCHAR(255), in Lmt VARCHAR(255))
BEGIN
SET @stmtStr = "SELECT e.id AS id FROM name_data AS n JOIN entity_ids AS e ON (n.domain_id=0 AND n.property_id=20 AND e.internal_id = n.entity_id) JOIN entities AS i ON (i.id = e.internal_id) WHERE n.value = ?";
IF Role IS NULL THEN
SET @stmtStr = CONCAT(@stmtStr, " AND i.role!='ROLE'");
ELSE
SET @stmtStr = CONCAT(@stmtStr, " AND i.role='", Role, "'");
END IF;
IF Lmt IS NOT NULL THEN
SET @stmtStr = CONCAT(@stmtStr, " LIMIT ", Lmt);
END IF;
SET @vName = Name;
PREPARE stmt FROM @stmtStr;
EXECUTE stmt USING @vName;
DEALLOCATE PREPARE stmt;
END;
//
DELIMITER ;
/*
* ** header v3.0
* This file is a part of the CaosDB Project.
*
* Copyright (C) 2018 Research Group Biomedical Physics,
* Max-Planck-Institute for Dynamics and Self-Organization Göttingen
*
* 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/>.
*
* ** end header
*/
#-- old procedure.
Drop Procedure if exists db_5_0.getInfo;
/*
* ** header v3.0
* This file is a part of the CaosDB Project.
*
* Copyright (C) 2018 Research Group Biomedical Physics,
* Max-Planck-Institute for Dynamics and Self-Organization Göttingen
*
* 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/>.
*
* ** end header
*/
DROP PROCEDURE IF EXISTS db_5_0.getRole;
delimiter //
CREATE PROCEDURE db_5_0.getRole(in RoleName VARCHAR(255))
BEGIN
Select e.id INTO @RoleID from entities e where e.name=RoleName AND e.role=RoleName LIMIT 1;
call retrieveEntity(@RoleID);
END;
//
delimiter ;
...@@ -4,8 +4,8 @@ ...@@ -4,8 +4,8 @@
* *
* Copyright (C) 2018 Research Group Biomedical Physics, * Copyright (C) 2018 Research Group Biomedical Physics,
* Max-Planck-Institute for Dynamics and Self-Organization Göttingen * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
* Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> * Copyright (C) 2020 - 2022 IndiScale GmbH <info@indiscale.com>
* Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale * Copyright (C) 2020 - 2022 Timm Fitschen <t.fitschen@indiscale
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as * it under the terms of the GNU Affero General Public License as
...@@ -53,6 +53,7 @@ BEGIN ...@@ -53,6 +53,7 @@ BEGIN
DECLARE Hash VARBINARY(255) DEFAULT NULL; DECLARE Hash VARBINARY(255) DEFAULT NULL;
DECLARE Version VARBINARY(255) DEFAULT NULL; DECLARE Version VARBINARY(255) DEFAULT NULL;
DECLARE Transaction VARBINARY(255) DEFAULT NULL; DECLARE Transaction VARBINARY(255) DEFAULT NULL;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
-- insert the acl. the new acl id is being written (c-style) into the -- insert the acl. the new acl id is being written (c-style) into the
-- variable NewACLID. -- variable NewACLID.
...@@ -63,6 +64,9 @@ BEGIN ...@@ -63,6 +64,9 @@ BEGIN
VALUES (EntityDesc, EntityRole, NewACLID); VALUES (EntityDesc, EntityRole, NewACLID);
-- ... and return the generated id -- ... and return the generated id
SET InternalEntityID = LAST_INSERT_ID();
INSERT INTO entity_ids (internal_id) VALUES (InternalEntityID);
SET NewEntityID = LAST_INSERT_ID(); SET NewEntityID = LAST_INSERT_ID();
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
...@@ -77,7 +81,7 @@ BEGIN ...@@ -77,7 +81,7 @@ BEGIN
IF EntityName IS NOT NULL THEN IF EntityName IS NOT NULL THEN
INSERT INTO name_data INSERT INTO name_data
(domain_id, entity_id, property_id, value, status, pidx) (domain_id, entity_id, property_id, value, status, pidx)
VALUES (0, NewEntityID, 20, EntityName, "FIX", 0); VALUES (0, InternalEntityID, 20, EntityName, "FIX", 0);
END IF; END IF;
SELECT NewEntityID as EntityID, Version as Version; SELECT NewEntityID as EntityID, Version as Version;
......
DROP PROCEDURE IF EXISTS db_5_0.insertEntityDataType;
DELIMITER //
CREATE PROCEDURE db_5_0.insertEntityDataType(in PropertyID INT UNSIGNED, in DataType VARCHAR(255))
BEGIN
DECLARE InternalPropertyID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalPropertyID FROM entity_ids WHERE id=PropertyID;
INSERT INTO data_type (domain_id, entity_id, property_id, datatype) SELECT 0, 0, InternalPropertyID, ( SELECT entity_id FROM name_data WHERE domain_id = 0 AND property_id = 20 AND value = DataType LIMIT 1);
END;
//
DELIMITER ;
DROP PROCEDURE IF EXISTS db_5_0.insertEntityCollection;
DELIMITER //
CREATE PROCEDURE db_5_0.insertEntityCollection(in PropertyID INT UNSIGNED, in Collection VARCHAR(255))
BEGIN
DECLARE InternalPropertyID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalPropertyID FROM entity_ids WHERE id=PropertyID;
INSERT INTO collection_type (domain_id, entity_id, property_id, collection) SELECT 0, 0, InternalPropertyID, Collection;
END;
//
DELIMITER ;
...@@ -42,89 +42,100 @@ BEGIN ...@@ -42,89 +42,100 @@ BEGIN
DECLARE ReferenceValueIVersion INT UNSIGNED DEFAULT NULL; DECLARE ReferenceValueIVersion INT UNSIGNED DEFAULT NULL;
DECLARE ReferenceValue INT UNSIGNED DEFAULT NULL; DECLARE ReferenceValue INT UNSIGNED DEFAULT NULL;
DECLARE AT_PRESENT INTEGER DEFAULT NULL; DECLARE AT_PRESENT INTEGER DEFAULT NULL;
DECLARE InternalDataTypeID INT UNSIGNED DEFAULT NULL;
DECLARE InternalPropertyID INT UNSIGNED DEFAULT NULL;
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
DECLARE InternalDomainID INT UNSIGNED DEFAULT 0;
SELECT internal_id INTO InternalDomainID from entity_ids WHERE id = DomainID;
SELECT internal_id INTO InternalEntityID from entity_ids WHERE id = EntityID;
SELECT internal_id INTO InternalPropertyID from entity_ids WHERE id = PropertyID;
CASE Datatable CASE Datatable
WHEN 'double_data' THEN WHEN 'double_data' THEN
INSERT INTO double_data INSERT INTO double_data
(domain_id, entity_id, property_id, value, unit_sig, status, pidx) (domain_id, entity_id, property_id, value, unit_sig, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyValue, PropertyUnitSig, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyValue, PropertyUnitSig, PropertyStatus, PropertyIndex);
WHEN 'integer_data' THEN WHEN 'integer_data' THEN
INSERT INTO integer_data INSERT INTO integer_data
(domain_id, entity_id, property_id, value, unit_sig, status, pidx) (domain_id, entity_id, property_id, value, unit_sig, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyValue, PropertyUnitSig, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyValue, PropertyUnitSig, PropertyStatus, PropertyIndex);
WHEN 'datetime_data' THEN WHEN 'datetime_data' THEN
INSERT INTO datetime_data INSERT INTO datetime_data
(domain_id, entity_id, property_id, value, value_ns, status, pidx) (domain_id, entity_id, property_id, value, value_ns, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, SUBSTRING_INDEX(PropertyValue, 'UTC', 1), IF(SUBSTRING_INDEX(PropertyValue, 'UTC', -1)='',NULL,SUBSTRING_INDEX(PropertyValue, 'UTC', -1)), PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, SUBSTRING_INDEX(PropertyValue, 'UTC', 1), IF(SUBSTRING_INDEX(PropertyValue, 'UTC', -1)='',NULL,SUBSTRING_INDEX(PropertyValue, 'UTC', -1)), PropertyStatus, PropertyIndex);
WHEN 'reference_data' THEN WHEN 'reference_data' THEN
-- special handling if versioning enabled and specific version of referenced entity is given. -- special handling if versioning enabled and specific version of referenced entity is given.
SET AT_PRESENT=LOCATE("@", PropertyValue); SET AT_PRESENT=LOCATE("@", PropertyValue);
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") AND AT_PRESENT > 0 THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") AND AT_PRESENT > 0 THEN
SET ReferenceValue = SUBSTRING_INDEX(PropertyValue, '@', 1); SELECT internal_id INTO ReferenceValue FROM entity_ids WHERE id = SUBSTRING_INDEX(PropertyValue, '@', 1);
SET ReferenceValueIVersion = get_iversion(ReferenceValue, SET ReferenceValueIVersion = get_iversion(ReferenceValue,
SUBSTRING_INDEX(PropertyValue, '@', -1)); SUBSTRING_INDEX(PropertyValue, '@', -1));
-- TODO raise error when @ present but iversion is null
IF ReferenceValueIVersion IS NULL THEN IF ReferenceValueIVersion IS NULL THEN
-- Raise error when @ present but iversion is null
SELECT 0 from `ReferenceValueIVersion_WAS_NULL`; SELECT 0 from `ReferenceValueIVersion_WAS_NULL`;
END IF; END IF;
ELSE ELSE
SET ReferenceValue = PropertyValue; SELECT internal_id INTO ReferenceValue FROM entity_ids WHERE id = PropertyValue;
END IF; END IF;
INSERT INTO reference_data INSERT INTO reference_data
(domain_id, entity_id, property_id, value, value_iversion, status, (domain_id, entity_id, property_id, value, value_iversion, status,
pidx) pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, ReferenceValue, (InternalDomainID, InternalEntityID, InternalPropertyID, ReferenceValue,
ReferenceValueIVersion, PropertyStatus, PropertyIndex); ReferenceValueIVersion, PropertyStatus, PropertyIndex);
WHEN 'enum_data' THEN WHEN 'enum_data' THEN
INSERT INTO enum_data INSERT INTO enum_data
(domain_id, entity_id, property_id, value, status, pidx) (domain_id, entity_id, property_id, value, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyValue, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyValue, PropertyStatus, PropertyIndex);
WHEN 'date_data' THEN WHEN 'date_data' THEN
INSERT INTO date_data INSERT INTO date_data
(domain_id, entity_id, property_id, value, status, pidx) (domain_id, entity_id, property_id, value, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, SUBSTRING_INDEX(PropertyValue, '.', 1), PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, SUBSTRING_INDEX(PropertyValue, '.', 1), PropertyStatus, PropertyIndex);
WHEN 'text_data' THEN WHEN 'text_data' THEN
INSERT INTO text_data INSERT INTO text_data
(domain_id, entity_id, property_id, value, status, pidx) (domain_id, entity_id, property_id, value, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyValue, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyValue, PropertyStatus, PropertyIndex);
WHEN 'null_data' THEN WHEN 'null_data' THEN
INSERT INTO null_data INSERT INTO null_data
(domain_id, entity_id, property_id, status, pidx) (domain_id, entity_id, property_id, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyStatus, PropertyIndex);
WHEN 'name_data' THEN WHEN 'name_data' THEN
INSERT INTO name_data INSERT INTO name_data
(domain_id, entity_id, property_id, value, status, pidx) (domain_id, entity_id, property_id, value, status, pidx)
VALUES VALUES
(DomainID, EntityID, PropertyID, PropertyValue, PropertyStatus, PropertyIndex); (InternalDomainID, InternalEntityID, InternalPropertyID, PropertyValue, PropertyStatus, PropertyIndex);
ELSE ELSE
-- raise error
SELECT * FROM table_does_not_exist; SELECT * FROM table_does_not_exist;
END CASE; END CASE;
IF DatatypeOverride IS NOT NULL THEN IF DatatypeOverride IS NOT NULL THEN
call overrideType(DomainID, EntityID, PropertyID, DatatypeOverride); SELECT internal_id INTO InternalDataTypeID from entity_ids WHERE id = DatatypeOverride;
call overrideType(InternalDomainID, InternalEntityID, InternalPropertyID, InternalDataTypeID);
IF Collection IS NOT NULL THEN IF Collection IS NOT NULL THEN
INSERT INTO collection_type (domain_id, entity_id, property_id, collection) VALUES (DomainID, EntityID, PropertyID, Collection); INSERT INTO collection_type (domain_id, entity_id, property_id, collection) VALUES (InternalDomainID, InternalEntityID, InternalPropertyID, Collection);
END IF; END IF;
END IF; END IF;
IF NameOverride IS NOT NULL THEN IF NameOverride IS NOT NULL THEN
call overrideName(DomainID, EntityID, PropertyID, NameOverride); call overrideName(InternalDomainID, InternalEntityID, InternalPropertyID, NameOverride);
END IF; END IF;
IF DescOverride IS NOT NULL THEN IF DescOverride IS NOT NULL THEN
call overrideDesc(DomainID, EntityID, PropertyID, DescOverride); call overrideDesc(InternalDomainID, InternalEntityID, InternalPropertyID, DescOverride);
END IF; END IF;
END; END;
......
DROP PROCEDURE IF EXISTS db_5_0.insertFile;
DELIMITER //
CREATE PROCEDURE db_5_0.insertFile(in EntityID INT UNSIGNED, in Hash VARCHAR(255), in FileSize BIGINT UNSIGNED, in FilePath VARCHAR(255))
BEGIN
DECLARE InternalEntityID INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO InternalEntityID FROM entity_ids WHERE id=EntityID;
INSERT INTO files (file_id, hash, size, path) VALUES (InternalEntityID, unhex(Hash), FileSize, FilePath);
END;
//
DELIMITER ;
...@@ -33,15 +33,21 @@ DELIMITER // ...@@ -33,15 +33,21 @@ DELIMITER //
* Parameters * Parameters
* ========== * ==========
* *
* c : UNSIGNED * ChildID : UNSIGNED
* The child entity * The child entity
* *
* p : UNSIGNED * ParentID : UNSIGNED
* The parent entity * The parent entity
*/ */
CREATE PROCEDURE db_5_0.insertIsa(IN c INT UNSIGNED, IN p INT UNSIGNED) CREATE PROCEDURE db_5_0.insertIsa(IN ChildID INT UNSIGNED, IN ParentID INT UNSIGNED)
insert_is_a_proc: BEGIN insert_is_a_proc: BEGIN
DECLARE c INT UNSIGNED DEFAULT NULL;
DECLARE p INT UNSIGNED DEFAULT NULL;
SELECT internal_id INTO c FROM entity_ids WHERE id = ChildID;
SELECT internal_id INTO p FROM entity_ids WHERE id = ParentID;
INSERT INTO isa_cache (child, parent, rpath) VALUES (c, p, c); INSERT INTO isa_cache (child, parent, rpath) VALUES (c, p, c);
IF p = c THEN IF p = c THEN
...@@ -69,17 +75,17 @@ insert_is_a_proc: BEGIN ...@@ -69,17 +75,17 @@ insert_is_a_proc: BEGIN
INSERT IGNORE INTO isa_cache SELECT INSERT IGNORE INTO isa_cache SELECT
l.child, -- Descendant as found in isa_cache l.child, -- Descendant as found in isa_cache
r.parent, -- Ancestor as found in isa_cache r.parent, -- Ancestor as found in isa_cache
if(l.rpath=l.child and r.rpath=c, -- if distance=1 for left and right: IF(l.rpath=l.child AND r.rpath=c, -- if distance=1 for left and right:
c, -- rpath = current child c, -- rpath = current child
concat(if(l.rpath=l.child, -- if dist=1 for descendant: concat(IF(l.rpath=l.child, -- if dist=1 for descendant:
c, -- rpath starts with c c, -- rpath starts with c
concat(l.rpath, '>', c)), -- rpath starts with "desc.rpath > c" concat(l.rpath, '>', c)), -- rpath starts with "desc.rpath > c"
if(r.rpath=c, -- if dist=1 for ancestor IF(r.rpath=c, -- if dist=1 for ancestor
'', -- rpath is finished '', -- rpath is finished
concat('>', r.rpath)))) -- rpath continuees with " > ancest.rpath" concat('>', r.rpath)))) -- rpath continuees with " > ancest.rpath"
AS rpath AS rpath
FROM FROM
isa_cache as l INNER JOIN isa_cache as r isa_cache AS l INNER JOIN isa_cache AS r
ON (l.parent = c AND c = r.child AND l.child != l.parent); -- Left: descendants of c, right: ancestors ON (l.parent = c AND c = r.child AND l.child != l.parent); -- Left: descendants of c, right: ancestors
END; END;
......
...@@ -25,9 +25,15 @@ ...@@ -25,9 +25,15 @@
DROP PROCEDURE IF EXISTS db_5_0.isSubtype; DROP PROCEDURE IF EXISTS db_5_0.isSubtype;
delimiter // delimiter //
CREATE PROCEDURE db_5_0.isSubtype(in c INT UNSIGNED, in p INT UNSIGNED) CREATE PROCEDURE db_5_0.isSubtype(in ChildID INT UNSIGNED, in ParentID INT UNSIGNED)
BEGIN BEGIN
DECLARE c INT UNSIGNED DEFAULT NULL;
DECLARE p INT UNSIGNED DEFAULT NULL;
DECLARE ret BOOLEAN DEFAULT FALSE; DECLARE ret BOOLEAN DEFAULT FALSE;
SELECT internal_id INTO c from entity_ids WHERE id = ChildID;
SELECT internal_id INTO p from entity_ids WHERE id = ParentID;
SELECT TRUE INTO ret FROM isa_cache AS i WHERE i.child=c AND i.parent=p LIMIT 1; SELECT TRUE INTO ret FROM isa_cache AS i WHERE i.child=c AND i.parent=p LIMIT 1;
SELECT ret as ISA; SELECT ret as ISA;
END; END;
......
...@@ -26,21 +26,70 @@ DROP PROCEDURE IF EXISTS db_5_0.overrideDesc; ...@@ -26,21 +26,70 @@ DROP PROCEDURE IF EXISTS db_5_0.overrideDesc;
DROP PROCEDURE IF EXISTS db_5_0.overrideType; DROP PROCEDURE IF EXISTS db_5_0.overrideType;
DELIMITER // DELIMITER //
CREATE PROCEDURE db_5_0.overrideName(in DomainID INT UNSIGNED, in EntityID INT UNSIGNED, in PropertyID INT UNSIGNED, in Name VARCHAR(255)) /* Insert a name override.
Parameters
==========
InternalDomainID : INT UNSIGNED
The *internal* id of the domain.
InternalEntityID : INT UNSIGNED
The *internal* id of the entity.
InternalPropertyID : INT UNSIGNED
The *internal* id of the property.
Name : VARCHAR(255)
*/
CREATE PROCEDURE db_5_0.overrideName(in InternalDomainID INT UNSIGNED, in InternalEntityID INT UNSIGNED, in InternalPropertyID INT UNSIGNED, in Name VARCHAR(255))
BEGIN BEGIN
INSERT INTO name_overrides (domain_id, entity_id, property_id, name) VALUES (DomainID, EntityID, PropertyID, Name); INSERT INTO name_overrides (domain_id, entity_id, property_id, name) VALUES (InternalDomainID, InternalEntityID, InternalPropertyID, Name);
END; END;
// //
CREATE PROCEDURE db_5_0.overrideDesc(in DomainID INT UNSIGNED, in EntityID INT UNSIGNED, in PropertyID INT UNSIGNED, in Description TEXT) /* Insert a description override.
Parameters
==========
InternalDomainID : INT UNSIGNED
The *internal* id of the domain.
InternalEntityID : INT UNSIGNED
The *internal* id of the entity.
InternalPropertyID : INT UNSIGNED
The *internal* id of the property.
Description : TEXT
*/
CREATE PROCEDURE db_5_0.overrideDesc(in InternalDomainID INT UNSIGNED, in InternalEntityID INT UNSIGNED, in InternalPropertyID INT UNSIGNED, in Description TEXT)
BEGIN BEGIN
INSERT INTO desc_overrides (domain_id, entity_id, property_id, description) VALUES (DomainID, EntityID, PropertyID, Description); INSERT INTO desc_overrides (domain_id, entity_id, property_id, description) VALUES (InternalDomainID, InternalEntityID, InternalPropertyID, Description);
END; END;
// //
CREATE PROCEDURE db_5_0.overrideType(in DomainID INT UNSIGNED, in EntityID INT UNSIGNED, in PropertyID INT UNSIGNED, in Datatype INT UNSIGNED) /* Insert a data type override.
Parameters
==========
InternalDomainID : INT UNSIGNED
The *internal* id of the domain.
InternalEntityID : INT UNSIGNED
The *internal* id of the entity.
InternalPropertyID : INT UNSIGNED
The *internal* id of the property.
InternalDatatypeID : INT UNSIGNED
The *internal* id of the data type.
*/
CREATE PROCEDURE db_5_0.overrideType(in InternalDomainID INT UNSIGNED, in InternalEntityID INT UNSIGNED, in InternalPropertyID INT UNSIGNED, in InternalDataTypeID INT UNSIGNED)
BEGIN BEGIN
INSERT INTO data_type (domain_id, entity_id, property_id, datatype) VALUES (DomainID, EntityID, PropertyID, Datatype); INSERT INTO data_type (domain_id, entity_id, property_id, datatype) VALUES (InternalDomainID, InternalEntityID, InternalPropertyID, InternalDataTypeID);
END; END;
// //
......
...@@ -34,16 +34,20 @@ delimiter // ...@@ -34,16 +34,20 @@ delimiter //
CREATE PROCEDURE db_5_0.registerSubdomain(in amount INT UNSIGNED) CREATE PROCEDURE db_5_0.registerSubdomain(in amount INT UNSIGNED)
BEGIN BEGIN
DECLARE ED INTEGER DEFAULT NULL; DECLARE ED INTEGER DEFAULT NULL;
DECLARE NewID INT UNSIGNED DEFAULT NULL;
SELECT COUNT(id) INTO ED FROM entities WHERE Role='DOMAIN' AND id!=0; SELECT COUNT(id) INTO ED FROM entities WHERE Role='DOMAIN' AND id!=0;
WHILE ED < amount DO WHILE ED < amount DO
INSERT INTO entities (description, role, acl) VALUES INSERT INTO entities (description, role, acl) VALUES
(NULL, 'DOMAIN', 0); (NULL, 'DOMAIN', 0);
SET NewID = LAST_INSERT_ID();
INSERT INTO entity_ids (internal_id) VALUES (NewID);
SET ED = ED + 1; SET ED = ED + 1;
END WHILE; END WHILE;
SELECT id as DomainID FROM entities WHERE Role='DOMAIN' and id!=0; SELECT e.id as DomainID FROM entities AS i LEFT JOIN entity_ids AS e ON e.internal_id = i.id WHERE i.Role='DOMAIN' and e.internal_id!=0;
END; END;
// //
......
...@@ -72,10 +72,10 @@ retrieveEntityBody: BEGIN ...@@ -72,10 +72,10 @@ retrieveEntityBody: BEGIN
IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN IF is_feature_config("ENTITY_VERSIONING", "ENABLED") THEN
-- Find out head-ness and version -- Find out head-ness and version
IF Version IS NULL OR UPPER(Version) = "HEAD" THEN IF Version IS NULL OR UPPER(Version) = "HEAD" THEN
SET Version = get_head_version(InternalEntityID); SET Version = get_head_version(EntityID);
ELSEIF UPPER(LEFT(Version, 5)) = "HEAD~" THEN ELSEIF UPPER(LEFT(Version, 5)) = "HEAD~" THEN
SET IsHead = FALSE; SET IsHead = FALSE;
SET Version = get_head_relative(InternalEntityID, SUBSTR(Version, 6)); SET Version = get_head_relative(EntityID, SUBSTR(Version, 6));
ELSE ELSE
SELECT get_head_version(InternalEntityID) = Version INTO IsHead; SELECT get_head_version(InternalEntityID) = Version INTO IsHead;
END IF; END IF;
...@@ -155,11 +155,13 @@ retrieveEntityBody: BEGIN ...@@ -155,11 +155,13 @@ retrieveEntityBody: BEGIN
WHERE file_id = InternalEntityID WHERE file_id = InternalEntityID
LIMIT 1; LIMIT 1;
SELECT datatype INTO DatatypeID SELECT eids.id INTO DatatypeID
FROM data_type FROM data_type as dt
WHERE domain_id=0 LEFT JOIN entity_ids eids
AND entity_id=0 ON dt.datatype = eids.internal_id
AND property_id=InternalEntityID WHERE dt.domain_id=0
AND dt.entity_id=0
AND dt.property_id=InternalEntityID
LIMIT 1; LIMIT 1;
SELECT collection INTO CollectionName SELECT collection INTO CollectionName
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment