[elephant-devel] Elephant 0.6.0 SQL fix on OpenMCL 1.0

George Khouri gk1 at four-four.com
Sat Nov 11 11:16:32 UTC 2006


Ian,
OpenMCL 1.1-pre-061110  release excerpt:
"About 15-20 character encoding schemes are defined (so far); these
  include UTF-8/16/32 and the big-endian/little-endian variants of
  the latter two and ISO-8859-* 8-bit encodings. "
Unicode support is now "built-in." but only starting with the 1.1 pre-releases. Unfortunelately, there isn't a  *feature* indicatiing unicode support.  The only *features* changing from 1.0 to 1.1 are the "lack of" the :ccl-x" features (:CCL :CCL-2 :CCL-3 :CCL-4) and a few others, so you would have to do something like:
#+(and openmcl (not ccl)) ...(ugh!)
I'll be glad to do any testing on openMCL.
George

>Unicode support should be an easy fix; we've already patched it for SBCL
>and ACL unicode.  Is there a *feature* in MCL that indicates whether
>string types are unicode or not?  Also, what encoding does MCL use? 
>(UTF-8, UTF-16, etc)
>
>Ian
>
>George Khouri wrote:
>> Ian,
>>
>>   
>>> I've had continuous problems with MCL's type specs.  Do you have any
>>> idea how and why MCL treats them differently?  I never use MCL so don't
>>> have a good sense of what standards to use to generate code that works
>>> under MCL.  This specific problem might be fixed by setting the type to
>>> (or null integer).
>>>     
>>
>> The short of it seems that openMCL chooses to be strict in assigning a slot 
>value when that slot's type is specified in the class definition, where e.g., 
>SBCL either doesn't check or doesn't care.
>> OpenMCL constructs a type-predicate test when defining a class and it apples 
>that test before assigning a slot value (c.f. source code for 
>%set-std-slot-vector-value in l1-clos-boot.lisp). If the value doesn't meet the 
>type spec, it errors. So in the sql-cursor case it's approximately:
>>  ...
>> (if (typep new-val 'integer)
>>     (setf (%svref slot-vector loc) new-val)
>>     (error 'bad-slot-type
>>       ...)) ...
>>
>> SBCL lets you assign any type to a typed slot:
>>
>> This is SBCL 0.9.18, an implementation of ANSI Common Lisp. ...
>> * (defclass foo ()
>>    ((slot-one :accessor slot-one :initform -1 :type integer)))
>> #<STANDARD-CLASS FOO>
>> * (defparameter my-class (make-instance 'foo))
>> MY-CLASS
>> * (slot-one my-class)
>> -1
>> * (setf (slot-one my-class) nil)
>> NIL
>> * (setf (slot-one my-class) "bar")
>> "bar"
>> *
>>
>> The Hyperspec Sec. 7.5.3:
>> "The contents of a slot will always be of type (and T1 ... Tn) where T1 ...Tn 
>are the values of the :type slot options contained in all of the slot specifiers 
>... The consequences of attempting to store in a slot a value that does not 
>satisfy the type of the slot are undefined."
>>
>>   
>>> This specific problem might be fixed by setting the type to
>>> (or null integer).
>>>     
>>
>> That works in openMCL.
>>
>>   
>>> I'm back hacking on Elephant for a few days so this is a good time to
>>> chase any remaining issues to ground.  Did you get the 0.6.0, BDB 4.3
>>> and MCL working together?
>>>     
>>
>> Yes, in openMCL 1.0, the test suites all pass.
>>
>> OpenMCL is well on its way to the 1.1 release.  I think the serializer will 
>have to be modified to work with the new release, in which character and stream 
>handling have been reworked to handle unicode.  I can send along the release 
>notes if you like. Here's the symptom in 1.1 pre-release 061024 with either 
>elephant 6.0/db4.3 or elephant cvs/db4.4 (the ^@'s are unprintables):
>> CL-USER> (ele:open-store '(:bdb "/Users/gkhouri/db/"))
>> #<SLEEPYCAT::BDB-STORE-CONTROLLER #x88D894E>
>> CL-USER> (ELE:add-to-root "my key" "my Val")
>> "my Val"
>> CL-USER> (ele:get-from-root "my key")
>> "^@^@^@m^@^@"
>> T
>>
>> Thanks,
>> George
>>
>>   
>>> Ian
>>>
>>>     
>>
>>
>>   
>>> George Khouri wrote:
>>>     
>>>> Friends,
>>>> Testing  Elephant 0.6.0 against a postgres db, in OpenMCL 1.0, I found that 
>>>>       
>>> the close-cursor method fails since it tries to set the value of the 
>sql-cursor 
>>> slot "curkey" to NIL, while its type spec in the class declaration is 
>INTEGER.  
>>> Perhaps other lisps allow this.  
>>>     
>>>> If I change close-cursor to set curkey to -1 as below, the tests run fine.  
>I 
>>>>       
>>> don't know if there are other routines which check for a null value in that 
>>> cursor slot, in which case my change wouldn't work. Perhaps the type spec 
>should 
>>> be removed from the slot declaration instead?
>>>     
>>>> The code is in elephant/src/db-clsql/sql-collections.lisp.
>>>>
>>>> (defclass sql-cursor (cursor)
>>>>   ((keys :accessor :sql-crsr-ks :initarg :sql-cursor-keys :initform '())
>>>>    (curkey :accessor :sql-crsr-ck :initarg :sql-cursor-curkey :initform -1 
>>>>       
>>> :type integer))
>>>     
>>>>   (:documentation "A SQL cursor for traversing (primary) BTrees."))
>>>>
>>>> ...
>>>>
>>>> (defmethod cursor-close ((cursor sql-cursor))
>>>>   #-openmcl
>>>>   (setf (:sql-crsr-ck cursor) nil)
>>>>   #+openmcl 
>>>>   (setf (:sql-crsr-ck cursor) -1)  ; ** GK  
>>>>   (setf (cursor-initialized-p cursor) nil))
>>>>
>>>> Thanks,
>>>> George
>>>> --------
>>>> George Khouri
>>>> gk1 at four-four.com
>>>> _______________________________________________
>>>> elephant-devel site list
>>>> elephant-devel at common-lisp.net
>>>> http://common-lisp.net/mailman/listinfo/elephant-devel
>>>>   
>>>>       



More information about the elephant-devel mailing list