00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 require_once 'creole/CreoleTypes.php';
00024
00032 class ODBCTypes extends CreoleTypes {
00033
00037 protected static $typeMap = null;
00038
00042 protected static $reverseMap = null;
00043
00051 public static function loadTypeMap($conn = null)
00052 {
00053 if (self::$typeMap !== null && count(self::$typeMap) > 0)
00054 return;
00055
00056 if ($conn == null)
00057 throw new SQLException('No connection specified when loading ODBC type map.');
00058
00059 self::$typeMap = array();
00060
00061 $result = @odbc_gettypeinfo($conn->getResource());
00062
00063 if ($result === false)
00064 throw new SQLException('Failed to retrieve type info.', $conn->nativeError());
00065
00066 $rowNum = 1;
00067
00068 while (odbc_fetch_row($result, $rowNum++))
00069 {
00070 $odbctypeid = odbc_result($result, 'DATA_TYPE');
00071 $odbctypename = odbc_result($result, 'TYPE_NAME');
00072
00073 switch ($odbctypeid)
00074 {
00075 case SQL_CHAR:
00076 self::$typeMap[$odbctypename] = CreoleTypes::CHAR;
00077 break;
00078 case SQL_VARCHAR:
00079 self::$typeMap[$odbctypename] = CreoleTypes::VARCHAR;
00080 break;
00081 case SQL_LONGVARCHAR:
00082 self::$typeMap[$odbctypename] = CreoleTypes::LONGVARCHAR;
00083 break;
00084 case SQL_DECIMAL:
00085 self::$typeMap[$odbctypename] = CreoleTypes::DECIMAL;
00086 break;
00087 case SQL_NUMERIC:
00088 self::$typeMap[$odbctypename] = CreoleTypes::NUMERIC;
00089 break;
00090 case SQL_BIT:
00091 self::$typeMap[$odbctypename] = CreoleTypes::BOOLEAN;
00092 break;
00093 case SQL_TINYINT:
00094 self::$typeMap[$odbctypename] = CreoleTypes::TINYINT;
00095 break;
00096 case SQL_SMALLINT:
00097 self::$typeMap[$odbctypename] = CreoleTypes::SMALLINT;
00098 break;
00099 case SQL_INTEGER:
00100 self::$typeMap[$odbctypename] = CreoleTypes::INTEGER;
00101 break;
00102 case SQL_BIGINT:
00103 self::$typeMap[$odbctypename] = CreoleTypes::BIGINT;
00104 break;
00105 case SQL_REAL:
00106 self::$typeMap[$odbctypename] = CreoleTypes::REAL;
00107 break;
00108 case SQL_FLOAT:
00109 self::$typeMap[$odbctypename] = CreoleTypes::FLOAT;
00110 break;
00111 case SQL_DOUBLE:
00112 self::$typeMap[$odbctypename] = CreoleTypes::DOUBLE;
00113 break;
00114 case SQL_BINARY:
00115 self::$typeMap[$odbctypename] = CreoleTypes::BINARY;
00116 break;
00117 case SQL_VARBINARY:
00118 self::$typeMap[$odbctypename] = CreoleTypes::VARBINARY;
00119 break;
00120 case SQL_LONGVARBINARY:
00121 self::$typeMap[$odbctypename] = CreoleTypes::LONGVARBINARY;
00122 break;
00123 case SQL_DATE:
00124 self::$typeMap[$odbctypename] = CreoleTypes::DATE;
00125 break;
00126 case SQL_TIME:
00127 self::$typeMap[$odbctypename] = CreoleTypes::TIME;
00128 break;
00129 case SQL_TIMESTAMP:
00130 self::$typeMap[$odbctypename] = CreoleTypes::TIMESTAMP;
00131 break;
00132 case SQL_TYPE_DATE:
00133 self::$typeMap[$odbctypename] = CreoleTypes::DATE;
00134 break;
00135 case SQL_TYPE_TIME:
00136 self::$typeMap[$odbctypename] = CreoleTypes::TIME;
00137 break;
00138 case SQL_TYPE_TIMESTAMP:
00139 self::$typeMap[$odbctypename] = CreoleTypes::TIMESTAMP;
00140 break;
00141 default:
00142 self::$typeMap[$odbctypename] = CreoleTypes::OTHER;
00143 break;
00144 }
00145 }
00146
00147 @odbc_free_result($result);
00148 }
00149
00156 public static function getType($nativeType)
00157 {
00158 if (!self::$typeMap)
00159 self::loadTypeMap();
00160
00161 $t = strtoupper($nativeType);
00162
00163 if (isset(self::$typeMap[$t])) {
00164 return self::$typeMap[$t];
00165 } else {
00166 return CreoleTypes::OTHER;
00167 }
00168 }
00169
00178 public static function getNativeType($creoleType)
00179 {
00180 if (!self::$typeMap)
00181 self::loadTypeMap();
00182
00183 if (self::$reverseMap === null) {
00184 self::$reverseMap = array_flip(self::$typeMap);
00185 }
00186 return @self::$reverseMap[$creoleType];
00187 }
00188
00189 }