aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Tom Willemsen2013-03-21 00:54:06 +0100
committerGravatar Tom Willemsen2013-03-21 00:54:06 +0100
commit6d1a3b02e0e83b5e326081826fe63bcbc0ab4686 (patch)
treed03fd22b2c5b699aae1cc22882c3724f9a6cd2d1
parent940d9904189cab365787d3b18d5a26df427d80f1 (diff)
downloadclark-6d1a3b02e0e83b5e326081826fe63bcbc0ab4686.tar.gz
clark-6d1a3b02e0e83b5e326081826fe63bcbc0ab4686.zip
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.
-rw-r--r--clark.lisp64
-rw-r--r--make-image.lisp2
2 files changed, 46 insertions, 20 deletions
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*))
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)