This commit is contained in:
TMA 2026-03-14 22:52:46 +01:00
parent 8793ddfef2
commit bfaffa88bd

View file

@ -27,34 +27,127 @@
; )
;; Thread-local parameter to re-use SQLite3 DB handle for subsequent queries
(define *cached-brmelect-db* (make-parameter #f))
(define =brmelect-db-path= "/home/brmelect/brmelect/brmelect.sqlite3")
;(define *cached-brmelect-db* (make-parameter #f))
;(define =brmelect-db-path= "/home/brmelect/brmelect/brmelect.sqlite3")
(define db
(connect
database: "brmelect"
user: "brmelect"
password: "brm"
host: "localhost"))
(define db
(connect
'((dbname . "brmelect")
(user . "brmelectmgr")
(host . "localhost"))))
(define (query-db sql . params)
(apply query* db sql params))
(define (exec sql . params)
(apply exec* db sql params))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; helpers
(define (param parameters key)
(hash-table-ref/default parameters key ""))
(define (int-param parameters key)
(string->number (param parameters key)))
(define (redirect url)
(make-response
code: 302
headers: `((location . ,url))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; navigation menu
(define (layout title body)
`@html{
@head{
@title{,title}
}
@body{
@h1{,title}
@nav{
@a[href: "/members"]{"Members"} " | "
@a[href: "/meetings"]{"Meetings"} " | "
@a[href: "/votes"]{"Votes"}
}
@hr{}
,body
}})
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; members
(define-resource (members "members" parameters)
(let ((rows (query-db "SELECT member_id,nick,name,surname FROM brm.members ORDER BY member_id")))
(make-html-response
200
(layout
"Members"
`@div{
;@a[href: "/members/add"]{"Add Member"}
@table{
@tr{@th{"ID"} @th{"Nick"} @th{"Name"} @th{"Surname"} @th{"Edit"}}
,@(row-map*
(lambda (id nick name surname)
`@tr{@td{,id}@td{,nick}@td{,name}@td{,surname}})
rows)
}
}))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; /members/add
;(define-resource (members-add "elect" "members" "add" parameters)
; (if (param parameters 'submit)
; (begin
; (exec
; "INSERT INTO brm.members(member_id,nick,name,surname) VALUES($1,$2,$3,$4)"
; (int-param parameters 'member_id)
; (param parameters 'nick)
; (param parameters 'name)
; (param parameters 'surname))
; (redirect "/members"))
; (make-html-response
; 200
; (layout
; "Add Member"
; `@form[action: "/members/add" method: "get"]{
; "ID:" @input[name: "member_id"]{} @br{}
; "Nick:" @input[name: "nick"]{} @br{}
; "Name:" @input[name: "name"]{} @br{}
; "Surname:" @input[name: "surname"]{} @br{}
; @input[type: "submit" name: "submit" value: "Create"]{}
; }))))
;
;; Returns (possibly cached) SQLite3 DB handle
(define (brmelect-db)
(let ((cdb (*cached-brmelect-db*)))
(if cdb
cdb
(begin
(*cached-brmelect-db*
(let ((handler (make-busy-timeout 2000)))
(let ((db (open-database =brmelect-db-path=)))
(set-busy-handler! db handler)
db)))
(*cached-brmelect-db*)))))
;(define (brmelect-db)
; (let ((cdb (*cached-brmelect-db*)))
; (if cdb
; cdb
; (begin
; (*cached-brmelect-db*
; (let ((handler (make-busy-timeout 2000)))
; (let ((db (open-database =brmelect-db-path=)))
; (set-busy-handler! db handler)
; db)))
; (*cached-brmelect-db*)))))
(define (initialize-db)
(let ((db (brmelect-db)))
;; admin passwords
(execute db "create table if not exists admins (login text not null primary key, password text not null)")
;; GA
(execute db "create table if not exists general_assemblies (id integer primary key, ga_date text not null, ga_open integer not null)")
(execute db "insert or ignore into general_assemblies (id, ga_date, ga_open) values (17, '2025-01-21', 1)")
;; elections
(execute db "create table if not exists elections (id integer primary key autoincrement, ga_id integer not null, election_name text not null, election_running integer not null, election_file text not null, foreign key (ga_id) references general_assemblies(id))")
;; candidates
(execute db "create table if not exists candidates (id integer primary key autoincrement, election_id integer not null, candidate_name text not null, candidate_nick text not null, foreign key (election_id) references elections(id)")
))
;(define (initialize-db)
; (let ((db (brmelect-db)))
; ;; admin passwords
; (execute db "create table if not exists admins (login text not null primary key, password text not null)")
; ;; GA
; (execute db "create table if not exists general_assemblies (id integer primary key, ga_date text not null, ga_open integer not null)")
; (execute db "insert or ignore into general_assemblies (id, ga_date, ga_open) values (17, '2025-01-21', 1)")
; ;; elections
; (execute db "create table if not exists elections (id integer primary key autoincrement, ga_id integer not null, election_name text not null, election_running integer not null, election_file text not null, foreign key (ga_id) references general_assemblies(id))")
; ;; candidates
; (execute db "create table if not exists candidates (id integer primary key autoincrement, election_id integer not null, candidate_name text not null, candidate_nick text not null, foreign key (election_id) references elections(id)")
; ))
;(initialize-db)