Module: result-set-implementation Author: eec Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND // $HopeName: D-databases-sql!conversion.dylan(trunk.5) $ define open generic default-conversion(value :: ) => (converted-value :: ); define method default-conversion(value :: ) => (converted-value :: ) pointer-value(value); end method; define method default-conversion(value :: ) => (converted-value :: ) as(, value) end method; define method default-conversion(value :: ) => (converted-value :: ) pointer-value(value); end method; define method default-conversion(value :: ) => (converted-value :: ) pointer-value(value); end method; define method conversion-helper (x :: , #key signed? :: = #t) => (new-x :: ) x end method conversion-helper; define method conversion-helper (x :: , #key signed? :: = #t) => (new-x :: big/) if (signed?) if (machine-word-less-than?(x, coerce-integer-to-machine-word(0))) make(, low: x, high: coerce-integer-to-machine-word(-1)) else make(, low: x, high: coerce-integer-to-machine-word(0)) end else make(, low: x, high: coerce-integer-to-machine-word(0)) end end method conversion-helper; define method default-conversion(value :: ) => (converted-value :: type-union(big/, )) conversion-helper(pointer-value(value)); end method; define sideways method as(type == , value :: ) => (as-value :: ) pointer-value(value); end method; define method default-conversion(value :: ) => (converted-value :: ); pointer-value(value); end method; define sideways method as(type == , value :: ) => (as-value :: ); pointer-value(value); end method; define method default-conversion(value :: ) => (converted-value :: ) // This is really dumb but I don't know how to do it otherwise. as(, make(, address: value.pointer-address)); end method; define sideways method as(type == , value :: ) => (as-value :: ) as(, make(, address: value.pointer-address)); end method; define constant $default-coercion = #"default-coercion"; define constant $no-coercion = #"no-coercion"; define constant = type-union(singleton($default-coercion),singleton($no-coercion), , ); define generic convert-value(coercion-policy :: , value :: , key :: ) => (converted-value :: ); define method convert-value(coercion-policy == $default-coercion, value :: , key :: ) => (converted-value :: ) default-conversion(value) end method; define method convert-value(coercion-policy :: , value :: , key :: ) => (converted-value :: ) let not-found = make(); let conversion-function = element(coercion-policy, key, default: not-found); if (conversion-function ~== not-found) if (instance?(conversion-function, ) = #f) error("Coercion-policy sequence contains " "an item that is not a function."); end if; conversion-function(value); else //++ signal a warning? convert-value(#"default-coercion", value, key) end if; end method; define generic acquire-null-value(indicator :: , index :: ) => (null-value :: ); define method acquire-null-value(indicator :: , index :: ) => (null-value :: ); indicator; end method; define method acquire-null-value(indicator == $no-indicator, index :: ) => (null-value :: ); error("no output indicator provided.\n"); //+++ throw proper condition end method; define method acquire-null-value(indicator :: , index :: ) => (null-value :: ); let not-found = make(); let null-value = element(indicator, index, default: not-found); if (null-value == not-found) error("no output indicator provided.\n"); //+++ throw proper condition else null-value end if; end method; define sideways method as(type == , c-float-value :: type-union(, )) => (as-value :: ) let dylan-float = pointer-value(c-float-value); truncate(dylan-float); end method;