From ac2f065f9bbd12e9ffd9b60bf91a436129038263 Mon Sep 17 00:00:00 2001
From: Přemysl Eric Janouch <p@janouch.name>
Date: Sat, 9 Dec 2023 07:57:51 +0100
Subject: Maintain directories in a hierarchy

---
 initialize.sql | 30 +++++++++++++++++++++---------
 1 file changed, 21 insertions(+), 9 deletions(-)

(limited to 'initialize.sql')

diff --git a/initialize.sql b/initialize.sql
index cb4e3a7..0f43af5 100644
--- a/initialize.sql
+++ b/initialize.sql
@@ -1,23 +1,35 @@
 CREATE TABLE IF NOT EXISTS image(
-	sha1     TEXT NOT NULL,     -- SHA-1 hash of file in lowercase hexadecimal
-	thumbw   INTEGER,           -- cached thumbnail width, if known
-	thumbh   INTEGER,           -- cached thumbnail height, if known
-	dhash    INTEGER,           -- uint64 perceptual hash as a signed integer
+	sha1     TEXT NOT NULL,  -- SHA-1 hash of file in lowercase hexadecimal
+	thumbw   INTEGER,        -- cached thumbnail width, if known
+	thumbh   INTEGER,        -- cached thumbnail height, if known
+	dhash    INTEGER,        -- uint64 perceptual hash as a signed integer
 	PRIMARY KEY (sha1)
 ) STRICT;
 
 CREATE INDEX IF NOT EXISTS image_dhash ON image(dhash, sha1);
 
--- XXX: The directory hierarchy should be perhaps kept normalized.
+--
+
+CREATE TABLE IF NOT EXISTS directory(
+	id       INTEGER NOT NULL,                  -- unique ID
+	name     TEXT NOT NULL,                     -- basename
+	parent   INTEGER REFERENCES directory(id),  -- root if NULL
+	PRIMARY KEY (id)
+) STRICT;
+
+CREATE UNIQUE INDEX IF NOT EXISTS directory_parent ON directory(parent, name);
+
 CREATE TABLE IF NOT EXISTS entry(
-	path     TEXT NOT NULL,     -- full FS directory path
-	basename TEXT NOT NULL,     -- last FS path component
+	parent   INTEGER REFERENCES directory(id),
+	name     TEXT NOT NULL,     -- last FS path component
 	mtime    INTEGER NOT NULL,  -- Unix time of last modification in seconds
 	sha1     TEXT NOT NULL REFERENCES image(sha1),
-	PRIMARY KEY (path, basename)
+	PRIMARY KEY (parent, name)
 ) STRICT;
 
-CREATE INDEX IF NOT EXISTS entry_sha1 ON entry(sha1, path, basename);
+CREATE INDEX IF NOT EXISTS entry_sha1 ON entry(sha1, parent, name);
+
+--
 
 CREATE TABLE IF NOT EXISTS image_tag(
 	sha1     TEXT NOT NULL REFERENCES image(sha1),
-- 
cgit v1.2.3-70-g09d2

