(defpackage #:clog-tools (:use #:cl #:clog) (:export clog-db-admin)) (in-package :clog-tools) (defclass app-data () ((body :accessor body :documentation "Top level access to browser window") (db-connection :accessor db-connection :initform nil :documentation "Access to database connection"))) (defun on-db-open (obj) (let* ((app (connection-data-item obj "app-data")) (win (create-gui-window obj :title "Open Database" :content "
" :width 400 :height 450))) (window-center win) (set-on-click (attach-as-child obj "odb-open") (lambda (obj) (format t "open db : ~A" (name-value obj "db-name")) (setf (db-connection app) (dbi:connect :sqlite3 :database-name (name-value obj "db-name"))) (setf (title (html-document (body app))) (format nil "CLOG DB Admin - ~A" (name-value obj "db-name"))) (window-close win))) (set-on-click (attach-as-child obj "odb-cancel") (lambda (obj) (window-close win))))) (defun on-db-close (obj) (let ((app (connection-data-item obj "app-data"))) (when (db-connection app) (dbi:disconnect (db-connection app))) (print "db disconnected") (setf (title (html-document (body app))) "CLOG DB Admin"))) (defun on-query-results (obj) (let ((app (connection-data-item obj "app-data")) (win (create-gui-window obj :title "Enter query:" :content "
" :width 400 :height 200))) (window-center win) (set-on-click (attach-as-child obj "odb-open") (lambda (obj) (format t "open query : ~A~%~%" (name-value obj "db-query")) (print (dbi:fetch-all (dbi:execute (dbi:prepare (db-connection app) (name-value obj "db-query")) ()))) ;; (let* ((query (dbi:prepare (db-connection app) (name-value obj "db-query"))) ;; (query (dbi:execute query))) ;; (loop for row = (dbi:fetch query) ;; while row ;; do (format t "~A~%" row))) (window-close win))) (set-on-click (attach-as-child obj "odb-cancel") (lambda (obj) (window-close win))))) (defun on-help-about (obj) (let ((about (create-gui-window obj :title "About" :content "
CLOG
The Common Lisp Omnificent GUI

CLOG DB Admin
(c) 2021 - David Botton

" :width 200 :height 200))) (window-center about) (set-on-window-can-size about (lambda (obj) (declare (ignore obj))())))) (defun on-new-window (body) (let ((app (make-instance 'app-data))) (setf (connection-data-item body "app-data") app) (setf (body app) body) (setf (title (html-document body)) "CLOG DB Admin") (clog-gui-initialize body) (add-class body "w3-blue-grey") (let* ((menu (create-gui-menu-bar body)) (tmp (create-gui-menu-icon menu :on-click #'on-help-about)) (file (create-gui-menu-drop-down menu :content "Database")) (tmp (create-gui-menu-item file :content "Open Connection" :on-click #'on-db-open)) (tmp (create-gui-menu-item file :content "Close Connection" :on-click #'on-db-close)) (qry (create-gui-menu-drop-down menu :content "Queries")) (tmp (create-gui-menu-item qry :content "Results Query" :on-click #'on-query-results)) (win (create-gui-menu-drop-down menu :content "Window")) (tmp (create-gui-menu-item win :content "Maximize All" :on-click #'maximize-all-windows)) (tmp (create-gui-menu-item win :content "Normalize All" :on-click #'normalize-all-windows)) (tmp (create-gui-menu-window-select win)) (help (create-gui-menu-drop-down menu :content "Help")) (tmp (create-gui-menu-item help :content "About" :on-click #'on-help-about)) (tmp (create-gui-menu-full-screen menu)))) (run body) (when (db-connection app) (dbi:disconnect (db-connection app)) (print "db disconnected")))) (defun clog-db-admin () "Start clog-db-admin." (initialize #'on-new-window) (open-browser))