From 6d1a3b02e0e83b5e326081826fe63bcbc0ab4686 Mon Sep 17 00:00:00 2001 From: Tom Willemsen Date: Thu, 21 Mar 2013 00:54:06 +0100 Subject: Make it do something - Add constant `*version*' which contains the version number of the project. - Change `db-connect' to `check-db'. Update to using sqlite functions instead of cl-sql ones. - Move the bookmark collection loop to `get-bookmarks'. - When starting up, if the length of args is greater than 1 check if the given option is a known "command" and if so, call it with the command line arguments (minus the first). Otherwise show all the bookmarks. --- clark.lisp | 64 +++++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 45 insertions(+), 19 deletions(-) (limited to 'clark.lisp') diff --git a/clark.lisp b/clark.lisp index c233a5a..6b5d0b1 100644 --- a/clark.lisp +++ b/clark.lisp @@ -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*)) -- cgit v1.2.3-54-g00ecf