94 if ((strncmp(db,
"odbc", 4)!=0) || (strlen(db)<8)) {
95 SetError(-1,
"db argument should be started from odbc...",
"TODBCServer");
99 if (strncmp(db,
"odbc://", 7)==0) {
102 SetError(-1,
Form(
"not valid URL: %s", db),
"TODBCServer");
105 const char* driver =
"MyODBC";
106 const char* dbase = url.
GetFile();
108 if (*dbase==
'/') dbase++;
110 if ((!uid || (*uid==0)) && (strlen(url.
GetUser())>0)) {
117 connstr.
Form(
"DRIVER={%s};"
123 driver, url.
GetHost(), dbase, uid, pw);
132 if (strncmp(db,
"odbcd://", 8)==0) {
136 if (strncmp(db,
"odbcn://", 8)==0) {
138 simpleconnect =
kTRUE;
140 SetError(-1,
"db argument is invalid",
"TODBCServer");
144 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &
fHenv);
148 retcode = SQLSetEnvAttr(
fHenv, SQL_ATTR_ODBC_VERSION, (
void*)SQL_OV_ODBC3, 0);
152 retcode = SQLAllocHandle(SQL_HANDLE_DBC,
fHenv, &
fHdbc);
156 retcode = SQLSetConnectAttr(
fHdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER) 5, 0);
167 retcode = SQLConnect(
fHdbc, (SQLCHAR*) connstr.
Data(), SQL_NTS,
168 (SQLCHAR*) uid, SQL_NTS,
169 (SQLCHAR*) pw, SQL_NTS);
171 retcode = SQLDriverConnect(
fHdbc, hwnd,
172 (SQLCHAR*) connstr.
Data(), SQL_NTS,
173 (SQLCHAR*) sbuf,
sizeof(sbuf), &reslen, SQL_DRIVER_NOPROMPT);
179 retcode = SQLGetInfo(
fHdbc, SQL_USER_NAME, sbuf,
sizeof(sbuf), &reslen);
183 retcode = SQLGetInfo(
fHdbc, SQL_DBMS_NAME, sbuf,
sizeof(sbuf), &reslen);
188 retcode = SQLGetInfo(
fHdbc, SQL_DBMS_VER, sbuf,
sizeof(sbuf), &reslen);
194 retcode = SQLGetConnectAttr(
fHdbc, SQL_ATTR_CURRENT_CATALOG, sbuf,
sizeof(sbuf), &reslen1);
196 if (
fDB.Length()==0)
fDB = sbuf;
198 retcode = SQLGetInfo(
fHdbc, SQL_SERVER_NAME, sbuf,
sizeof(sbuf), &reslen);
244 retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
245 if ((retcode!=SQL_SUCCESS) && (retcode!=SQL_SUCCESS_WITH_INFO))
return nullptr;
247 retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (
void*)SQL_OV_ODBC3, 0);
248 if ((retcode!=SQL_SUCCESS) && (retcode!=SQL_SUCCESS_WITH_INFO))
return nullptr;
250 TList* lst =
nullptr;
252 char namebuf[2048], optbuf[2048];
253 SQLSMALLINT reslen1, reslen2;
256 strlcpy(namebuf,
"",2048);
257 strlcpy(optbuf,
"",2048);
259 retcode = SQLDrivers(henv, (!lst ? SQL_FETCH_FIRST : SQL_FETCH_NEXT),
260 (SQLCHAR*) namebuf,
sizeof(namebuf), &reslen1,
261 (SQLCHAR*) optbuf,
sizeof(optbuf), &reslen2);
263 retcode = SQLDataSources(henv, (!lst ? SQL_FETCH_FIRST : SQL_FETCH_NEXT),
264 (SQLCHAR*) namebuf,
sizeof(namebuf), &reslen1,
265 (SQLCHAR*) optbuf,
sizeof(optbuf), &reslen2);
267 if (retcode==SQL_NO_DATA)
break;
268 if ((retcode==SQL_SUCCESS) || (retcode==SQL_SUCCESS_WITH_INFO)) {
273 for (
int n = 0;
n < reslen2 - 1;
n++)
274 if (optbuf[
n] ==
'\0')
279 }
while ((retcode==SQL_SUCCESS) || (retcode==SQL_SUCCESS_WITH_INFO));
281 SQLFreeHandle(SQL_HANDLE_ENV, henv);
472 SQLAllocHandle(SQL_HANDLE_STMT,
fHdbc, &hstmt);
474 SQLCHAR* schemaName =
nullptr;
475 SQLSMALLINT schemaNameLength = 0;
489 SQLCHAR* tableName =
nullptr;
490 SQLSMALLINT tableNameLength = 0;
493 tableName = (SQLCHAR*) wild;
494 tableNameLength = strlen(wild);
495 SQLSetStmtAttr(hstmt, SQL_ATTR_METADATA_ID, (SQLPOINTER) SQL_FALSE, 0);
498 retcode = SQLTables(hstmt,
nullptr, 0, schemaName, schemaNameLength, tableName, tableNameLength, (SQLCHAR*)
"TABLE", 5);
500 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
549 #define STR_LEN 128+1
550 #define REM_LEN 254+1
558 SQLLEN columnSize, bufferLength, charOctetLength, ordinalPosition;
559 SQLSMALLINT dataType, decimalDigits, numPrecRadix, nullable;
560 SQLSMALLINT sqlDataType, datetimeSubtypeCode;
566 SQLLEN cbCatalog, cbSchema, cbTableName, cbColumnName;
567 SQLLEN cbDataType, cbTypeName, cbColumnSize, cbBufferLength;
568 SQLLEN cbDecimalDigits, cbNumPrecRadix, cbNullable, cbRemarks;
569 SQLLEN cbColumnDefault, cbSQLDataType, cbDatetimeSubtypeCode, cbCharOctetLength;
570 SQLLEN cbOrdinalPosition, cbIsNullable;
573 SQLAllocHandle(SQL_HANDLE_STMT,
fHdbc, &hstmt);
575 retcode = SQLColumns(hstmt,
nullptr, 0,
nullptr, 0, (SQLCHAR*) tablename, SQL_NTS,
nullptr, 0);
577 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
581 TList* lst =
nullptr;
585 SQLBindCol(hstmt, 1, SQL_C_CHAR, szCatalog,
STR_LEN,&cbCatalog);
586 SQLBindCol(hstmt, 2, SQL_C_CHAR, szSchema,
STR_LEN, &cbSchema);
587 SQLBindCol(hstmt, 3, SQL_C_CHAR, szTableName,
STR_LEN,&cbTableName);
588 SQLBindCol(hstmt, 4, SQL_C_CHAR, szColumnName,
STR_LEN, &cbColumnName);
589 SQLBindCol(hstmt, 5, SQL_C_SSHORT, &dataType, 0, &cbDataType);
590 SQLBindCol(hstmt, 6, SQL_C_CHAR, szTypeName,
STR_LEN, &cbTypeName);
591 SQLBindCol(hstmt, 7, SQL_C_SLONG, &columnSize, 0, &cbColumnSize);
592 SQLBindCol(hstmt, 8, SQL_C_SLONG, &bufferLength, 0, &cbBufferLength);
593 SQLBindCol(hstmt, 9, SQL_C_SSHORT, &decimalDigits, 0, &cbDecimalDigits);
594 SQLBindCol(hstmt, 10, SQL_C_SSHORT, &numPrecRadix, 0, &cbNumPrecRadix);
595 SQLBindCol(hstmt, 11, SQL_C_SSHORT, &nullable, 0, &cbNullable);
596 SQLBindCol(hstmt, 12, SQL_C_CHAR, szRemarks,
REM_LEN, &cbRemarks);
597 SQLBindCol(hstmt, 13, SQL_C_CHAR, szColumnDefault,
STR_LEN, &cbColumnDefault);
598 SQLBindCol(hstmt, 14, SQL_C_SSHORT, &sqlDataType, 0, &cbSQLDataType);
599 SQLBindCol(hstmt, 15, SQL_C_SSHORT, &datetimeSubtypeCode, 0, &cbDatetimeSubtypeCode);
600 SQLBindCol(hstmt, 16, SQL_C_SLONG, &charOctetLength, 0, &cbCharOctetLength);
601 SQLBindCol(hstmt, 17, SQL_C_SLONG, &ordinalPosition, 0, &cbOrdinalPosition);
602 SQLBindCol(hstmt, 18, SQL_C_CHAR, szIsNullable,
STR_LEN, &cbIsNullable);
604 retcode = SQLFetch(hstmt);
606 while ((retcode == SQL_SUCCESS) || (retcode == SQL_SUCCESS_WITH_INFO)) {
610 Int_t data_size = -1;
611 Int_t data_length = -1;
612 Int_t data_scale = -1;
613 Int_t data_sign = -1;
618 data_size = columnSize;
619 data_length = charOctetLength;
622 case SQL_LONGVARCHAR:
624 data_size = columnSize;
625 data_length = charOctetLength;
630 data_size = columnSize;
631 data_length = columnSize;
632 data_scale = decimalDigits;
638 data_size = columnSize;
643 data_size = columnSize;
648 data_size = columnSize;
653 case SQL_LONGVARBINARY:
655 data_size = columnSize;
657 case SQL_TYPE_TIMESTAMP:
659 data_size = columnSize;
663 if (!lst) lst =
new TList;
666 (
const char *) szTypeName,
674 retcode = SQLFetch(hstmt);
677 SQLFreeHandle(SQL_HANDLE_STMT, hstmt);