(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-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 '())) (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))) (define (url-string? str) (and (> (string-length str) 7) (or (string= (substring str 0 7) "http://") (string= (substring str 0 8) "https://")))) (define (main args) (if (null? args) (for-each-row print-row db "select * from bookmark") (cond ((url-string? (car args)) (with-transaction db (lambda () (add-bookmark (car args) (cadr args) (caddr args) (cdddr args)) #t))) (else (format #t "Unrecognized option: ~a~%" (car args)))))) (define db (open-database (data-file "linkwave.db"))) (main (command-line-arguments)) (finalize! db #t)