Tom Willemsen
908bbc3cfb
During testing it was discovered that the `first-result' procedure throws an exception, which left the database in a somewhat inconsistent state, the bookmark had been added, but (at least one of) the tags weren't added. This should make it all succeed or all fail.
49 lines
1.7 KiB
Scheme
49 lines
1.7 KiB
Scheme
(declare (uses paths))
|
|
|
|
(require-extension sqlite3)
|
|
(require-library posix srfi-4)
|
|
|
|
(: string-no-null (string -> string))
|
|
(define (string-no-null str)
|
|
(if (and (> (string-length str) 0)
|
|
(char=? (string-ref str (- (string-length str) 1)) #\nul))
|
|
(substring str 0 (- (string-length str) 1))
|
|
str))
|
|
|
|
(: print-row (string fixnum string string -> void))
|
|
(define (print-row url seconds name description)
|
|
(format #t "~a~% ~a~% ~a~% ~a~%~%" (string-no-null name) (string-no-null description)
|
|
(string-no-null url) (seconds->string seconds)))
|
|
|
|
(define (add-bookmark url name description tags)
|
|
(execute db "INSERT INTO bookmark VALUES (?, STRFTIME('%s'), ?, ?)"
|
|
url name description)
|
|
(let ((bookmark-id (last-insert-rowid db)))
|
|
(for-each (lambda (tag)
|
|
(let ((tag-id (first-result db "SELECT rowid FROM tag WHERE name = ?" tag)))
|
|
(unless tag-id
|
|
(execute db "INSERT INTO tag VALUES (?)" tag)
|
|
(set! tag-id (last-insert-rowid db)))
|
|
(execute db "INSERT INTO bookmark_tag VALUES (?, ?)"
|
|
bookmark-id tag-id)))
|
|
tags))
|
|
#t)
|
|
|
|
(define (url-string? str)
|
|
(and (> (string-length str) 7)
|
|
(or (string= (substring str 0 7) "http://")
|
|
(string= (substring str 0 8) "https://"))))
|
|
|
|
(define db (open-database (data-file "linkwave.db")))
|
|
|
|
(let ((cla (command-line-arguments)))
|
|
(if (null? cla)
|
|
(for-each-row print-row db "select * from bookmark")
|
|
(cond
|
|
((url-string? (car cla))
|
|
(with-transaction
|
|
db (lambda () (add-bookmark (car cla) (cadr cla) (caddr cla) (cdddr cla)))))
|
|
(else
|
|
(format #t "Unrecognized option: ~a~%" (car cla))))))
|
|
|
|
(finalize! db #t)
|