1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-08-07 14:23:53 +00:00

Introduce delete markers for deleted tiddlers

This commit is contained in:
Jeremy Ruston 2024-03-17 14:18:47 +00:00
parent 69cc45bf5c
commit dea739ff07
2 changed files with 33 additions and 15 deletions

View File

@ -68,6 +68,7 @@ SqlTiddlerDatabase.prototype.createTables = function() {
tiddler_id INTEGER PRIMARY KEY AUTOINCREMENT, tiddler_id INTEGER PRIMARY KEY AUTOINCREMENT,
bag_id INTEGER NOT NULL, bag_id INTEGER NOT NULL,
title TEXT NOT NULL, title TEXT NOT NULL,
is_deleted BOOLEAN NOT NULL,
attachment_blob TEXT, -- null or the name of an attachment blob attachment_blob TEXT, -- null or the name of an attachment blob
FOREIGN KEY (bag_id) REFERENCES bags(bag_id) ON UPDATE CASCADE ON DELETE CASCADE, FOREIGN KEY (bag_id) REFERENCES bags(bag_id) ON UPDATE CASCADE ON DELETE CASCADE,
UNIQUE (bag_id, title) UNIQUE (bag_id, title)
@ -178,10 +179,11 @@ SqlTiddlerDatabase.prototype.saveBagTiddler = function(tiddlerFields,bagname,att
attachment_blob = attachment_blob || null; attachment_blob = attachment_blob || null;
// Update the tiddlers table // Update the tiddlers table
var info = this.engine.runStatement(` var info = this.engine.runStatement(`
INSERT OR REPLACE INTO tiddlers (bag_id, title, attachment_blob) INSERT OR REPLACE INTO tiddlers (bag_id, title, is_deleted, attachment_blob)
VALUES ( VALUES (
(SELECT bag_id FROM bags WHERE bag_name = $bag_name), (SELECT bag_id FROM bags WHERE bag_name = $bag_name),
$title, $title,
FALSE,
$attachment_blob $attachment_blob
) )
`,{ `,{
@ -251,7 +253,7 @@ SqlTiddlerDatabase.prototype.saveRecipeTiddler = function(tiddlerFields,recipena
}; };
SqlTiddlerDatabase.prototype.deleteTiddler = function(title,bagname) { SqlTiddlerDatabase.prototype.deleteTiddler = function(title,bagname) {
// Run the queries // Delete the fields of this tiddler
this.engine.runStatement(` this.engine.runStatement(`
DELETE FROM fields DELETE FROM fields
WHERE tiddler_id IN ( WHERE tiddler_id IN (
@ -264,13 +266,15 @@ SqlTiddlerDatabase.prototype.deleteTiddler = function(title,bagname) {
$title: title, $title: title,
$bag_name: bagname $bag_name: bagname
}); });
// Mark the tiddler itself as deleted
this.engine.runStatement(` this.engine.runStatement(`
DELETE FROM tiddlers INSERT OR REPLACE INTO tiddlers (bag_id, title, is_deleted, attachment_blob)
WHERE bag_id = ( VALUES (
SELECT bag_id (SELECT bag_id FROM bags WHERE bag_name = $bag_name),
FROM bags $title,
WHERE bag_name = $bag_name TRUE,
) AND title = $title NULL
)
`,{ `,{
$title: title, $title: title,
$bag_name: bagname $bag_name: bagname
@ -285,7 +289,7 @@ SqlTiddlerDatabase.prototype.getBagTiddler = function(title,bagname) {
SELECT t.tiddler_id, t.attachment_blob SELECT t.tiddler_id, t.attachment_blob
FROM bags AS b FROM bags AS b
INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id
WHERE t.title = $title AND b.bag_name = $bag_name WHERE t.title = $title AND b.bag_name = $bag_name AND t.is_deleted = FALSE
`,{ `,{
$title: title, $title: title,
$bag_name: bagname $bag_name: bagname
@ -326,6 +330,7 @@ SqlTiddlerDatabase.prototype.getRecipeTiddler = function(title,recipename) {
INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id
WHERE r.recipe_name = $recipe_name WHERE r.recipe_name = $recipe_name
AND t.title = $title AND t.title = $title
AND t.is_deleted = FALSE
ORDER BY rb.position DESC ORDER BY rb.position DESC
LIMIT 1 LIMIT 1
`,{ `,{
@ -366,6 +371,7 @@ SqlTiddlerDatabase.prototype.getBagTiddlers = function(bagname) {
FROM bags FROM bags
WHERE bag_name = $bag_name WHERE bag_name = $bag_name
) )
AND tiddlers.is_deleted = FALSE
ORDER BY title ASC ORDER BY title ASC
`,{ `,{
$bag_name: bagname $bag_name: bagname
@ -394,6 +400,7 @@ SqlTiddlerDatabase.prototype.getRecipeTiddlers = function(recipename) {
INNER JOIN recipes AS r ON rb.recipe_id = r.recipe_id INNER JOIN recipes AS r ON rb.recipe_id = r.recipe_id
INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id INNER JOIN tiddlers AS t ON b.bag_id = t.bag_id
WHERE r.recipe_name = $recipe_name WHERE r.recipe_name = $recipe_name
AND t.is_deleted = FALSE
GROUP BY t.title GROUP BY t.title
ORDER BY t.title ORDER BY t.title
) )
@ -404,16 +411,27 @@ SqlTiddlerDatabase.prototype.getRecipeTiddlers = function(recipename) {
}; };
SqlTiddlerDatabase.prototype.deleteAllTiddlersInBag = function(bagname) { SqlTiddlerDatabase.prototype.deleteAllTiddlersInBag = function(bagname) {
// Delete the fields
this.engine.runStatement(` this.engine.runStatement(`
DELETE FROM tiddlers DELETE FROM fields
WHERE bag_id IN ( WHERE tiddler_id IN (
SELECT bag_id SELECT tiddler_id
FROM bags FROM tiddlers
WHERE bag_name = $bag_name WHERE bag_id = (SELECT bag_id FROM bags WHERE bag_name = $bag_name)
AND is_deleted = FALSE
) )
`,{ `,{
$bag_name: bagname $bag_name: bagname
}); });
// Mark the tiddlers as deleted
this.engine.runStatement(`
UPDATE tiddlers
SET is_deleted = TRUE
WHERE bag_id = (SELECT bag_id FROM bags WHERE bag_name = $bag_name)
AND is_deleted = FALSE
`,{
$bag_name: bagname
});
}; };
/* /*

View File

@ -102,7 +102,7 @@ function runSqlDatabaseTests(engine) {
expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ { title: 'Hello There', bag_name: 'bag-alpha' } ]); expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-rho")).toEqual([ { title: 'Hello There', bag_name: 'bag-alpha' } ]);
expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ { title: 'Hello There', bag_name: 'bag-gamma' } ]); expect(sqlTiddlerDatabase.getRecipeTiddlers("recipe-sigma")).toEqual([ { title: 'Hello There', bag_name: 'bag-gamma' } ]);
// Save a recipe tiddler // Save a recipe tiddler
expect(sqlTiddlerDatabase.saveRecipeTiddler({title: "More", text: "None"},"recipe-rho")).toEqual({tiddler_id: 5, bag_name: 'bag-beta'}); expect(sqlTiddlerDatabase.saveRecipeTiddler({title: "More", text: "None"},"recipe-rho")).toEqual({tiddler_id: 7, bag_name: 'bag-beta'});
expect(sqlTiddlerDatabase.getRecipeTiddler("More","recipe-rho").tiddler).toEqual({title: "More", text: "None"}); expect(sqlTiddlerDatabase.getRecipeTiddler("More","recipe-rho").tiddler).toEqual({title: "More", text: "None"});
}); });
} }