; chicken-scheme MySQL query procedure ; ; To use: ; (use mysql-client) ; (define mysql (make-mysql-connection "host" "user" "pass" "schema")) ; (define fetch (mysql "select * from messages")) ; (fetch) ; ; Provide password as #f to use the password from the .my.cnf ; options file (/home/user/.my.cnf). ; ; Example .my.cnf: ; ; [client] ; user=root ; password=secret ; ; Note how MySQL (NULL) values are represented when ; returned in an array of string pointers: ; A (NULL) value is represented by a string containing ; a 0x04 0x00 char sequence. (module mysql-client (make-mysql-connection) (import scheme chicken foreign) (use irregex data-structures) (define (make-mysql-connection host user pass database) (define mysql-c (make-mysql-c-connection host user pass database)) (set-finalizer! mysql-c (lambda(x) (close-mysql-c-connection mysql-c))) (define (mysql-query query . parameters) (cond ((and (string? query)(equal? parameters '())) (dispatch-query mysql-c query parameters)) ((string? query) (dispatch-query mysql-c query (car parameters))) ((procedure? query) (dispatch-proc mysql-c query parameters)) (else (error "unrecognised query object: " query)))) mysql-query) (define (dispatch-query conn query parameters) (define result-c (cond ((equal? '() parameters) (mysql-c-query conn query)) (else (mysql-c-query conn (escape-placeholder-params conn query parameters))))) (define (fetch-c)(let ((row (mysql-c-fetch-row result-c))) (if (> (length row) 0) row #f))) (set-finalizer! result-c (lambda(x) (mysql-c-free-result result-c))) fetch-c) (define (dispatch-proc conn proc . parameters) (proc conn parameters)) (define (escape-placeholder-params conn query parameters) (let ((escaped-parameters (map (lambda(x) (cons (symbol->string (car x)) (mysql-c-real-escape-string conn (cdr x)))) parameters))) (irregex-replace/all (flatten (list 'or (map (lambda(x) (car x)) escaped-parameters))) query (lambda (r) (alist-ref (irregex-match-substring r 0) escaped-parameters string=?))))) (foreign-declare "#include \"mysql.h\"") (define mysql-c-real-escape-string (foreign-lambda* c-string ((c-pointer conn) (c-string str)) #<