[Digikam-devel] documentation for database scheme

Francesco Riosa francesco at pnpitalia.it
Thu May 3 01:43:31 BST 2012


Il 01/05/2012 13:54, Markus Leuthold ha scritto:
>>> What is the meaning of the new colums Tags.lft and Tags.rgt?
>>
>> used to build the tree of tags, see
>> http://www.sitepoint.com/hierarchical-data-database-2/
>>
>> Regards,
>> Francesco
>
> Thanks for the link, really helpful! Well, it looks like I messed up my
> hierarchical data structure in Tags. lft and rgt of the parent "City" doesn't
> include all children "Paris" "Athens" anymore. Is it possible to recalculate
> the lft and rgt colums from the Tags table?
>
> thanks for your help!
> Kusi

the field `pid` kinda duplicate the tree structure pointing at the 
parent tag, but I've no magic sql to do that, one solution would be to:
1) close digikam
2) backup database
3) check the backup
4) check again
5) drop Tags table
6) start digikam and close it shortly after
7) don't check the backup now, if it's gone it's gone
8) populate the newly created table `Tags` with the ones in the backup 
table _keeping_ the ids, the dbaction is "InsertTag", copyed below
9) check ImageTags, TagProperties, ImageTagProperties for any mess, 
compare also with backupped ones
10) start digikam

DO _NOT_ EXECUTE THESE QUERYES IN PHPMYADMIN OR ANY OTHER WEB CLIENT, 
@VARIABLES ARE LIMITED TO CURRENT CONNECTION AND GENERALLY 
APACHE/PHP/PMA MAY USE MULTIPLE ONES FOR DIFFERENT QUERIES EVEN IN THE 
SAME TEXTBOX.

Keep in mind that there should be a root tag "_Digikam_root_tag_" 
created by the following SQLs:

SELECT
  @minLeft := IF(ISNULL(MIN(lft)), 1, MIN(lft)-1),
  @maxRight := IF(ISNULL(MAX(rgt)), 2, MAX(rgt)+1)
FROM Tags
WHERE id >= 0 AND pid>=0;

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO';

INSERT INTO Tags
  (id, pid, name, icon, iconkde, lft, rgt)
VALUES
(0, -1, '_Digikam_root_tag_', 0, NULL, @minLeft, @maxRight )

here is the query to insert the tags:
<dbaction name="InsertTag" mode="transaction">
  <statement mode="plain">LOCK TABLE Tags WRITE;</statement>
  <statement mode="query">SELECT @myLeft := lft FROM Tags WHERE id = 
:tagPID;</statement>
  <statement mode="query">SELECT @myLeft := IF (@myLeft is null, 0, 
@myLeft);</statement>
  <statement mode="query">UPDATE Tags SET rgt = rgt + 2 WHERE rgt > 
@myLeft;</statement>
  <statement mode="query">UPDATE Tags SET lft = lft + 2 WHERE lft > 
@myLeft;</statement>
  <statement mode="query">INSERT INTO Tags(name, pid, lft, rgt) 
VALUES(:tagname, :tagPID, @myLeft + 1, @myLeft + 2);</statement>
  <statement mode="plain">UNLOCK TABLES;</statement>
</dbaction>

Regards,
Francesco



More information about the Digikam-devel mailing list