#lang racket/base (require db racket/string ) (provide read-all) (define crm-cfg-file (build-path (find-system-path 'home-dir) "crm" "data" "config-internal.php")) (define (read-db-config) (let ((fh (open-input-file crm-cfg-file)) (host #f) (port #f) (user #f) (passwd #f) (dbname #f) (re-key-val #px"[']([a-z]+)[']\\s*[=][>]\\s*[']([^']*)[']") ) (let loop () (let* ((line (read-line fh)) (m (if (eof-object? line) #f (regexp-match re-key-val line))) ) (cond ((eof-object? line) (close-input-port fh) (list host port user passwd dbname)) ((not (eq? m #f)) (let ((key (cadr m)) (val (caddr m))) (cond ((string=? key "host") (set! host val)) ((string=? key "port") (set! port (if (string=? val "") 3306 (string->number val)))) ((string=? key "dbname") (set! dbname val)) ((string=? key "user") (set! user val)) ((string=? key "password") (set! passwd val)) ) (loop) )) (else (loop)) ) ) ) ) ) (define (connect-db host port user passwd dbname) (let ((dbh (mysql-connect #:user user #:database dbname #:port port #:server host #:password passwd))) dbh)) (define (to-file name content) (let ((fh (open-output-file name #:exists 'replace))) (display content fh) (close-output-port fh) )) (define (handle-rows dir rows) (for-each (lambda (row) (let* ((id (vector-ref row 0)) (name (vector-ref row 1)) (description (vector-ref row 2)) (value_script (vector-ref row 3)) (re #px"[/><]") (mk-name (lambda (name ext) (build-path dir (string-append (regexp-replace* re name "_") "." ext)))) ) (displayln (format "making ~a / ~a" dir name)) (to-file (mk-name name "id") id) (to-file (mk-name name "name") name) (to-file (mk-name name "js") value_script) (to-file (mk-name name "descr") description) )) rows)) (define (read-script-configs dbh) (let ((rows (query-rows dbh "select id, name, description, value_script from config where type = 'script' and deleted = 0"))) (handle-rows "configs" rows))) (define (read-scripts dbh) (let ((rows (query-rows dbh "select id, name, description, formule from script where deleted = 0"))) (handle-rows "scripts" rows))) (define (read-all) (let ((dbh (apply connect-db (read-db-config)))) (read-script-configs dbh) (read-scripts dbh)) )