[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: SrPersist and sql-c-char question
"Alex Peake" <apeake@comac.com> writes:
> In learning about SrPersist, I tried the following test. It all works except
> for the strange display of the strings (from the buffers). Each string is 80
> characters long, filled with (apparently) null characters, or the contenets
> of the previous buffer after the first null. Is there some way to "convert
> to scheme strings" so the display properly?
You may use the following procedure:
,--------------------
|    ;; This procedure adjusts BUFF keeping everything up to the first null
|    ;; char #\^@, as those stored by bind-table into buffers.
|    (define schemeql-trim                     
|      (lambda (buff)                          
|        (let ((len (string-length buff)))     
|          (let loop ((idx 0))                 
|            (cond ((= idx len) buff)          
|                  ((char=? (string-ref buff idx) #\null)
|                   (substring buff 0 idx))    
|                  (else (loop (+ idx 1))))))))
`--------------------
substitute string-copy by schemeql-trim in:
[...]
>               (set! result (append (list (string-copy (read-buffer
> lookup-buffer))
>                                          (string-copy (read-buffer
> display-buffer)))
>                                    result))
Finally, I believe it is a feature (not a bug) that SrPersist behaves
like this, because usually one expect to have "fixed" length buffers
returning from the ODBC layer.  And cleaning those buffers before
returning them would be a major overhead, I guess.
Of course, you can always use SchemeQL without bothering about these
kind of problems. :-)  You can get the latest version at:
ftp://wish.com.mx/pub/scheme/schemeql-0.05-2.plt
I corrected some bugs since version 0.03 (the one published at "PLT
Scheme Libraries and Extensions" web page). Hopefully this new version
will be there soon.  There are quite a few extensions I'd like to add
to SchemeQL yet (union, intersection, interactive support for
`driver-connect', etc.) but I haven't had much time lately.  Anyway,
the SQL Minimum Grammar, and some extensions are included, and may
be useful for basic database interaction.  For one, your `test-odbc'
procedure would become:
,--------------------
| (define test-odbc                    
|   (lambda ()                         
|     (let* ((cursor (find '(ClientProperty)
|                          '(PropertyName PropertyValue))))
|       (finite-cursor->list cursor))))
`--------------------
HTH,
--Francisco