diff options
-rw-r--r-- | clark.lisp | 64 | ||||
-rw-r--r-- | make-image.lisp | 2 |
2 files changed, 46 insertions, 20 deletions
@@ -5,14 +5,29 @@ (defvar *db* nil "The database connection.") -(defun db-connect (name) +(defconstant *version* "0.1.0" + "Clark's version.") + +(defun check-db (name) "Connect to the database, possibly creating it." (let ((db-exists (probe-file name))) - (connect (list name) :database-type :sqlite3) + (setf *db* (connect name)) (unless db-exists - (create-view-from-class 'bookmark) - (create-view-from-class 'tag) - (create-view-from-class 'bookmark-tag)))) + (execute-non-query *db* "CREATE TABLE bookmark (url VARCHAR(255) UNIQUE, date INTEGER, name VARCHAR(255), description TEXT)") + (execute-non-query *db* "CREATE TABLE tag (name VARCHAR(255) UNIQUE);") + (execute-non-query *db* "CREATE TABLE bookmark_tag (bookmark_id INTEGER REFERENCES bookmark(rowid), tag_id INTEGER REFERENCES tag(rowid), PRIMARY KEY (bookmark_id, tag_id))")))) + +(defun get-bookmarks () + "Get a list of all bookmarks. + +The result contains the url and the name of the bookmark." + (let ((statement + (prepare-statement *db* "select url, name from bookmark"))) + (loop + while (step-statement statement) + collect (list (statement-column-value statement 0) + (statement-column-value statement 1)) + finally (finalize-statement statement)))) (defun print-bookmark (bm) "Print information about bookmark BM. @@ -21,19 +36,30 @@ BM should be a list containing the url and name of the bookmark." (destructuring-bind (url name) bm (format t "~A~%~A~%~%" url name))) -(defun get-bookmarks () - "Get a list of all bookmarks. +(defun make-command-name (base) + "Turn BASE into the name of a possible command." + (concatenate 'string (string-upcase base) "-COMMAND")) -The result contains the url and the name of the bookmark." - (loop - with statement = (prepare-statement - *db* "select url, name from bookmark") - while (step-statement statement) - collect (list (statement-column-value statement 0) - (statement-column-value statement 1)) - finally (finalize-statement statement))) - -(defun clark () - (setf *db* (connect "test.db")) - (map nil #'print-bookmark (get-bookmarks)) +(defun help-command (args) + "Show a help message." + (format t (concatenate + 'string + "Usage: clark [command [options]...]~%" + "~%" + "Possible commands:~%" + "~%" + "help Display this help and exit~%" + "version Output version information and exit~%"))) + +(defun version-command (args) + "Display clark's version number." + (format t "clark version ~A~%" *version*)) + +(defun clark (args) + (check-db "test2.db") + (if (> (length args) 1) + (let* ((cmd-name (make-command-name (cadr args))) + (sym (intern cmd-name :org.ryuslash.clark))) + (when (fboundp sym) (funcall sym (cdr args)))) + (map nil #'print-bookmark (get-bookmarks))) (disconnect *db*)) diff --git a/make-image.lisp b/make-image.lisp index 1221037..733cb8c 100644 --- a/make-image.lisp +++ b/make-image.lisp @@ -11,6 +11,6 @@ "clark" :toplevel (lambda () (sb-posix:putenv (format nil "SBCL_HOME=~A" #.(sb-ext:posix-getenv "SBCL_HOME"))) - (org.ryuslash.clark:clark) + (org.ryuslash.clark:clark sb-ext:*posix-argv*) 0) :executable t) |