diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-14 23:56:45 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-14 23:56:45 +0300 |
commit | 1ffd88231386c104474103fe641cad7fa535f3ec (patch) | |
tree | fab5115a97e63cc59d9bf5bfd38b6d60cf9509c6 /src/cgi-bin/nea.scm4 | |
parent | 8c1de36d1f8b27fb946dac15e725c93ec57c1538 (diff) | |
download | ellinika-1ffd88231386c104474103fe641cad7fa535f3ec.tar.gz ellinika-1ffd88231386c104474103fe641cad7fa535f3ec.tar.bz2 |
Use (ellinika sql) in dict and nea.
* src/cgi-bin/dict.scm4: Use (ellinika sql)
* src/cgi-bin/nea.scm4: Likewise
* src/ellinika/sql.scm: Re-export sql-catch-failure and
sql-ignore-failure.
Diffstat (limited to 'src/cgi-bin/nea.scm4')
-rw-r--r-- | src/cgi-bin/nea.scm4 | 192 |
1 files changed, 86 insertions, 106 deletions
diff --git a/src/cgi-bin/nea.scm4 b/src/cgi-bin/nea.scm4 index e7f14a4..9c940f6 100644 --- a/src/cgi-bin/nea.scm4 +++ b/src/cgi-bin/nea.scm4 @@ -1,5 +1,5 @@ ;;;; News page for Ellinika -;;;; Copyright (C) 2004, 2005, 2006, 2007, 2010 Sergey Poznyakoff +;;;; Copyright (C) 2004, 2005, 2006, 2007, 2010, 2011 Sergey Poznyakoff ;;;; ;;;; This program is free software; you can redistribute it and/or modify ;;;; it under the terms of the GNU General Public License as published by @@ -20,8 +20,9 @@ (use-modules ifelse(IFACE,[CGI],(www cgi),(guile-user)) (ice-9 rdelim) - (gamma sql) (xmltools dict) + (ellinika elmorph) + (ellinika sql) (ellinika xlat) (ellinika cgi) (ellinika i18n)) @@ -35,7 +36,6 @@ ifelse(IFACE,[CGI],(cgi:init)) (ellinika-cgi-init tmpl) -(define conn #f) (define article #f) (define accepted-lang (map (lambda (s) @@ -86,16 +86,14 @@ ifelse(IFACE,[CGI],(cgi:init)) (string-append "(" str ")") (loop (string-append str (if (string-null? str) "'" ",'") - (car input-list) "'") + (utf8-escape (car input-list)) "'") (cdr input-list))))) -(define (get-sql-lang conn ident langlist) - (let ((res (map car (sql-query conn - (string-append - "SELECT lang " - "FROM newsart " - "WHERE ident=" ident " " - "AND lang in " (make-sql-list langlist)))))) +(define (get-sql-lang ident langlist) + (let ((res (map car + (ellinika:sql-query + "SELECT lang FROM newsart WHERE ident=~N AND lang in ~N" + ident (make-sql-list langlist))))) (cond ((null? res) #f) @@ -123,11 +121,9 @@ ifelse(IFACE,[CGI],(cgi:init)) (set! start 0)))) (call-with-current-continuation (lambda (return) - (let ((tuples (sql-query - conn - (format #f - "SELECT date,ident FROM news ORDER BY 1 DESC LIMIT ~A,~A" - start nea-max-rows)))) + (let ((tuples (ellinika:sql-query + "SELECT date,ident FROM news ORDER BY 1 DESC LIMIT ~N,~N" + start nea-max-rows))) (cond ((null? tuples) (cons start (if fwd (reverse result) result))) @@ -137,16 +133,14 @@ ifelse(IFACE,[CGI],(cgi:init)) (ctr 0)) (for-each (lambda (entry) - (let ((lang (get-sql-lang conn (list-ref entry 1) langlist))) + (let ((lang (get-sql-lang (list-ref entry 1) langlist))) (set! ctr (1+ ctr)) (if lang - (let ((hdr (sql-query conn - (string-append - "SELECT header,lang " - "FROM newsart " - "WHERE ident=" (list-ref entry 1) " " - "AND lang='" lang "' " - "LIMIT 1")))) + (let ((hdr (ellinika:sql-query + "SELECT header,lang\ + FROM newsart\ + WHERE ident=~N AND lang=~Q LIMIT 1" + (list-ref entry 1) lang))) (cond (hdr (set! result (cons @@ -177,7 +171,8 @@ ifelse(IFACE,[CGI],(cgi:init)) (let* ((count (catch #t (lambda () (string->number - (caar (sql-query conn "SELECT count(*) FROM news")))) + (caar (ellinika:sql-query + "SELECT count(*) FROM news")))) (lambda args 0))) (from (catch #t @@ -374,74 +369,63 @@ ifelse(IFACE,[CGI],(cgi:init)) (display " </channel> </rss>")) -(define (nea-sql-connect) - (let ((conn (sql-open-connection ellinika-sql-connection))) - (sql-query conn "SET NAMES utf8") - conn)) - (define (nea-rss) (nea-rss-header) (catch 'gsql-error (lambda () - (let ((conn (nea-sql-connect))) - (for-each - (lambda (tuple) - (display "<item>\n") - (display "<pubDate>") - (display (list-ref tuple 0)) - (display "</pubDate>\n") - (display "<title>") - (let ((title (sql-query conn - (string-append - "SELECT header " - "FROM newsart " - "WHERE ident=" (list-ref tuple 2) " " - "AND lang='" - (get-sql-lang conn - (list-ref tuple 2) - (make-my-lang-list)) - "' " - "LIMIT 1")))) - (display (if (not (null? title)) - (caar title) - (list-ref tuple 0)))) - (display "</title>\n") - (display "<link>") - (display (string-append - (string-downcase cgi-server-protocol-name) - "://" - cgi-server-hostname - "/" - (make-cgi-name cgi-script-name - "timestamp" (list-ref tuple 1)))) - (display "</link>\n") - (display "</item>\n")) - (sql-query - conn - (string-append - "SELECT date,unix_timestamp(date),ident " - "FROM news " - "ORDER BY 1 DESC LIMIT 10"))))) + (ellinika:sql-connect ellinika-sql-connection) + (for-each + (lambda (tuple) + (display "<item>\n") + (display "<pubDate>") + (display (list-ref tuple 0)) + (display "</pubDate>\n") + (display "<title>") + (let ((title (ellinika:sql-query + "SELECT header\ + FROM newsart\ + WHERE ident=~N AND lang=~Q LIMIT 1" + (list-ref tuple 2) + (get-sql-lang (list-ref tuple 2) + (make-my-lang-list))))) + (display (if (not (null? title)) + (caar title) + (list-ref tuple 0)))) + (display "</title>\n") + (display "<link>") + (display (string-append + (string-downcase cgi-server-protocol-name) + "://" + cgi-server-hostname + "/" + (make-cgi-name cgi-script-name + "timestamp" (list-ref tuple 1)))) + (display "</link>\n") + (display "</item>\n")) + (ellinika:sql-query + "SELECT date,unix_timestamp(date),ident\ + FROM news\ + ORDER BY 1 DESC LIMIT 10"))) (lambda (key err descr) (sql-error-handler err descr))) (nea-rss-footer)) (define (get-article-by-timestamp ts) - (let ((tuples (sql-query - conn - "SELECT date,unix_timestamp(date),ident FROM news WHERE unix_timestamp(date)=" ts))) + (let ((tuples (ellinika:sql-query + "SELECT date,unix_timestamp(date),ident FROM news\ + WHERE unix_timestamp(date)=~Q" ts))) (cond (tuples (let* ((res (car tuples)) - (lang (get-sql-lang conn (list-ref res 2) (make-my-lang-list))) - (art (sql-query conn - (string-append - "SELECT header,text,lang " - "FROM newsart " - "WHERE ident=" (list-ref res 2) " " - "AND lang='" lang "' " - "LIMIT 1")))) + (lang (get-sql-lang (list-ref res 2) (make-my-lang-list))) + (art (ellinika:sql-query + "SELECT header,text,lang\ + FROM newsart\ + WHERE ident=~N\ + AND lang=~Q\ + LIMIT 1" + (list-ref res 2) lang))) (append (list (list-ref res 0) (list-ref res 1)) @@ -461,36 +445,32 @@ ifelse(IFACE,[CGI],(cgi:init)) (lambda () ifelse(IFACE,[CGI],dnl (display ["Content-type: text/html; charset=utf-8\r\n\r\n"])) - (set! conn (nea-sql-connect)) + (ellinika:sql-connect ellinika-sql-connection) (cond ((or (cgi:value "timestamp") (cgi:value "id")) - (let ((tuples (sql-query - conn - (string-append - "SELECT date,unix_timestamp(date),ident " - "FROM news " - "WHERE " - (cond - ((cgi:value "timestamp") => - (lambda (ts) - (string-append "unix_timestamp(date)=" ts))) - ((cgi:value "id") => - (lambda (id) - (string-append "ident=" id)))))))) - + (let ((tuples + (cond + ((cgi:value "timestamp") => + (lambda (ts) + (ellinika:sql-query + "SELECT date,unix_timestamp(date),ident\ + FROM news WHERE unix_timestamp(date)=~Q" ts))) + ((cgi:value "id") => + (lambda (id) + (ellinika:sql-query + "SELECT date,unix_timestamp(date),ident\ + FROM news WHERE ident=~N" id)))))) + (if (not (null? tuples)) (let* ((res (car tuples)) - (lang (get-sql-lang conn - (list-ref res 2) + (lang (get-sql-lang (list-ref res 2) (make-my-lang-list))) - (art (sql-query - conn - (string-append - "SELECT header,text,lang " - "FROM newsart " - "WHERE ident=" (list-ref res 2) " " - "AND lang='" lang "' " - "LIMIT 1")))) + (art (ellinika:sql-query + "SELECT header,text,lang\ + FROM newsart\ + WHERE ident=~N AND lang=~Q LIMIT 1" + (list-ref res 2) + lang))) (set! article (append (list (list-ref res 0) (list-ref res 1)) @@ -500,7 +480,7 @@ ifelse(IFACE,[CGI],(cgi:init)) (template-file target-language tmpl) nea-html) - (sql-close-connection conn)) + (ellinika:sql-disconnect)) (lambda (key err descr) (with-input-from-file |