diff --git a/Builds/Gcc.linux.cmake/CMakeLists.txt b/Builds/Gcc.linux.cmake/CMakeLists.txt new file mode 100644 index 00000000..6ac5d276 --- /dev/null +++ b/Builds/Gcc.linux.cmake/CMakeLists.txt @@ -0,0 +1,84 @@ +cmake_minimum_required(VERSION 3.8) +project(firebird_odbc_driver CXX) + +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel." FORCE) +endif() +message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") + +add_compile_options( + "$<$:-O0;-g3;-D_DEBUG;-DDEBUG;-DLOGGING;-fexceptions>" + "$<$:-O3;-DNDEBUG;-ftree-loop-vectorize;-ffast-math>" +) + +set(FBODBC_ARCH ${CMAKE_HOST_SYSTEM_PROCESSOR}) + +if(${FBODBC_ARCH} STREQUAL "x86") + add_definitions(-DFBODBC_ARCH_X86) + set(FBODBC_ARCH_X86 1 CACHE BOOL "Arch x86") + message(STATUS "Will compile for ${FBODBC_ARCH} architecture") + +elseif(${FBODBC_ARCH} STREQUAL "x86_64") + add_definitions(-DFBODBC_ARCH_X86_64) + set(FBODBC_ARCH_X86_64 1 CACHE BOOL "Arch x86_64") + message(STATUS "Will compile for ${FBODBC_ARCH} architecture") + +elseif(${FBODBC_ARCH} STREQUAL "aarch64" OR ${FBODBC_ARCH} STREQUAL "arm64") + add_definitions(-DFBODBC_ARCH_ARM64) + set(FBODBC_ARCH_ARM64 1 CACHE BOOL "Arch ARM64") + message(STATUS "Will compile for ${FBODBC_ARCH} architecture") + +else() + add_definitions(-DFBODBC_ARCH_GENERIC) + set(FBODBC_ARCH_GENERIC 1 CACHE BOOL "Arch generic") + message(WARNING "Architecture <${FBODBC_ARCH}> conditionally supported") +endif() + +if(FBODBC_ARCH_X86 OR FBODBC_ARCH_X86_64) + add_definitions(-msse4.1) +endif() + +find_package(ODBC REQUIRED) + +set(ODBCMANAGER "unixODBC") +add_definitions("-D${ODBCMANAGER}") + +set(FBODBC_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../..") + +include_directories("${FBODBC_SRC_DIR}/Headers") +include_directories("${FBODBC_SRC_DIR}/FBClient.Headers") + +file(READ "../makefile.sources" ConfigContents) +string(REPLACE "\\\n" "" ConfigContents "${ConfigContents}") +string(REPLACE "\n" ";" ConfigContents "${ConfigContents}") + +foreach(NameAndValue ${ConfigContents}) + # Strip leading spaces + string(REGEX REPLACE "^[ ]+" "" NameAndValue ${NameAndValue}) + # Find variable name + string(REGEX MATCH "^[^=]+" Name ${NameAndValue}) + # Find the value + string(REPLACE "${Name}=" "" Value ${NameAndValue}) + # Strip trailing spaces in name + string(REGEX REPLACE "[ ]+" "" Name ${Name}) + # Strip tabs & spaces in value and convert it to list + string(REGEX REPLACE "^[ |\t]+" "" Value ${Value}) + string(REGEX REPLACE "[\t]+" "" Value ${Value}) + string(REGEX REPLACE "[ ]+" ";" Value ${Value}) + # Set the variable + set(${Name} ${Value}) +endforeach() + +list(TRANSFORM ISCDBCSRC PREPEND "${FBODBC_SRC_DIR}/IscDbc/") +list(TRANSFORM ODBCJDBCSRC PREPEND "${FBODBC_SRC_DIR}/") +list(TRANSFORM ODBCJDBCSETUPSRC_LINUX PREPEND "${FBODBC_SRC_DIR}/") + +add_library(objlib OBJECT ${ISCDBCSRC} ${ODBCJDBCSRC} ${ODBCJDBCSETUPSRC_LINUX}) +set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1) +target_compile_features(objlib PUBLIC cxx_std_17) + +add_library(OdbcFb SHARED $) +add_library(OdbcFbStatic STATIC $) + +target_link_libraries(OdbcFb PRIVATE dl PRIVATE crypt PRIVATE odbcinst) +target_link_libraries(OdbcFbStatic PRIVATE dl PRIVATE crypt PRIVATE odbcinst) diff --git a/IscDbc/IscArray.cpp b/IscDbc/IscArray.cpp index dfb80cee..a4ed16f3 100644 --- a/IscDbc/IscArray.cpp +++ b/IscDbc/IscArray.cpp @@ -46,8 +46,8 @@ void CAttrArray::loadAttributes ( IscStatement *stmt, const char * nameRelation, { ISC_STATUS statusVector [20]; IscConnection * connection = stmt->connection; - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; if (!connection->GDS->_get_transaction_handle( statusVector, &transactionHandle, stmt->startTransaction() ) && @@ -151,7 +151,7 @@ JString CAttrArray::getFbSqlType() { char temp [30]; char name [80]; - char * ch = temp; + const char * ch = temp; char sqlscale = arrDesc.array_desc_scale; unsigned short sqllen = arrDesc.array_desc_length; @@ -245,16 +245,15 @@ JString CAttrArray::getFbSqlType() ch = "*unknown type*"; } - int len = sprintf (name, "%s[", ch); - ch = name + len; + unsigned len = 0; + len += snprintf (name + len, sizeof(name) - len, "%s[", ch); + for(int i = 0; i < arrDesc.array_desc_dimensions; i++) { - len = sprintf ( ch , "%d:%d,", arrDesc.array_desc_bounds[i].array_bound_lower - , arrDesc.array_desc_bounds[i].array_bound_upper); - ch += len; + len += snprintf (name + len, sizeof(name) - len, "%d:%d,", + arrDesc.array_desc_bounds[i].array_bound_lower, arrDesc.array_desc_bounds[i].array_bound_upper); } - *(ch-1) = ']'; - *ch = '\0'; + len += snprintf (name + len, sizeof(name) - len, "]"); return name; } @@ -372,16 +371,16 @@ void IscArray::getBytesFromArray() IscConnection * connection = statement->connection; ISC_LONG lenbuf = arrBufDataSize; - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; bool ret = - connection->GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) - || - connection->GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) - || - connection->GDS->_array_get_slice(statusVector, &dbHandle, &transactionHandle, - arrayId, &arrDesc, arrBufData, &lenbuf); + connection->GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) + || + connection->GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) + || + connection->GDS->_array_get_slice(statusVector, &dbHandle, &transactionHandle, + arrayId, &arrDesc, arrBufData, &lenbuf); if ( ret ) THROW_ISC_EXCEPTION_LEGACY (connection, statusVector); @@ -471,13 +470,13 @@ void IscArray::fetchArrayToString() switch(arrTypeElement) { case blr_short : - len=sprintf(ptDst,"%i",*(short*)ptSrc); + len=sprintf(ptDst,"%" PRId16,*(int16_t*)ptSrc); break; case blr_long : - len=sprintf(ptDst,"%ld",*(int*)ptSrc); + len=sprintf(ptDst,"%" PRId32,*(int32_t*)ptSrc); break; case blr_int64 : - len=sprintf(ptDst,"%lld",*(__int64*)ptSrc); + len=sprintf(ptDst,"%" PRId64,*(int64_t*)ptSrc); break; case blr_float : len=sprintf(ptDst,"%.4g",*(float*)ptSrc); @@ -510,16 +509,16 @@ void IscArray::writeBlob(char * sqldata) memset( arrayId, 0, sizeof ( ISC_QUAD ) ); ISC_LONG len = getSegmentLength(0); - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; bool ret = - GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) - || - GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) - || - GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, - arrayId, &arrDesc, (char*) Stream::getSegment(0), &len ); + GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) + || + GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) + || + GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, + arrayId, &arrDesc, (char*) Stream::getSegment(0), &len ); if ( ret ) THROW_ISC_EXCEPTION_LEGACY (connection, statusVector); @@ -534,16 +533,16 @@ void IscArray::writeBlob(char * sqldata, char *data, ISC_LONG length) arrayId = (ISC_QUAD*)sqldata; memset( arrayId, 0, sizeof ( ISC_QUAD ) ); - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; bool ret = - GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) - || - GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) - || - GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, - arrayId, &arrDesc, data, &length ); + GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) + || + GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) + || + GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, + arrayId, &arrDesc, data, &length ); if ( ret ) THROW_ISC_EXCEPTION_LEGACY (connection, statusVector); @@ -715,16 +714,16 @@ void IscArray::writeStringHexToBlob(char * sqldata, char *data, int length) ISC_LONG lenbuf = arrBufDataSize; - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; bool ret = - GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) - || - GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) - || - GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, - arrayId, &arrDesc, arrBufData, &lenbuf ); + GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) + || + GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) + || + GDS->_array_put_slice ( statusVector, &dbHandle, &transactionHandle, + arrayId, &arrDesc, arrBufData, &lenbuf ); if ( ret ) THROW_ISC_EXCEPTION_LEGACY (connection, statusVector); @@ -751,6 +750,9 @@ void IscArray::writeArray(Value * value) case String: convStringToArray ( value->data.string.string , (int)strlen( value->data.string.string ) ); break; + + default: + break; } // End switch (value->type) ISC_STATUS statusVector [20]; @@ -759,16 +761,16 @@ void IscArray::writeArray(Value * value) memset( arrayId, 0, sizeof ( ISC_QUAD )); - isc_tr_handle transactionHandle = NULL; - isc_db_handle dbHandle = NULL; + isc_tr_handle transactionHandle = 0; + isc_db_handle dbHandle = 0; bool ret = - connection->GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) - || - connection->GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) - || - connection->GDS->_array_put_slice( statusVector, &dbHandle, &transactionHandle, - arrayId, &arrDesc, arrBufData, &lenbuf); + connection->GDS->_get_transaction_handle( statusVector, &transactionHandle, statement->startTransaction() ) + || + connection->GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ) + || + connection->GDS->_array_put_slice( statusVector, &dbHandle, &transactionHandle, + arrayId, &arrDesc, arrBufData, &lenbuf); if (ret || lenbuf != arrBufDataSize) THROW_ISC_EXCEPTION_LEGACY (connection, statusVector); diff --git a/IscDbc/IscColumnPrivilegesResultSet.cpp b/IscDbc/IscColumnPrivilegesResultSet.cpp index d1fc9f9f..23fb98a9 100644 --- a/IscDbc/IscColumnPrivilegesResultSet.cpp +++ b/IscDbc/IscColumnPrivilegesResultSet.cpp @@ -124,7 +124,7 @@ bool IscColumnPrivilegesResultSet::nextFetch() break; } - char * nullable = sqlda->getVarying (8, len1); + const char * nullable = sqlda->getVarying (8, len1); if ( *nullable == '1' ) sqlda->updateVarying ( 8, "YES" ); else diff --git a/IscDbc/IscColumnsResultSet.cpp b/IscDbc/IscColumnsResultSet.cpp index a2891f96..060be7ee 100644 --- a/IscDbc/IscColumnsResultSet.cpp +++ b/IscDbc/IscColumnsResultSet.cpp @@ -221,9 +221,9 @@ bool IscColumnsResultSet::nextFetch() if ( array ) { int len; - char * relation_name = sqlda->getVarying ( 3, len); + char * relation_name = (char*)sqlda->getVarying ( 3, len); relation_name[len] = '\0'; - char * field_name = sqlda->getVarying ( 4, len); + char * field_name = (char*)sqlda->getVarying ( 4, len); field_name[len] = '\0'; arrAttr.loadAttributes ( statement, relation_name, field_name, sqlType.subType ); diff --git a/IscDbc/IscConnection.cpp b/IscDbc/IscConnection.cpp index 1a09c32f..310a8417 100644 --- a/IscDbc/IscConnection.cpp +++ b/IscDbc/IscConnection.cpp @@ -1931,7 +1931,7 @@ void IscConnection::openDatabase(const char * dbName, Properties * properties) { int len1 = (int)strlen( attachment->userName ); int len2; - char *beg = resultSet.sqlda->getVarying( 5, len2 ); + char *beg = (char*)resultSet.sqlda->getVarying( 5, len2 ); char *end = beg + len2; char *save = end; diff --git a/IscDbc/IscTablesResultSet.cpp b/IscDbc/IscTablesResultSet.cpp index 5c56abdd..a5a0a83b 100644 --- a/IscDbc/IscTablesResultSet.cpp +++ b/IscDbc/IscTablesResultSet.cpp @@ -101,12 +101,14 @@ void IscTablesResultSet::getTables(const char * catalog, const char * schemaPatt && sqlAllParam && !(tableNamePattern && *tableNamePattern) ) { - ptSql = "select distinct cast (NULL as varchar(7)) as table_cat,\n" // 1 - "cast (tbl.rdb$owner_name as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_schem,\n" // 2 + pt = ptSql; + addString(pt, "select distinct cast (NULL as varchar(7)) as table_cat,\n" // 1 + "cast (tbl.rdb$owner_name as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_schem,\n" // 2 "cast (NULL as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_name,\n" // 3 "cast (NULL as varchar(13)) as table_type,\n" // 4 "cast (NULL as varchar(255)) as remarks\n" // 5 - "from rdb$relations tbl\n"; + "from rdb$relations tbl\n"); + *pt = '\0'; sqlAllParam = 2; // unique owners break; } @@ -116,12 +118,14 @@ void IscTablesResultSet::getTables(const char * catalog, const char * schemaPatt && sqlAllParam == 2 && !(tableNamePattern && *tableNamePattern) ) { - ptSql = "select cast (NULL as varchar(7)) as table_cat,\n" // 1 - "cast (NULL as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_schem,\n" // 2 + pt = ptSql; + addString(pt, "select cast (NULL as varchar(7)) as table_cat,\n" // 1 + "cast (NULL as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_schem,\n" // 2 "cast (NULL as varchar(" MACRO_TO_STR(MAX_META_IDENT_LEN) ")) as table_name,\n" // 3 "cast ('SYSTEM TABLE' as varchar(13)) as table_type,\n" // 4 "cast (NULL as varchar(255)) as remarks\n" // 5 - "from rdb$database tbl\n"; + "from rdb$database tbl\n"); + *pt = '\0'; sqlAllParam = 3; // unique table types break; } diff --git a/IscDbc/IscUserEvents.cpp b/IscDbc/IscUserEvents.cpp index a8cf52e0..9eee024a 100644 --- a/IscDbc/IscUserEvents.cpp +++ b/IscDbc/IscUserEvents.cpp @@ -116,7 +116,7 @@ void IscUserEvents::queEvents( void * interfase ) { ISC_STATUS statusVector[20]; - isc_db_handle dbHandle = NULL; + isc_db_handle dbHandle = 0; connection->GDS->_get_database_handle( statusVector, &dbHandle, connection->databaseHandle ); if ( statusVector [1] ) diff --git a/IscDbc/Mlist.h b/IscDbc/Mlist.h index 6c4ad2c4..e07d1985 100644 --- a/IscDbc/Mlist.h +++ b/IscDbc/Mlist.h @@ -172,7 +172,7 @@ class MList int SearchAndInsert(T * key) { - register int ret = 1, i, l = 0, u = count - 1; + int ret = 1, i, l = 0, u = count - 1; int size = sizeof(T); T * buf = ptRoot; @@ -206,7 +206,7 @@ class MList int Search(T * key) { - register int ret = 1, i, l = 0, u = count - 1; + int ret = 1, i, l = 0, u = count - 1; int size = sizeof(T); T * buf = ptRoot; diff --git a/IscDbc/MultibyteConvert.cpp b/IscDbc/MultibyteConvert.cpp index 992e9a83..ea381d20 100644 --- a/IscDbc/MultibyteConvert.cpp +++ b/IscDbc/MultibyteConvert.cpp @@ -39,7 +39,7 @@ namespace IscDbcLibrary { struct IntlCharsets { - char *name; + const char *name; short lengthName; short code; short size; diff --git a/IscDbc/ParameterEvent.cpp b/IscDbc/ParameterEvent.cpp index 3d367b76..d5d4e476 100644 --- a/IscDbc/ParameterEvent.cpp +++ b/IscDbc/ParameterEvent.cpp @@ -35,7 +35,7 @@ ParameterEvent::ParameterEvent( ParameterEvent *next, const char *name, int leng { nextParameter = next; lengthNameEvent = length; - countEvents = ~0lu; + countEvents = ~0u; changed = false; nameEvent = new char[lengthNameEvent + 1]; diff --git a/IscDbc/Sqlda.cpp b/IscDbc/Sqlda.cpp index 4754c833..89a8c04e 100644 --- a/IscDbc/Sqlda.cpp +++ b/IscDbc/Sqlda.cpp @@ -629,11 +629,11 @@ void Sqlda::print() break; case SQL_SHORT: - printf ("%d", *(short*) p); + printf ("%" PRId16, *(int16_t*) p); break; case SQL_LONG: - printf ("%ld", *(int*) p); + printf ("%" PRId32, *(int32_t*) p); break; case SQL_FLOAT: @@ -1318,7 +1318,7 @@ int Sqlda::getInt (int index) return *(int*)( Var(index)->sqldata ); } -char * Sqlda::getText (int index, int &len) +const char * Sqlda::getText (int index, int &len) { CONVERSION_CHECK_DEBUG((Var(index)->sqltype) == SQL_TEXT); if( isNull ( index) ) @@ -1330,7 +1330,7 @@ char * Sqlda::getText (int index, int &len) return Var(index)->sqldata; } -char * Sqlda::getVarying (int index, int &len) +const char * Sqlda::getVarying (int index, int &len) { CONVERSION_CHECK_DEBUG((Var(index)->sqltype) == SQL_VARYING); if( isNull ( index) ) diff --git a/IscDbc/Sqlda.h b/IscDbc/Sqlda.h index 9c7b6e9e..090dc4eb 100644 --- a/IscDbc/Sqlda.h +++ b/IscDbc/Sqlda.h @@ -219,8 +219,8 @@ class Sqlda bool getBoolean(int index); short getShort(int index); int getInt(int index); - char* getText(int index, int& len); - char* getVarying(int index, int& len); + const char* getText(int index, int& len); + const char* getVarying(int index, int& len); void updateBoolean(int index, bool value); void updateShort(int index, short value); diff --git a/IscDbc/TimeStamp.cpp b/IscDbc/TimeStamp.cpp index 37808fe8..92e7d858 100644 --- a/IscDbc/TimeStamp.cpp +++ b/IscDbc/TimeStamp.cpp @@ -65,9 +65,9 @@ int TimeStamp::getTimeString(int length, char * buffer) decodeTime (nanos, time); int len = (int)strftime (buffer, length, "%Y-%m-%d %H:%M:%S", time); - int nano = (nanos % ISC_TIME_SECONDS_PRECISION) * STD_TIME_SECONDS_PRECISION; + int32_t nano = (nanos % ISC_TIME_SECONDS_PRECISION) * STD_TIME_SECONDS_PRECISION; if( nano ) - len+=sprintf(buffer+len,".%lu",nano); + len += sprintf(buffer+len, ".%" PRId32, nano); return len; } diff --git a/IscDbc/extodbc.cpp b/IscDbc/extodbc.cpp index db681b0f..0130ffb2 100644 --- a/IscDbc/extodbc.cpp +++ b/IscDbc/extodbc.cpp @@ -256,7 +256,7 @@ static StatInfo StatInfoBefore, StatInfoAfter; void getStatInformations(IscConnection * connection, char bNumberCall) { - struct timeb time_buffer; + struct timespec tspec; #define LARGE_NUMBER 696600000 /* to avoid overflow, get rid of decades) */ char items[] = @@ -288,9 +288,9 @@ void getStatInformations(IscConnection * connection, char bNumberCall) } ptStat->Remove(); - ftime(&time_buffer); + clock_gettime(CLOCK_REALTIME, &tspec); ptStat->elapsed = - (long)(time_buffer.time - LARGE_NUMBER) * 100 + (time_buffer.millitm / 10); + (long)(tspec.tv_sec - LARGE_NUMBER) * 100 + (tspec.tv_nsec / 1000000ul / 10ul); ThrowStatusWrapper status( GDS->_status ); try @@ -362,7 +362,7 @@ void getStatInformations(IscConnection * connection, char bNumberCall) int getStatInformations(IscConnection * connection, const void * info_buffer, int bufferLength,short *lengthPtr) { - struct timeb time_buffer; + struct timespec tspec; #define LARGE_NUMBER 696600000 /* to avoid overflow, get rid of decades) */ char items[] = @@ -384,9 +384,9 @@ int getStatInformations(IscConnection * connection, const void * info_buffer, in *lengthPtr = bufferLength; - ftime(&time_buffer); + clock_gettime(CLOCK_REALTIME, &tspec); ptStat->elapsed = - (long)(time_buffer.time - LARGE_NUMBER) * 100 + (time_buffer.millitm / 10); + (long)(tspec.tv_sec - LARGE_NUMBER) * 100 + (tspec.tv_nsec / 1000000ul / 10ul); ThrowStatusWrapper status( GDS->_status ); try @@ -470,7 +470,7 @@ const char * strFormatReport = int strBuildStatInformations(const void * info_buffer, int bufferLength, short *lengthPtr) { - signed int delta, length; + int64_t delta, length; char *p, c; const char * string = strFormatReport; @@ -530,12 +530,12 @@ int strBuildStatInformations(const void * info_buffer, int bufferLength, short * case 'b': case 'c': case 'x': - sprintf((char*)p, "%ld", delta); + sprintf((char*)p, "%" PRId64, delta); while (*p) p++; break; case 'e': - sprintf(p, "%ld.%.2ld", delta / 100, delta % 100); + sprintf(p, "%" PRId64 ".%.2" PRId64, delta / 100, delta % 100); while (*p) p++; break; diff --git a/MainUnicode.cpp b/MainUnicode.cpp index 1d3c8486..47341bc6 100644 --- a/MainUnicode.cpp +++ b/MainUnicode.cpp @@ -28,7 +28,6 @@ #include "OdbcEnv.h" #include "OdbcConnection.h" #include "OdbcStatement.h" -#include "SafeEnvThread.h" #include "Main.h" #define GETCONNECT_STMT( hStmt ) (((OdbcStatement*)hStmt)->connection) @@ -45,7 +44,7 @@ extern UINT codePage; // from Main.cpp template class ConvertingString { - enum typestring { NONE, WIDECHARS, BYTESCHARS }; + enum typestring { NONE, /*WIDECHARS,*/ BYTESCHARS }; SQLCHAR *byteString; SQLWCHAR *unicodeString; @@ -179,13 +178,13 @@ class ConvertingString } if ( connection ) - bytesNeeded = connection->WcsToMbs( NULL, (const wchar_t*)wcString, length ); + bytesNeeded = connection->WcsToMbs( NULL, (const wchar_t*)wcString, 0 ); else { #ifdef _WINDOWS bytesNeeded = WideCharToMultiByte( codePage, (DWORD)0, wcString, length, NULL, (int)0, NULL, NULL ); #else - bytesNeeded = wcstombs( NULL, (const wchar_t*)wcString, length ); + bytesNeeded = wcstombs( NULL, (const wchar_t*)wcString, 0 ); #endif } @@ -290,19 +289,21 @@ SQLRETURN SQL_API SQLConnectW( SQLHDBC hDbc, SQLRETURN ret = ((OdbcConnection*) hDbc)->sqlConnect( ServerName, ServerName.getLength(), UserName, UserName.getLength(), Authentication, Authentication.getLength() ); + LOG_PRINT(( logFile, "SQLConnectW : Line %d\n" " +status : %d\n" " +hDbc : %p\n" - " +serverName : %S\n" - " +userName : %S\n" - " +authentication : %S\n\n", + " +serverName : %s\n" + " +userName : %s\n" + " +authentication : %s\n\n", __LINE__, ret, hDbc, - serverName ? serverName : (SQLWCHAR*)"", - userName ? userName : (SQLWCHAR*)"", - authentication ? authentication : (SQLWCHAR*)"" )); + ServerName.getLength() ? ServerName : (SQLCHAR*)"", + UserName.getLength() ? UserName : (SQLCHAR*)"", + Authentication.getLength() ? Authentication : (SQLCHAR*)"" + )); return ret; } @@ -457,13 +458,14 @@ SQLRETURN SQL_API SQLDriverConnectW( SQLHDBC hDbc, SQLHWND hWnd, SQLWCHAR *szCon "SQLDriverConnectW : Line %d\n" " +status : %d\n" " +hDbc : %p\n" - " +szConnStrIn : %S\n" - " +szConnStrOut : %S\n\n", + " +szConnStrIn : %s\n" + " +szConnStrOut : %s\n\n", __LINE__, ret, hDbc, - szConnStrIn ? szConnStrIn : (SQLWCHAR*)"", - szConnStrOut ? szConnStrOut : (SQLWCHAR*)"" )); + ConnStrIn.getLength() ? ConnStrIn : (SQLCHAR*)"", + ConnStrOut.getLength() ? ConnStrOut : (SQLCHAR*)"" + )); return ret; } diff --git a/OdbcConnection.cpp b/OdbcConnection.cpp index e079d25e..ae096859 100644 --- a/OdbcConnection.cpp +++ b/OdbcConnection.cpp @@ -1515,7 +1515,7 @@ SQLRETURN OdbcConnection::sqlGetInfo( SQLUSMALLINT type, SQLPOINTER ptr, SQLSMAL case infoShort: #ifdef DEBUG - sprintf (temp, " %s (short) %d\n", item->name, value); + sprintf (temp, " %s (short) %" PRId64 "\n", item->name, value); OutputDebugString (temp); #endif *((SQLUSMALLINT*) ptr) = (SQLUSMALLINT) value; @@ -1525,7 +1525,7 @@ SQLRETURN OdbcConnection::sqlGetInfo( SQLUSMALLINT type, SQLPOINTER ptr, SQLSMAL case infoLong: #ifdef DEBUG - sprintf (temp, " %s (int) %d\n", item->name, value); + sprintf (temp, " %s (int) %" PRId64 "\n", item->name, value); OutputDebugString (temp); #endif if ( maxLength == sizeof (SQLUSMALLINT) ) diff --git a/OdbcConvert.cpp b/OdbcConvert.cpp index 1f5a8594..a7d35080 100644 --- a/OdbcConvert.cpp +++ b/OdbcConvert.cpp @@ -1650,7 +1650,7 @@ int OdbcConvert::convGuidToString(DescRecord * from, DescRecord * to) int len, outlen = to->length; len = snprintf(pointer, outlen, "%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X", - (unsigned int) g->Data1, g->Data2, g->Data3, g->Data4[0], g->Data4[1], g->Data4[2], g->Data4[3], g->Data4[4], g->Data4[5], g->Data4[6], g->Data4[7]); + (uint64_t) g->Data1, g->Data2, g->Data3, g->Data4[0], g->Data4[1], g->Data4[2], g->Data4[3], g->Data4[4], g->Data4[5], g->Data4[6], g->Data4[7]); if ( len == -1 ) len = outlen; @@ -2166,14 +2166,14 @@ int OdbcConvert::convTimeToString(DescRecord * from, DescRecord * to) SQLUSMALLINT hour, minute, second; int ntime = *(int*)getAdressBindDataFrom((char*)from->dataPtr); - int nnano = ntime % ISC_TIME_SECONDS_PRECISION; + int32_t nnano = ntime % ISC_TIME_SECONDS_PRECISION; decode_sql_time(ntime, hour, minute, second); int len, outlen = to->length; if ( nnano ) - len = snprintf(pointer, outlen, "%02d:%02d:%02d.%04lu",hour, minute, second, nnano); + len = snprintf(pointer, outlen, "%02d:%02d:%02d.%04" PRId32,hour, minute, second, nnano); else len = snprintf(pointer, outlen, "%02d:%02d:%02d",hour, minute, second); @@ -2359,7 +2359,7 @@ int OdbcConvert::convDateTimeToString(DescRecord * from, DescRecord * to) QUAD pointerFrom = *(QUAD*)getAdressBindDataFrom((char*)from->dataPtr); int ndate = LO_LONG(pointerFrom); int ntime = HI_LONG(pointerFrom); - int nnano = ntime % ISC_TIME_SECONDS_PRECISION; + int32_t nnano = ntime % ISC_TIME_SECONDS_PRECISION; SQLUSMALLINT mday, month; SQLSMALLINT year; SQLUSMALLINT hour, minute, second; @@ -2369,7 +2369,7 @@ int OdbcConvert::convDateTimeToString(DescRecord * from, DescRecord * to) int len, outlen = to->length; if ( nnano ) - len = snprintf(pointer, outlen, "%04d-%02d-%02d %02d:%02d:%02d.%04lu",year,month,mday,hour, minute, second, nnano); + len = snprintf(pointer, outlen, "%04d-%02d-%02d %02d:%02d:%02d.%04" PRId32,year,month,mday,hour, minute, second, nnano); else len = snprintf(pointer, outlen, "%04d-%02d-%02d %02d:%02d:%02d",year,month,mday,hour, minute, second); diff --git a/OdbcDesc.cpp b/OdbcDesc.cpp index fcd51e1f..35b36bcf 100644 --- a/OdbcDesc.cpp +++ b/OdbcDesc.cpp @@ -820,7 +820,7 @@ SQLRETURN OdbcDesc::sqlGetDescField(int recNumber, int fieldId, SQLPOINTER ptr, struct infoDebSetDescField { int kod; - char * name; + const char * name; } debSetDescField[]= { __DebSetDescField(SQL_ERROR), @@ -854,7 +854,7 @@ SQLRETURN OdbcDesc::sqlSetDescField(int recNumber, int fieldId, SQLPOINTER value break; if(i==sizeof(debSetDescField)/sizeof(*debSetDescField)) i=0; - sprintf(strTmp,"\tid %4i - %s : recNumber %i : value %i\n",fieldId,debSetDescField[i].name, + sprintf(strTmp,"\tid %4i - %s : recNumber %i : value %" PRId64 "\n",fieldId,debSetDescField[i].name, recNumber, value ? (intptr_t)value : 0); OutputDebugString(strTmp); #endif diff --git a/OdbcDesc.h b/OdbcDesc.h index ddae42b2..bb8bb93f 100644 --- a/OdbcDesc.h +++ b/OdbcDesc.h @@ -86,7 +86,7 @@ typedef MList ListBindColumn; class OdbcDesc : public OdbcObject { public: - inline DescRecord* getDescRecord(int number, bool bCashe = true); + inline DescRecord* getDescRecord(size_t number, bool bCashe = true); SQLRETURN sqlGetDescField(int recNumber, int fieldId, SQLPOINTER value, int length, SQLINTEGER *lengthPtr); SQLRETURN sqlSetDescField (int recNumber, int fieldId, SQLPOINTER value, int length); SQLRETURN sqlGetDescRec(SQLSMALLINT recNumber, SQLCHAR *Name, SQLSMALLINT BufferLength, SQLSMALLINT *StringLengthPtr, @@ -132,22 +132,22 @@ class OdbcDesc : public OdbcObject StatementMetaData *metaDataIn; StatementMetaData *metaDataOut; OdbcDescType headType; - int recordSlots; + size_t recordSlots; DescRecord **records; bool bDefined; }; inline -DescRecord* OdbcDesc::getDescRecord(int number, bool bCashe) +DescRecord* OdbcDesc::getDescRecord(size_t number, bool bCashe) { if (number >= recordSlots) { - int oldSlots = recordSlots; + size_t oldSlots = recordSlots; DescRecord **oldRecords = records; recordSlots = number + (bCashe ? 20 : 1); records = new DescRecord* [recordSlots]; - memset (records, 0, sizeof (DescRecord*) * recordSlots); + memset (records, 0, sizeof (DescRecord*) * (size_t)recordSlots); if (oldSlots) { memcpy (records, oldRecords, sizeof (DescRecord*) * oldSlots); @@ -168,6 +168,8 @@ DescRecord* OdbcDesc::getDescRecord(int number, bool bCashe) case odtImplementationRow: case odtImplementationParameter: record->isIndicatorSqlDa = true; + default: + break; } } diff --git a/OdbcStatement.cpp b/OdbcStatement.cpp index 8c43696d..3a5cd6ad 100644 --- a/OdbcStatement.cpp +++ b/OdbcStatement.cpp @@ -151,7 +151,7 @@ namespace OdbcJdbcLibrary { using namespace IscDbcLibrary; -void TraceOutput(char * msg, intptr_t val) +void TraceOutput(const char * msg, intptr_t val) { char buf[80]; sprintf( buf, "\t%s = %ld : %p\n", msg, val, (void*)val ); @@ -859,7 +859,7 @@ SQLRETURN OdbcStatement::sqlFetch() } #ifdef DEBUG -char *strDebOrientFetch[]= +const char *strDebOrientFetch[]= { "", "SQL_FETCH_NEXT", @@ -1250,7 +1250,7 @@ SQLRETURN OdbcStatement::sqlExtendedFetch(int orientation, int offset, SQLULEN * } #ifdef DEBUG -char *strDebOrientSetPos[]= +const char *strDebOrientSetPos[]= { "SQL_POSITION", "SQL_REFRESH", @@ -1496,12 +1496,12 @@ SQLRETURN OdbcStatement::sqlSetScrollOptions (SQLUSMALLINT fConcurrency, SQLLEN sqlSetStmtAttr(SQL_ATTR_CURSOR_TYPE, ptr, 0); } - sqlSetStmtAttr(SQL_ATTR_CONCURRENCY, (SQLPOINTER)fConcurrency, 0); + sqlSetStmtAttr(SQL_ATTR_CONCURRENCY, (SQLPOINTER)(intptr_t)fConcurrency, 0); if ( crowKeyset > 0 ) - sqlSetStmtAttr(SQL_ATTR_KEYSET_SIZE, (SQLPOINTER)crowKeyset, 0); + sqlSetStmtAttr(SQL_ATTR_KEYSET_SIZE, (SQLPOINTER)(intptr_t)crowKeyset, 0); else - sqlSetStmtAttr(SQL_ROWSET_SIZE, (SQLPOINTER)crowRowset, 0); + sqlSetStmtAttr(SQL_ROWSET_SIZE, (SQLPOINTER)(intptr_t)crowRowset, 0); return sqlSuccess(); } @@ -3138,10 +3138,12 @@ SQLRETURN OdbcStatement::sqlPutData (SQLPOINTER value, SQLLEN valueSize) binding->beginBlobDataTransfer(); if ( valueSize == SQL_NTS ) + { if ( binding->conciseType == SQL_C_WCHAR ) valueSize = (SQLINTEGER)wcslen( (wchar_t*)value ) * sizeof(wchar_t); else // if ( binding->conciseType == SQL_C_CHAR ) valueSize = (SQLINTEGER)strlen( (char*)value ); + } if( valueSize ) { @@ -3176,10 +3178,12 @@ SQLRETURN OdbcStatement::sqlPutData (SQLPOINTER value, SQLLEN valueSize) binding->startedTransfer = true; if ( valueSize == SQL_NTS ) + { if ( binding->conciseType == SQL_C_WCHAR ) valueSize = (SQLINTEGER)wcslen( (wchar_t*)value ) * sizeof(wchar_t); else // if ( binding->conciseType == SQL_C_CHAR ) valueSize = (SQLINTEGER)strlen( (char*)value ); + } CBindColumn &bindParam = (*listBindIn)[ parameterNeedData - 1 ]; SQLPOINTER valueSave = binding->dataPtr;