diff options
Diffstat (limited to 'dbutil.scm')
-rw-r--r-- | dbutil.scm | 74 |
1 files changed, 59 insertions, 15 deletions
@@ -1,9 +1,9 @@ ;;; "dbutil.scm" relational-database-utilities -; Copyright 1994, 1995, 1997 Aubrey Jaffer +; Copyright 1994, 1995, 1997, 2000, 2001 Aubrey Jaffer ; -;Permission to copy this software, to redistribute it, and to use it -;for any purpose is granted, subject to the following restrictions and -;understandings. +;Permission to copy this software, to modify it, to redistribute it, +;to distribute modified versions, and to use it for any purpose is +;granted, subject to the following restrictions and understandings. ; ;1. Any copy made of this software must include this copyright notice ;in full. @@ -50,6 +50,18 @@ (((make-relational-system (slib:eval type)) 'open-database) path #f)))) +(define (dbutil:check-domain rdb) + (let* ((ro:domains ((rdb 'open-table) '*domains-data* #f)) + (ro:get-dir (ro:domains 'get 'domain-integrity-rule)) + (ro:for-tab (ro:domains 'get 'foreign-table))) + (lambda (domain) + (let ((fkname (ro:for-tab domain)) + (dir (slib:eval (ro:get-dir domain)))) + (if fkname (let* ((fktab ((rdb 'open-table) fkname #f)) + (p? (fktab 'get 1))) + (if dir (lambda (e) (and (dir e) (p? e))) p?)) + dir))))) + (define (dbutil:create-database path type) (require type) (let ((rdb (((make-relational-system (slib:eval type)) 'create-database) @@ -147,17 +159,7 @@ ((domain-checker no-parameters no-parameter-names - (lambda (rdb) - (let* ((ro:domains ((rdb 'open-table) '*domains-data* #f)) - (ro:get-dir (ro:domains 'get 'domain-integrity-rule)) - (ro:for-tab (ro:domains 'get 'foreign-table))) - (lambda (domain) - (let ((fkname (ro:for-tab domain)) - (dir (slib:eval (ro:get-dir domain)))) - (if fkname (let* ((fktab ((rdb 'open-table) fkname #f)) - (p? (fktab 'get 1))) - (if dir (lambda (e) (and (dir e) (p? e))) p?)) - dir))))) + dbutil:check-domain "return procedure to check given domain name") (add-domain @@ -179,12 +181,40 @@ ((tab 'row:update) row)) (dbutil:wrap-command-interface rdb))) +(define (make-defaulter arity type) + `(lambda (pl) + ',(case arity + ((optional nary) '()) + ((boolean) #f) + ((single nary1) + (case type + ((string) '("")) + ((symbol) '(nil)) + ((number) '(0)) + (else '(#f)))) + (else (slib:error 'make-defaulter 'unknown 'arity arity))))) + +(define (get-foreign-choices tab) + (define dlst ((tab 'get* 1))) + (do ((dlst dlst (cdr dlst)) + (vlst (if (memq 'visible-name (tab 'column-names)) + ((tab 'get* 'visible-name)) + dlst) + (cdr vlst)) + (out '() (if (member (car dlst) (cdr dlst)) + out + (cons (list (car dlst) (car vlst)) out)))) + ((null? dlst) out))) + (define (make-command-server rdb command-table) (let* ((comtab ((rdb 'open-table) command-table #f)) (names (comtab 'column-names)) (row-ref (lambda (row name) (list-ref row (position name names)))) (comgetrow (comtab 'row:retrieve))) (lambda (comname command-callback) + (cond ((not comname) (set! comname '*default*))) + (cond ((not (comgetrow comname)) + (slib:error 'command 'not 'known: comname))) (let* ((command:row (comgetrow comname)) (parameter-table ((rdb 'open-table) (row-ref command:row 'parameters) #f)) @@ -264,7 +294,21 @@ ((tab 'close-table)))))) (for-each (lambda (spec) (apply define-table spec)) spec-list)) +(define (dbutil:list-table-definition rdb table-name) + (cond (((rdb 'table-exists?) table-name) + (let* ((table ((rdb 'open-table) table-name #f)) + (prilimit (table 'primary-limit)) + (coldefs (map list + (table 'column-names) + (table 'column-domains)))) + (list table-name + (butnthcdr prilimit coldefs) + (nthcdr prilimit coldefs) + ((table 'row:retrieve*))))) + (else #f))) + (define create-database dbutil:create-database) (define open-database! dbutil:open-database!) (define open-database dbutil:open-database) (define define-tables dbutil:define-tables) +(define list-table-definition dbutil:list-table-definition) |