Die Funktion SQL.Map implementiert die Umsetzung von gewünschten auf vom Datentreiber unterstützte Datentypen. Abbildung zeigt, wie versucht wird, nichtunterstützte Datentypen zu emulieren. In der Graphik deutet ein Pfeil an, daß der Datentyp, auf den der Pfeil zeigt, für den jeweils anderen Datentyp verwendet werden kann. Es ist ohne Informationsverlust möglich, Integer anstatt SmallInt, TinyInt oder Bit zu verwenden. Ebenso kann man Double anstatt von Float und Real verwenden. Weiters ist es immer möglich, numerische Werte oder Uhrzeit und Datum in Zeichenketten umzuwandeln. Kurze Zeichenkettendatentypen können wieder durch längere ersetzt werden. Kurze binäre Datentypen können durch längere ersetzt werden, nicht aber durch Zeichenkettendatentypen. Unter gewissen Umständen ist es möglich, den Datentyp Numeric durch SmallInt oder Integer zu ersetzen: wenn Numeric ohne Nachkommastellen definiert wurde und die Anzahl der signifikanten Stellen den Wertebereich von SmallInt oder Integer nicht übersteigt. Bei der Umsetzung wird darauf geachtet, daß es deshalb keine Endlosschleife gibt. Wenn man schlußendlich bei LVarChar oder LVarBin angelangt ist und auch diese Datentypen nicht unterstützt werden, kann der gewünschte Datentyp nicht abgebildet werden und Map liefert FALSE zurück.
Die Prozedur Map versucht nun in einer LOOP-Schleife, einen Datenbankdatentyp zu finden, der dem gewünschten Datentyp entspricht.
Figure: Abbildung von Datentypen
Im Pseudocode sieht die Funktion wie folgt aus:
BEGIN
mapType.sqlType := 0; mapType.prec := 0; mapType.scale := 0;
LOOP
CASE type.sqlType OF
SQLBit:
IF c supports SQLBit THEN mapType.sqlType := SQLBit; RETURN TRUE
ELSE type.sqlType := SQLTinyInt
END
\< SQLTinyInt:
IF c supports SQLTinyInt THEN mapType.sqlType := SQLTinyInt; RETURN TRUE
ELSE type.sqlType := SQLSmallInt
END
\< SQLBigInt:
IF c supports SQLBigInt THEN mapType.sqlType := SQLBigInt; RETURN TRUE
ELSE type.sqlType := SQLChar; prec := 20
END
\< SQLLVarChar:
IF c supports SQLLVarChar with prec THEN
mapType.sqlType := SQLLVarChar; mapType.prec := type.prec; RETURN TRUE
ELSE RETURN FALSE
END
\< SQLVarChar:
IF c supports SQLVarChar with prec THEN
mapType.sqlType := SQLVarChar; mapType.prec := type.prec; RETURN TRUE
ELSE type.sqlType := SQLLVarChar
END
\< SQLChar:
IF c supports SQLChar with prec THEN
mapType.sqlType := SQLChar; mapType.prec := type.prec; RETURN TRUE
ELSE type.sqlType := SQLVarChar
END
\< SQLNumeric:
IF c supports SQLNumeric with prec and scale THEN
mapType.sqlType := SQLNumeric; mapType.prec := type.prec;
mapType.scale := type.scale; RETURN TRUE
ELSIF scale = 0 THEN
IF type.prec < 5 and c supports SQLSmallInt THEN type.sqlType := SQLSmallInt
ELSIF type.prec < 10 and c supports SQLInteger THEN type.sqlType := SQLInteger
ELSE type.sqlType := SQLChar; type.prec := type.prec + 2 (* for comma and 0X *)
END
ELSE type.sqlType := SQLChar; type.prec := type.prec + 2 (* for comma and 0X *)
END
\< SQLInteger:
IF c supports SQLInteger THEN mapType.sqlType := SQLInteger; RETURN TRUE
ELSE type.sqlType := SQLNumeric; type.prec := 10; type.scale := 0
END
...
END
END Map;
nnnnnnnn¯
PROCEDURE Map* (c: Connection; type: Type; VAR mapType: Type): BOOLEAN;