diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-14 14:20:39 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2011-06-14 14:20:39 +0300 |
commit | 8c1de36d1f8b27fb946dac15e725c93ec57c1538 (patch) | |
tree | 17babe745cf794a7485fc2bc0b9c9e0c9120d893 /scm/verbop.scm | |
parent | ce29f168ed52f08228b99a789785271a4a3c9b0e (diff) | |
download | ellinika-8c1de36d1f8b27fb946dac15e725c93ec57c1538.tar.gz ellinika-8c1de36d1f8b27fb946dac15e725c93ec57c1538.tar.bz2 |
Improve SQL interface.
* src/ellinika/sql.scm (ellinika:sql-verbose)
(ellinika:sql-dry-run,ellinika:sql-conn): New public vars.
(ellinika:format-sql-query): New function.
(ellinika:sql-query): Rewrite.
* scm/verbop.scm: Use (ellinika sql).
* src/ellinika/conjugator.scm: Likewise.
* src/ellinika/test-conjugation.scm: Likewise.
* data/irregular-verbs.xml: Update.
* src/ellinika/tests/conj/apomenv.scm: New file.
Diffstat (limited to 'scm/verbop.scm')
-rw-r--r-- | scm/verbop.scm | 149 |
1 files changed, 61 insertions, 88 deletions
diff --git a/scm/verbop.scm b/scm/verbop.scm index ff30892..5192b87 100644 --- a/scm/verbop.scm +++ b/scm/verbop.scm @@ -20,14 +20,12 @@ (use-modules (srfi srfi-1) (xmltools xmltrans) (ellinika elmorph) - (gamma sql) + (ellinika sql) (ellinika tenses) (ice-9 getopt-long)) (define cleanup-option #f) (define force-option #f) -(define verbose-option #f) -(define dry-run-option #f) (define debug-level 0) (define input-files '()) (define flect-ident 0) @@ -38,8 +36,6 @@ (define class-list '()) ; List of defined verb classes. -(define connection #f) ; SQL connection - (define sysconf-dir "=SYSCONFDIR=") (define config-file-name "ellinika.conf") @@ -62,31 +58,13 @@ rest) (newline)))) -(define (sql-val val) - ;; FIXME: quote - (if (not val) - "NULL" - (string-append "\"" val "\""))) - -(define (run-query . rest) - (debug 100 rest) - (let ((q (apply format (cons #f rest)))) - (if verbose-option - (format #t "QUERY: ~A\n" q)) - (cond - (connection - (let ((res (sql-query connection q))) - (if verbose-option - (format #t "RESULT: ~A\n" res)) - res)) - (else - #f)))) - (define (query-number q) - (let ((res (run-query q))) - (if (null? res) - #f - (string->number (caar res))))) + (if ellinika:sql-dry-run + 0 + (let ((res (ellinika:sql-query q))) + (if (null? res) + #f + (string->number (caar res)))))) (define (check-parent elt . rest) (call-with-current-continuation @@ -179,9 +157,6 @@ (else (list-ref verbdef (verbdef:index what))))) -(define (verb-get-sql what) - (sql-val (verb-get what))) - (define (verb-set what val) (if (null? verbdef) (verb-init)) @@ -229,23 +204,25 @@ (return #t)))) (define (insert-individual-verb voice mood tense ident) - (run-query "INSERT INTO individual_verb (verb,voice,mood,tense,ident) \ -VALUES (~A,~A,~A,~A,~A);~%" - (verb-get-sql #:verb) - (sql-val voice) - (sql-val mood) - (sql-val tense) - (number->string ident))) + (ellinika:sql-query + "INSERT INTO individual_verb (verb,voice,mood,tense,ident) \ +VALUES (~Q,~Q,~Q,~Q,~Q)" + (verb-get #:verb) + voice + mood + tense + ident)) (define (flush-mood mood vstr) (if (eq? (car mood) #:root) (let ((val (cdr mood))) - (run-query "INSERT INTO irregular_root (verb,voice,thema,root) \ -VALUES (~A,~A,~A,~A)" - (verb-get-sql #:verb) - (sql-val vstr) - (sql-val (car val)) - (sql-val (cdr val)))) + (ellinika:sql-query + "INSERT INTO irregular_root (verb,voice,thema,root) \ +VALUES (~Q,~Q,~Q,~Q)" + (verb-get #:verb) + vstr + (car val) + (cdr val))) (let ((mood-str (car mood))) (let ((lst (cdr mood))) (cond @@ -268,32 +245,30 @@ VALUES (~A,~A,~A,~A)" (else (let ((num (next-flect-ident)) (l (cdr p))) - (run-query - "INSERT INTO verbflect VALUES (~A,~A,~A,~A,~A,~A,~A)" + (ellinika:sql-query + "INSERT INTO verbflect VALUES (~Q,~Q,~Q,~Q,~Q,~Q,~Q)" num - (sql-val (list-ref l 0)) - (sql-val (list-ref l 1)) - (sql-val (list-ref l 2)) - (sql-val (list-ref l 3)) - (sql-val (list-ref l 4)) - (sql-val (list-ref l 5))) + (list-ref l 0) + (list-ref l 1) + (list-ref l 2) + (list-ref l 3) + (list-ref l 4) + (list-ref l 5)) (insert-individual-verb vstr mood-str tense num) ))) (for-each (lambda (prop) ; (format #t "PROP ~A~%" prop) (let ((key (car prop))) - (cond - ((string=? key "default")) - (else - (run-query - "INSERT INTO verbtense VALUES (~A,~A,~A,~A,~A,~A)" - (verb-get-sql #:verb) - (sql-val vstr) - (sql-val mood-str) - (sql-val tense) - (sql-val (car prop)) - (sql-val (cdr prop))))))) + (if (not (string=? key "default")) + (ellinika:sql-query + "INSERT INTO verbtense VALUES (~Q,~Q,~Q,~Q,~Q,~Q)" + (verb-get #:verb) + vstr + mood-str + tense + (car prop) + (cdr prop))))) (list-tail p 7)))) lst))))))) @@ -371,9 +346,10 @@ VALUES (~A,~A,~A,~A)" ;; (case (verb-get #:action) ((insert) - (run-query "INSERT INTO verbclass (verb,conj) VALUES (~A,~A)" - (verb-get-sql #:verb) - (verb-get-sql #:class)) + (ellinika:sql-query + "INSERT INTO verbclass (verb,conj) VALUES (~Q,~Q)" + (verb-get #:verb) + (verb-get #:class)) (flush-voice "act" (preprocess-voice (verb-get #:act) @@ -790,10 +766,11 @@ Informational options: ((preserve) (set! preserve-option #t)) ((debug) - (set! debug-level (string->number (cdr x)))) + (set! debug-level (string->number (cdr x))) + (set! ellinika:sql-verbose #t)) ((dry-run) - (set! verbose-option #t) - (set! dry-run-option #t)) + (set! ellinika:sql-dry-run #t) + (set! ellinika:sql-verbose #t)) ((help) (usage) (exit 0)))) @@ -806,31 +783,27 @@ Informational options: (display "Input files not specified\n" (current-error-port)) (exit 1))) -(cond - ((not dry-run-option) - (set! connection (sql-open-connection ellinika-sql-connection)) - (if (not connection) - (begin - (display "Cannot connect to the database\n" (current-error-port)) - (exit 1))) - (run-query "SET NAMES utf8") - (set! flect-ident (query-number "SELECT MAX(ident) FROM verbflect")))) +(if (not (ellinika:sql-connect ellinika-sql-connection)) + (begin + (display "Cannot connect to the database\n" (current-error-port)) + (exit 1))) +(set! flect-ident (query-number "SELECT MAX(ident) FROM verbflect")) (cond (cleanup-option - (run-query "DELETE FROM verbflect where ident > 99") - (run-query "DELETE FROM verbclass") - (run-query "DELETE FROM verbtense") - (run-query "DELETE FROM irregular_root") - (run-query "DELETE FROM individual_verb"))) + (ellinika:sql-query "DELETE FROM verbflect where ident > 99") + (ellinika:sql-query "DELETE FROM verbclass") + (ellinika:sql-query "DELETE FROM verbtense") + (ellinika:sql-query "DELETE FROM irregular_root") + (ellinika:sql-query "DELETE FROM individual_verb"))) (set! class-list (cons "I" - (if dry-run-option + (if ellinika:sql-dry-run (list "A" "B1" "B2") (map car - (run-query + (ellinika:sql-query "SELECT DISTINCT conj FROM conjugation ORDER BY 1"))))) @@ -840,8 +813,8 @@ Informational options: (exit 1))) input-files) -(if connection - (sql-close-connection connection)) +(ellinika:sql-disconnect) + |