(module model mzscheme
(provide (all-defined))
(require
(planet "sqlite.ss" ("jaymccarthy" "sqlite.plt" 3 1))
(planet "sqlite.ss" ("soegaard" "sqlite.plt" 1 2)))
(define PAGE-LIMIT (make-parameter 50)) (define DATABASE-PATH (string->path "listit.db"))
(define current-database (make-parameter #f))
(define-syntax db
(syntax-id-rules () [db (or (current-database)
(let ([d (open DATABASE-PATH)])
(current-database d)
d))]))
(define (create-table-entries)
(exec/ignore
db
#<<SQL
CREATE TABLE entries (
entry_id INTEGER PRIMARY KEY,
title TEXT,
url TEXT,
score INTEGER )
SQL
))
(define (drop-table-entries)
(exec/ignore db "DROP TABLE entries"))
(define (insert-entry title url score)
(insert db (sql (INSERT INTO entries (title url score)
VALUES (,title ,url ,score)))))
(define (increase-score entry-id)
(update db (sql (UPDATE entries
SET (score = (+ score 1))
WHERE (= entry_id ,entry-id)))))
(define (decrease-score entry-id)
(update db (sql (UPDATE entries
SET (score = (- score 1))
WHERE (= entry_id ,entry-id)))))
(define (top n)
(select db (sql (SELECT (entry_id title url score)
FROM entries
ORDER-BY (score DESC)
LIMIT ,n))))
(define (page n)
(select db (sql (SELECT (entry_id title url score)
FROM entries
ORDER-BY (score DESC)
LIMIT ,(PAGE-LIMIT) OFFSET ,(* (PAGE-LIMIT) n)))))
(define (entries-with-url url-str)
(select db (sql (SELECT (entry_id title url score)
FROM entries
WHERE ,(format "url='~a'" url-str)))))
(define (url-in-db? url-str)
(let ([result (entries-with-url db url-str)])
(if (null? (entries-with-url db url-str))
#f
result)))
(unless (and (file-exists? DATABASE-PATH)
(table-exists? db "'entries'"))
(create-table-entries)
(current-database (make-parameter (open DATABASE-PATH)))))