EQL5/examples/M-modules/sql/sqlite.lisp

58 lines
1.9 KiB
Common Lisp

#-qt-wrapper-functions ; see README-OPTIONAL.txt
(load (in-home "src/lisp/all-wrappers"))
(in-package :eql-user)
(setf *break-on-errors* t)
(qrequire :sql)
(defvar *database* (|addDatabase.QSqlDatabase| "QSQLITE"))
(defvar *table-view* (qnew "QTableView"
"windowTitle" "sqlite"))
(defun populate-db ()
(x:do-with (|exec| *database*)
"CREATE TABLE friends ( id INT PRIMARY KEY, name VARCHAR(50), country INT )"
"CREATE TABLE countries ( id INT PRIMARY KEY, country VARCHAR(50) )")
;; dumb, just for this example; you normally want QSqlQuery
(mapc (lambda (id name country)
(|exec| *database*
(format nil "INSERT INTO friends VALUES (~A, '~A', ~A)" id name country)))
(list 1 2 3)
(list "Pascal" "Valentina" "Rachel")
(list 10 20 30))
(mapc (lambda (id name)
(|exec| *database*
(format nil "INSERT INTO countries VALUES (~A, '~A')" id name)))
(list 10 20 30)
(list "France" "Italia" "USA")))
(defun ini ()
(|setDatabaseName| *database* ":memory:")
(if (|open| *database*)
(progn
(populate-db)
(let ((model (qnew "QSqlRelationalTableModel")))
(x:do-with model
(|setTable| "friends")
(|setRelation| 2 (qnew "QSqlRelation(QString...)" "countries" "id" "country"))
(|select|))
(x:do-with *table-view*
(|setModel| model)
(|setItemDelegate| (qnew "QSqlRelationalDelegate"))
(|resizeColumnsToContents|)
(|show|))))
(|critical.QMessageBox| nil "EQL" (tr "Could not open database."))))
(defun cell-string (row column)
(|toString| (|data| (|index| (|model| *table-view*)
row column))))
(defun selected-cells ()
(mapcar (lambda (index)
(cons (|row| index)
(|column| index)))
(|selectedIndexes| (|selectionModel| *table-view*))))
(ini)