Hello,
I was bored so I wrote a quick recursion test that calculates a
Fletcher32 checksum and it works! At least I think it does, I can't
find any test vectors for Fletcher32. I realize it would be better to
implement this as an extension library, but I was using it as an
exercise to get a better feel for recursive triggers. Below is the
source code.
Enjoy,
Tom
pragma recursive_triggers=1;
DROP TABLE IF EXISTS [fletcher32];
CREATE TABLE IF NOT EXISTS [fletcher32] (
[data] blob,
[loop] integer,
[len] integer,
[pos] integer,
[sum1] integer,
[sum2] integer,
[result] integer
);
DROP TRIGGER IF EXISTS [tr_ai_fletcher32];
CREATE TRIGGER IF NOT EXISTS [tr_ai_fletcher32] AFTER INSERT ON [fletcher32]
FOR EACH ROW
BEGIN
UPDATE [fletcher32]
SET [loop] = 0,
[len] = length(new.[data]),
[pos] = 1,
[sum1] = 0,
[sum2] = 0,
[result] = 0;
END;
DROP TRIGGER IF EXISTS [tr_au_fletcher32];
CREATE TRIGGER IF NOT EXISTS [tr_au_fletcher32] AFTER UPDATE ON [fletcher32]
FOR EACH ROW
BEGIN
SELECT CASE
WHEN (new.[pos] > new.[len]) THEN RAISE(IGNORE)
END;
UPDATE [fletcher32]
SET [loop] = ifnull(new.[loop], 0) + 1,
[sum1] = CASE
WHEN (ifnull(new.[sum1], 0) + ((hex(substr(new.[data],
new.[pos], 1)) << 8) | (hex(substr(new.[data], new.[pos] + 1, 1))))) >
65535 THEN
(ifnull(new.[sum1], 0) + ((hex(substr(new.[data],
new.[pos], 1)) << 8) | (hex(substr(new.[data], new.[pos] + 1, 1))))) - 65535
ELSE ifnull(new.[sum1], 0) + ((hex(substr(new.[data],
new.[pos], 1)) << 8) | (hex(substr(new.[data], new.[pos] + 1, 1))))
END,
[sum2] = CASE
WHEN (ifnull(new.[sum2], 0) + (ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1)))))) > 65535 THEN
(ifnull(new.[sum2], 0) + (ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1)))))) - 65535
ELSE ifnull(new.[sum2], 0) + (ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1)))))
END,
[result] = CASE
WHEN (new.[len] - new.[pos] <= 2) THEN
(CASE
WHEN (ifnull(new.[sum2], 0) +
(ifnull(new.[sum1], 0) + ((hex(substr(new.[data], new.[pos], 1)) << 8) |
(hex(substr(new.[data], new.[pos] + 1, 1)))))) > 65535 THEN
(ifnull(new.[sum2], 0) + (ifnull(new.[sum1],
0) + ((hex(substr(new.[data], new.[pos], 1)) << 8) |
(hex(substr(new.[data], new.[pos] + 1, 1)))))) - 65535
ELSE ifnull(new.[sum2], 0) +
(ifnull(new.[sum1], 0) + ((hex(substr(new.[data], new.[pos], 1)) << 8) |
(hex(substr(new.[data], new.[pos] + 1, 1)))))
END << 16) |
CASE
WHEN (ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1))))) > 65535 THEN
(ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1))))) - 65535
ELSE ifnull(new.[sum1], 0) +
((hex(substr(new.[data], new.[pos], 1)) << 8) | (hex(substr(new.[data],
new.[pos] + 1, 1))))
END
ELSE 0
END,
[pos] = new.[pos] + 2
;
END;
DROP TRIGGER IF EXISTS [tr_bi_fletcher32];
CREATE TRIGGER IF NOT EXISTS [tr_bi_fletcher32] BEFORE INSERT ON
[fletcher32]
FOR EACH ROW
BEGIN
SELECT CASE
WHEN (lower(typeof(new.[data])) <> 'blob') THEN RAISE(ABORT, 'The
data must be passed as a blob.')
END;
DELETE FROM [fletcher32];
END;
INSERT INTO [fletcher32] ([data]) VALUES
(cast('abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz'
||
'abcdefghijklmnopqrstuvwxyz' as blob)); -- 4024932040
--INSERT INTO [fletcher32] ([data]) VALUES
(cast('abcdefghijklmnopqrstuvwxyz' as blob)); -- 3288453265
--INSERT INTO [fletcher32] ([data]) VALUES (cast('abcd' as blob)); --
3116137598
--INSERT INTO [fletcher32] ([data]) VALUES (cast('abc' as blob)); --
3111943230
SELECT [data], [loop], [sum1], [sum2], [result] FROM [fletcher32];
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users