next up previous contents
Next: Ausführung von Anweisungen Up: Implementierungsaspekte Previous: Implementierungsaspekte

Abbildung von Datentypen

Die Funktion SQL.Map implementiert die Umsetzung von gewünschten auf vom Datentreiber unterstützte Datentypen. Abbildung gif 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:

 nnnnnnnn¯ 
PROCEDURE  Map* (c: Connection; type: Type; VAR mapType: Type): BOOLEAN;

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;



next up previous contents
Next: Ausführung von Anweisungen Up: Implementierungsaspekte Previous: Implementierungsaspekte



Christoph Steindl
Thu Jul 24 14:37:19 MET DST 1997