example 'meshtastic': review & fix DB message storage

This commit is contained in:
pls.153 2024-02-24 22:23:34 +01:00
parent 95c8fcd8c0
commit 4a9434d7ea
5 changed files with 27 additions and 25 deletions

View file

@ -11,11 +11,12 @@
(setf *file* (app:in-data-path "db")) (setf *file* (app:in-data-path "db"))
(ensure-directories-exist *file*) (ensure-directories-exist *file*)
(qt:ini-db qt:*cpp* (namestring *file*)) (qt:ini-db qt:*cpp* (namestring *file*))
(query "create table if not exists messages (mid integer primary key, uid integer, message text)")) (query "create table if not exists messages (mid integer primary key autoincrement, uid integer, message text)"))
(defun save-message (mid uid message) (defun save-message (uid message)
(query "insert into messages (mid, uid, message) values (?, ?, ?)" "Inserts MESSAGE and returns the new MID."
mid uid message)) (first (query "insert into messages (uid, message) values (?, ?)"
uid message)))
(defun load-message (mid) (defun load-message (mid)
(first (query "select message from messages where mid = ?" (first (query "select message from messages where mid = ?"
@ -29,10 +30,6 @@
(query "select message from messages where uid = ? order by mid" (query "select message from messages where uid = ? order by mid"
uid)) uid))
(defun max-message-id ()
(let ((val (first (query "select max(mid) from messages"))))
(if (numberp val) val 0)))
(defun delete-message (mid) ; see QML (defun delete-message (mid) ; see QML
(query "delete from messages where mid = ?" (query "delete from messages where mid = ?"
mid) mid)

View file

@ -69,12 +69,12 @@
(me:make-to-radio :want-config-id *config-id*)) (me:make-to-radio :want-config-id *config-id*))
(q> |playing| ui:*busy* t))) (q> |playing| ui:*busy* t)))
(defun set-ready (ready name ble-names) ; see Qt (defun set-ready (&optional ready name ble-names) ; see Qt
(setf *ready* ready) (setf *ready* ready)
(when ready (when ready
(setf *ble-names* ble-names) (setf *ble-names* ble-names)
(app:toast (x:cc (tr "radio") ": " name) 2) (app:toast (x:cc (tr "radio") ": " name) 2)
(qlater 'get-node-config)) (get-node-config))
(values)) (values))
(defun add-line-breaks (text) (defun add-line-breaks (text)
@ -112,7 +112,7 @@
(t (t
(msg:check-utf8-length (q< |text| ui:*edit*)) (msg:check-utf8-length (q< |text| ui:*edit*))
(unless (q< |tooLong| ui:*edit*) (unless (q< |tooLong| ui:*edit*)
(msg:message-id) (msg:new-message-id)
(when (stringp *receiver*) (when (stringp *receiver*)
(setf *receiver* (name-to-node *receiver*))) (setf *receiver* (name-to-node *receiver*)))
(send-to-radio (send-to-radio
@ -304,7 +304,7 @@
(defun send-admin (admin-message) (defun send-admin (admin-message)
(send-to-radio (send-to-radio
(to-radio :to (me:num *my-node-info*) (to-radio :to (me:num *my-node-info*)
:id (msg:message-id) :id (msg:new-message-id)
:hop-limit 3 :hop-limit 3
:want-ack t :want-ack t
:priority :reliable :priority :reliable

View file

@ -10,7 +10,6 @@
(radios:ini) (radios:ini)
(db:ini) (db:ini)
(loc:ini) (loc:ini)
(setf msg:*message-id* (db:max-message-id))
(if (setting :latest-receiver) (if (setting :latest-receiver)
(msg:show-messages) (msg:show-messages)
(qlater (lambda () (q> |currentIndex| ui:*main-view* 0)))) ; 'Group' (qlater (lambda () (q> |currentIndex| ui:*main-view* 0)))) ; 'Group'

View file

@ -1,14 +1,19 @@
(in-package :msg) (in-package :msg)
(defvar *message-id* 0) (defvar *states* '(:not-received :sending :received))
(defvar *states* '(:not-received :sending :received)) (defvar *message-id* 0)
(defvar *message-ids* nil "associate (temporary) QML :mid to (unique) DB 'mid'")
(defun ini () (defun ini ()
(q> |fontSize| ui:*message-view* (or (app:setting :message-font-size) 18))) (q> |fontSize| ui:*message-view*
(or (app:setting :message-font-size) 18)))
(defun message-id () (defun new-message-id ()
(mod (incf *message-id*) #.(expt 2 32))) (mod (incf *message-id*) #.(expt 2 32)))
(defun db-mid (mid)
(cdr (assoc mid *message-ids*)))
(defun show-message-p (message) (defun show-message-p (message)
(let ((user (app:setting :latest-receiver))) (let ((user (app:setting :latest-receiver)))
(and user (or (string= user (getf message :receiver)) (and user (or (string= user (getf message :receiver))
@ -24,9 +29,10 @@
(x:when-it* (app:setting (getf message :sender) :custom-name) (x:when-it* (app:setting (getf message :sender) :custom-name)
(setf (getf message :sender-name) x:it*))) (setf (getf message :sender-name) x:it*)))
(unless loading (unless loading
(db:save-message (getf message :mid) ; mid (let ((db-mid (db:save-message (parse-integer x:it :radix 16) ; uid
(parse-integer x:it :radix 16) ; uid (prin1-to-string message))))
(prin1-to-string message))) (push (cons (getf message :mid) db-mid)
*message-ids*)))
(if (or loading (show-message-p message)) (if (or loading (show-message-p message))
(qjs |addMessage| ui:*messages* message) (qjs |addMessage| ui:*messages* message)
(let* ((sender (getf message :sender)) (let* ((sender (getf message :sender))
@ -38,12 +44,13 @@
(q! |positionViewAtEnd| ui:*message-view*)))) (q! |positionViewAtEnd| ui:*message-view*))))
(defun change-state (state mid) (defun change-state (state mid)
(let ((i-state (position state *states*)) (let* ((i-state (position state *states*))
(message (db:load-message mid))) (db-mid (db-mid mid))
(message (db:load-message db-mid)))
(when message (when message
(setf message (read-from-string message)) (setf message (read-from-string message))
(setf (getf message :ack-state) i-state) (setf (getf message :ack-state) i-state)
(db:update-message mid (prin1-to-string message)) (db:update-message db-mid (prin1-to-string message))
(qjs |changeState| ui:*messages* (qjs |changeState| ui:*messages*
i-state mid)))) i-state mid))))

View file

@ -84,7 +84,6 @@
#:ini #:ini
#:load-message #:load-message
#:load-messages #:load-messages
#:max-message-id
#:save-message #:save-message
#:update-message)) #:update-message))
@ -103,8 +102,8 @@
#:font-size-changed #:font-size-changed
#:font-size-dialog #:font-size-dialog
#:ini #:ini
#:message-id
#:message-press-and-hold #:message-press-and-hold
#:new-message-id
#:receiver-changed #:receiver-changed
#:show-date #:show-date
#:show-messages #:show-messages