diff --git a/linkwave.scm b/linkwave.scm index 235615b..455b0a2 100644 --- a/linkwave.scm +++ b/linkwave.scm @@ -15,19 +15,25 @@ (format #t "~a~% ~a~% ~a~% ~a~%~%" (string-no-null name) (string-no-null description) (string-no-null url) (seconds->string seconds))) +(define (add-tag name) + (execute db "INSERT INTO tag VALUES (?)" name) + (last-insert-rowid db)) + (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))) + (let ((tag-id '())) + (condition-case + (set! tag-id (first-result db "SELECT rowid FROM tag WHERE name = ?" tag)) + (exn (exn sqlite3) + (if (eq? (get-condition-property exn 'sqlite3 'status) 'done) + (set! tag-id (add-tag tag)) + (signal exn)))) (execute db "INSERT INTO bookmark_tag VALUES (?, ?)" bookmark-id tag-id))) - tags)) - #t) + tags))) (define (url-string? str) (and (> (string-length str) 7) @@ -42,7 +48,7 @@ (cond ((url-string? (car cla)) (with-transaction - db (lambda () (add-bookmark (car cla) (cadr cla) (caddr cla) (cdddr cla))))) + db (lambda () (add-bookmark (car cla) (cadr cla) (caddr cla) (cdddr cla)) #t))) (else (format #t "Unrecognized option: ~a~%" (car cla))))))