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

Reply via email to