diff --git a/CHANGELOG.md b/CHANGELOG.md index 87753bce3c0c3b9d9f85f1fcdb5634d1b2de656b..d79bb98bdfbd06539886f7e2583c83e4a417af43 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,5 +21,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * POV with the 'name' property, e.g. `FIND ENTITY WITH name = something` [caosdb-server#51](https://gitlab.com/caosdb/caosdb-server/-/issues/51) - Fixed several bugs when an Entity inherits from itself (#18, caosdb-server #85). +- Bug in `updateEntity.sql` (when updating the primary name without a prior call + to `deleteEntityProperties`). Same thing for `deleteEntity`. ### Security ### diff --git a/procedures/deleteEntity.sql b/procedures/deleteEntity.sql index f8d676c5750e84b43ffeec70bf95387660761116..d66a7d7c22e290935a59e944e9200d3ad5909b4e 100644 --- a/procedures/deleteEntity.sql +++ b/procedures/deleteEntity.sql @@ -41,21 +41,29 @@ delimiter // CREATE PROCEDURE db_2_0.deleteEntity(in EntityID INT UNSIGNED) BEGIN + -- detele file properties DELETE FROM files where file_id=EntityID; + -- delete datatype stuff DELETE FROM data_type WHERE ( domain_id = 0 AND entity_id = 0 AND property_id = EntityID ) OR datatype = EntityID; - DELETE FROM collection_type WHERE domain_id = 0 AND entity_id = 0 AND property_id = EntityID; - DELETE FROM entities WHERE id=EntityID; + -- delete primary name (in case this is called without a prior call to deleteEntityProperties) + DELETE FROM name_data + WHERE domain_id = 0 + AND entity_id = EntityID + AND property_id = 20; + + DELETE FROM entities where id=EntityID; + -- clean up unused acl DELETE FROM entity_acl WHERE NOT EXISTS ( SELECT 1 FROM entities diff --git a/procedures/updateEntity.sql b/procedures/updateEntity.sql index b067c251678017b3bba17fa5e4bf028e08d3f465..9bad90ab262cd1ff4b68b1384a238e424ce60825 100644 --- a/procedures/updateEntity.sql +++ b/procedures/updateEntity.sql @@ -99,8 +99,14 @@ BEGIN e.acl = ACLID WHERE e.id = EntityID; + -- clean up primary name, because updateEntity might be called without a + -- prior call to deleteEntityProperties. + DELETE FROM name_data + WHERE domain_id = 0 AND entity_id = EntityID AND property_id = 20; IF EntityName IS NOT NULL THEN - INSERT INTO name_data (domain_id, entity_id, property_id, value, status, pidx) VALUES (0, EntityID, 20, EntityName, "FIX", 0); + INSERT INTO name_data + (domain_id, entity_id, property_id, value, status, pidx) + VALUES (0, EntityID, 20, EntityName, "FIX", 0); END IF; DELETE FROM data_type diff --git a/tests/test_insert_update_delete.sql b/tests/test_insert_update_delete.sql index 8da6bfc187d5bcb562d68d2f079715ddb1ba288e..a43e0283e0852b5c0eb51b9223fc53e8da4a3fe5 100644 --- a/tests/test_insert_update_delete.sql +++ b/tests/test_insert_update_delete.sql @@ -9,30 +9,29 @@ DELETE FROM feature_config WHERE _key = "ENTITY_VERSIONING"; CALL entityACL(@ACLID1, "{acl1}"); CALL entityACL(@ACLID2, "{acl2}"); -SELECT id into @TextDatatypeID FROM entities WHERE name ="TEXT" and role="DATATYPE"; +SELECT entity_id into @TextDatatypeID FROM name_data WHERE value ="TEXT"; -- TESTS -- TEST insertEntity -SELECT COUNT(id) INTO @x FROM entities WHERE id>100; -SELECT tap.eq(@x, 0, "No entities"); +SELECT tap.eq(COUNT(id), 0, "No entities") + FROM entities WHERE id>=100; CALL insertEntity("EntityName", "EntityDesc", "RECORDTYPE", "{acl1}"); +SELECT tap.eq(COUNT(entity_id), 1, "Entity has been inserted") + FROM name_data WHERE value="EntityName"; -SELECT COUNT(id) INTO @x FROM entities WHERE name="EntityName"; -SELECT tap.eq(@x, 1, "Entity has been inserted"); - -SELECT acl INTO @x FROM entities WHERE name="EntityName"; -SELECT tap.eq(@x, @ACLID1, "correct acl id had been assigned"); +SELECT entity_id INTO @EntityID FROM name_data WHERE value="EntityName"; +SELECT tap.ok(@EntityID >= 100, "EntityID greater 99"); -SELECT id INTO @EntityID FROM entities WHERE name="EntityName"; -SELECT tap.ok(@EntityID > 100, "EntityID greater 100"); +SELECT tap.eq(acl, @ACLID1, "correct acl id had been assigned") + FROM entities WHERE id=@EntityID; -- TEST insertEntityProperty CALL insertEntity("AProperty", "APropDesc", "PROPERTY", "{acl1}"); -SELECT id INTO @PropID FROM entities WHERE name="AProperty"; +SELECT entity_id INTO @PropID FROM name_data WHERE value="AProperty"; INSERT INTO data_type (domain_id, entity_id, property_id, datatype) VALUES (0, 0, @PropID, @TextDatatypeID); SELECT COUNT(*) INTO @x FROM null_data; @@ -45,13 +44,17 @@ SELECT tap.eq(@x, 1, "One row in null_data table"); CALL updateEntity(@EntityID, "NewEntityName", "NewEntityDesc", "RECORD", NULL, NULL, "{acl2}"); -SELECT COUNT(id) INTO @x FROM entities WHERE name="EntityName"; -SELECT tap.eq(@x, 0, "Old Entity name not present"); -SELECT COUNT(id) INTO @x FROM entities WHERE name="NewEntityName"; -SELECT tap.eq(@x, 1, "Entity name has been updated"); +SELECT tap.eq(COUNT(entity_id), 0, "Old Entity name not present") + FROM name_data WHERE value="EntityName"; +SELECT tap.eq(COUNT(entity_id), 1, "Entity name has been updated") + FROM name_data WHERE value="NewEntityName"; -SELECT acl INTO @x FROM entities WHERE name="NewEntityName"; -SELECT tap.eq(@x, @ACLID2, "acl has been updated"); +SELECT tap.eq(acl, @ACLID2, "acl has been updated") + FROM entities WHERE id=@EntityID; + +-- CALL updateEntity again an update the Name +CALL updateEntity(@EntityID, "NewerEntityName", "NewerEntityDesc", "RECORD", NULL, NULL, "{acl2}"); +CALL updateEntity(@EntityID, "NewEntityName", "NewEntityDesc", "RECORD", NULL, NULL, "{acl2}"); -- TEST deleteEntityProperties