martinrybak / SQLClient

Native Microsoft SQL Server client for iOS
http://objcsharp.wordpress.com/2013/10/15/an-open-source-sql-server-library-for-ios/
MIT License
124 stars 51 forks source link

SQLClient missing attributes of odbcss.h file fixed here. #76

Closed harshgmx47 closed 2 days ago

harshgmx47 commented 2 days ago

While compiling code that includes the odbcss.h header from FreeTDS, I encountered a compilation error related to the SQLUSMALLINT type. The error indicates a redefinition of SQLUSMALLINT, which conflicts with its definition in sql.h.

In file included from my_program.c:5:
odbcss.h:25:19: error: conflicting types for ‘SQLUSMALLINT’
 typedef unsigned short SQLUSMALLINT;
                       ^~~~~~~~~~~~~
In file included from /usr/include/sql.h:50,
                 from my_program.c:3:
/usr/include/sqltypes.h:89:23: note: previous declaration of ‘SQLUSMALLINT’ was here
 typedef SQLUSMALLINT  SQLUSMALLINT;
                       ^~~~~~~~~~~~~

Proposed Solution

typedef unsigned short SQLUSMALLINT;
typedef unsigned int SQLUINTEGER;
typedef short SQLSMALLINT;

Full code 👍 :

/* FreeTDS - Library of routines accessing Sybase and Microsoft databases

ifndef _odbcssh

define _odbcssh

ifdef TDSODBC_BCP

include

endif

ifdef __cplusplus

extern "C" {

endif

define SQL_DIAG_SS_MSGSTATE (-1150)

define SQL_DIAG_SS_LINE (-1154)

define SQL_SOPT_SS_QUERYNOTIFICATION_TIMEOUT 1233

define SQL_SOPT_SS_QUERYNOTIFICATION_MSGTEXT 1234

define SQL_SOPT_SS_QUERYNOTIFICATION_OPTIONS 1235

typedef unsigned short SQLUSMALLINT; typedef unsigned int SQLUINTEGER; typedef short SQLSMALLINT;

ifndef SQL_SS_LENGTH_UNLIMITED

define SQL_SS_LENGTH_UNLIMITED 0

endif

ifndef SQL_COPT_SS_BASE

define SQL_COPT_SS_BASE 1200

endif

ifndef SQL_COPT_SS_MARS_ENABLED

define SQL_COPT_SS_MARS_ENABLED (SQL_COPT_SS_BASE+24)

endif

ifndef SQL_COPT_SS_OLDPWD

define SQL_COPT_SS_OLDPWD (SQL_COPT_SS_BASE+26)

endif

define SQL_INFO_FREETDS_TDS_VERSION 1300

ifndef SQL_MARS_ENABLED_NO

define SQL_MARS_ENABLED_NO 0

endif

ifndef SQL_MARS_ENABLED_YES

define SQL_MARS_ENABLED_YES 1

endif

ifndef SQL_SS_VARIANT

define SQL_SS_VARIANT (-150)

endif

ifndef SQL_SS_UDT

define SQL_SS_UDT (-151)

endif

ifndef SQL_SS_XML

define SQL_SS_XML (-152)

endif

ifndef SQL_SS_TABLE

define SQL_SS_TABLE (-153)

endif

ifndef SQL_SS_TIME2

define SQL_SS_TIME2 (-154)

endif

ifndef SQL_SS_TIMESTAMPOFFSET

define SQL_SS_TIMESTAMPOFFSET (-155)

endif

/*

ifndef SQL_C_SS_TIMESTAMPOFFSET

define SQL_C_SS_TIMESTAMPOFFSET (0x4001)

endif

ifndef SQL_CA_SS_BASE

define SQL_CA_SS_BASE 1200

endif

ifndef SQL_CA_SS_UDT_CATALOG_NAME

define SQL_CA_SS_UDT_CATALOG_NAME (SQL_CA_SS_BASE+18)

endif

ifndef SQL_CA_SS_UDT_SCHEMA_NAME

define SQL_CA_SS_UDT_SCHEMA_NAME (SQL_CA_SS_BASE+19)

endif

ifndef SQL_CA_SS_UDT_TYPE_NAME

define SQL_CA_SS_UDT_TYPE_NAME (SQL_CA_SS_BASE+20)

endif

ifndef SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME

define SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME (SQL_CA_SS_BASE+21)

endif

ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME

define SQL_CA_SS_XML_SCHEMACOLLECTION_CATALOG_NAME (SQL_CA_SS_BASE+22)

endif

ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME

define SQL_CA_SS_XML_SCHEMACOLLECTION_SCHEMA_NAME (SQL_CA_SS_BASE+23)

endif

ifndef SQL_CA_SS_XML_SCHEMACOLLECTION_NAME

define SQL_CA_SS_XML_SCHEMACOLLECTION_NAME (SQL_CA_SS_BASE+24)

endif

typedef struct tagSS_TIME2_STRUCT { SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; SQLUINTEGER fraction; } SQL_SS_TIME2_STRUCT;

typedef struct tagSS_TIMESTAMPOFFSET_STRUCT { SQLSMALLINT year; SQLUSMALLINT month; SQLUSMALLINT day; SQLUSMALLINT hour; SQLUSMALLINT minute; SQLUSMALLINT second; SQLUINTEGER fraction; SQLSMALLINT timezone_hour; SQLSMALLINT timezone_minute; } SQL_SS_TIMESTAMPOFFSET_STRUCT;

ifdef TDSODBC_BCP

ifndef SUCCEED

define SUCCEED 1

endif

ifndef FAIL

define FAIL 0

endif

ifndef BCPKEEPIDENTITY

define BCPKEEPIDENTITY 8

endif

ifndef BCPHINTS

define BCPHINTS 6

endif

define BCP_DIRECTION_IN 1

define SQL_COPT_SS_BCP (SQL_COPT_SS_BASE+19)

define SQL_BCP_OFF 0

define SQL_BCP_ON 1

define SQL_COPT_TDSODBC_IMPL_BASE 1500

define SQL_COPT_TDSODBC_IMPL_BCP_INITA (SQL_COPT_TDSODBC_IMPL_BASE)

define SQL_COPT_TDSODBC_IMPL_BCP_CONTROL (SQL_COPT_TDSODBC_IMPL_BASE+1)

define SQL_COPT_TDSODBC_IMPL_BCP_COLPTR (SQL_COPT_TDSODBC_IMPL_BASE+2)

define SQL_COPT_TDSODBC_IMPL_BCP_SENDROW (SQL_COPT_TDSODBC_IMPL_BASE+3)

define SQL_COPT_TDSODBC_IMPL_BCP_BATCH (SQL_COPT_TDSODBC_IMPL_BASE+4)

define SQL_COPT_TDSODBC_IMPL_BCP_DONE (SQL_COPT_TDSODBC_IMPL_BASE+5)

define SQL_COPT_TDSODBC_IMPL_BCP_BIND (SQL_COPT_TDSODBC_IMPL_BASE+6)

define SQL_COPT_TDSODBC_IMPL_BCP_INITW (SQL_COPT_TDSODBC_IMPL_BASE+7)

define SQL_VARLEN_DATA -10

/ copied from sybdb.h which was copied from tds.h / / TODO find a much better way... / enum { BCP_TYPE_SQLCHAR = 47, / 0x2F /

define BCP_TYPE_SQLCHAR BCP_TYPE_SQLCHAR

BCP_TYPE_SQLVARCHAR = 39,   /* 0x27 */

define BCP_TYPE_SQLVARCHAR BCP_TYPE_SQLVARCHAR

BCP_TYPE_SQLINTN = 38,      /* 0x26 */

define BCP_TYPE_SQLINTN BCP_TYPE_SQLINTN

BCP_TYPE_SQLINT1 = 48,      /* 0x30 */

define BCP_TYPE_SQLINT1 BCP_TYPE_SQLINT1

BCP_TYPE_SQLINT2 = 52,      /* 0x34 */

define BCP_TYPE_SQLINT2 BCP_TYPE_SQLINT2

BCP_TYPE_SQLINT4 = 56,      /* 0x38 */

define BCP_TYPE_SQLINT4 BCP_TYPE_SQLINT4

BCP_TYPE_SQLINT8 = 127,     /* 0x7F */

define BCP_TYPE_SQLINT8 BCP_TYPE_SQLINT8

BCP_TYPE_SQLFLT8 = 62,      /* 0x3E */

define BCP_TYPE_SQLFLT8 BCP_TYPE_SQLFLT8

BCP_TYPE_SQLDATETIME = 61,  /* 0x3D */

define BCP_TYPE_SQLDATETIME BCP_TYPE_SQLDATETIME

BCP_TYPE_SQLBIT = 50,       /* 0x32 */

define BCP_TYPE_SQLBIT BCP_TYPE_SQLBIT

BCP_TYPE_SQLBITN = 104,     /* 0x68 */

define BCP_TYPE_SQLBITN BCP_TYPE_SQLBITN

BCP_TYPE_SQLTEXT = 35,      /* 0x23 */

define BCP_TYPE_SQLTEXT BCP_TYPE_SQLTEXT

BCP_TYPE_SQLNTEXT = 99,     /* 0x63 */

define BCP_TYPE_SQLNTEXT BCP_TYPE_SQLNTEXT

BCP_TYPE_SQLIMAGE = 34,     /* 0x22 */

define BCP_TYPE_SQLIMAGE BCP_TYPE_SQLIMAGE

BCP_TYPE_SQLMONEY4 = 122,   /* 0x7A */

define BCP_TYPE_SQLMONEY4 BCP_TYPE_SQLMONEY4

BCP_TYPE_SQLMONEY = 60,     /* 0x3C */

define BCP_TYPE_SQLMONEY BCP_TYPE_SQLMONEY

BCP_TYPE_SQLDATETIME4 = 58, /* 0x3A */

define BCP_TYPE_SQLDATETIME4 BCP_TYPE_SQLDATETIME4

BCP_TYPE_SQLREAL = 59,      /* 0x3B */
BCP_TYPE_SQLFLT4 = 59,      /* 0x3B */

define BCP_TYPE_SQLREAL BCP_TYPE_SQLREAL

define BCP_TYPE_SQLFLT4 BCP_TYPE_SQLFLT4

BCP_TYPE_SQLBINARY = 45,        /* 0x2D */

define BCP_TYPE_SQLBINARY BCP_TYPE_SQLBINARY

BCP_TYPE_SQLVOID = 31,      /* 0x1F */

define BCP_TYPE_SQLVOID BCP_TYPE_SQLVOID

BCP_TYPE_SQLVARBINARY = 37, /* 0x25 */

define BCP_TYPE_SQLVARBINARY BCP_TYPE_SQLVARBINARY

BCP_TYPE_SQLNUMERIC = 108,  /* 0x6C */

define BCP_TYPE_SQLNUMERIC BCP_TYPE_SQLNUMERIC

BCP_TYPE_SQLDECIMAL = 106,  /* 0x6A */

define BCP_TYPE_SQLDECIMAL BCP_TYPE_SQLDECIMAL

BCP_TYPE_SQLFLTN = 109,     /* 0x6D */

define BCP_TYPE_SQLFLTN BCP_TYPE_SQLFLTN

BCP_TYPE_SQLMONEYN = 110,   /* 0x6E */

define BCP_TYPE_SQLMONEYN BCP_TYPE_SQLMONEYN

BCP_TYPE_SQLDATETIMN = 111, /* 0x6F */

define BCP_TYPE_SQLDATETIMN BCP_TYPE_SQLDATETIMN

BCP_TYPE_SQLNVARCHAR = 103, /* 0x67 */

define BCP_TYPE_SQLNVARCHAR BCP_TYPE_SQLNVARCHAR

BCP_TYPE_SQLUNIQUEID = 36,  /* 0x24 */

define BCP_TYPE_SQLUNIQUEID BCP_TYPE_SQLUNIQUEID

BCP_TYPE_SQLDATETIME2 = 42,    /* 0x2a */

define BCP_TYPE_SQLDATETIME2 BCP_TYPE_SQLDATETIME2

};

typedef struct { int dtdays; int dttime; } DBDATETIME;

ifdef _MSC_VER

define TDSODBC_INLINE __inline

else

define TDSODBC_INLINE inline

endif

struct tdsodbc_impl_bcp_init_params { const void tblname; const void hfile; const void *errfile; int direction; };

static TDSODBC_INLINE RETCODE SQL_API bcp_initA(HDBC hdbc, const char tblname, const char hfile, const char *errfile, int direction) { struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITA, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

static TDSODBC_INLINE RETCODE SQL_API bcp_initW(HDBC hdbc, const SQLWCHAR tblname, const SQLWCHAR hfile, const SQLWCHAR *errfile, int direction) { struct tdsodbc_impl_bcp_init_params params = {tblname, hfile, errfile, direction}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_INITW, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

struct tdsodbc_impl_bcp_control_params { int field; void *value; };

static TDSODBC_INLINE RETCODE SQL_API bcp_control(HDBC hdbc, int field, void *value) { struct tdsodbc_impl_bcp_control_params params = {field, value}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_CONTROL, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

struct tdsodbc_impl_bcp_colptr_params { const unsigned char * colptr; int table_column; };

static TDSODBC_INLINE RETCODE SQL_API bcp_colptr(HDBC hdbc, const unsigned char * colptr, int table_column) { struct tdsodbc_impl_bcp_colptr_params params = {colptr, table_column}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_COLPTR, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

static TDSODBC_INLINE RETCODE SQL_API bcp_sendrow(HDBC hdbc) { return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_SENDROW, NULL, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

struct tdsodbc_impl_bcp_batch_params { int rows; };

static TDSODBC_INLINE int SQL_API bcp_batch(HDBC hdbc) { struct tdsodbc_impl_bcp_batch_params params = {-1}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BATCH, &params, SQL_IS_POINTER)) ? params.rows : -1; }

struct tdsodbc_impl_bcp_done_params { int rows; };

static TDSODBC_INLINE int SQL_API bcp_done(HDBC hdbc) { struct tdsodbc_impl_bcp_done_params params = {-1}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_DONE, &params, SQL_IS_POINTER)) ? params.rows : -1; }

struct tdsodbc_impl_bcp_bind_params { const unsigned char varaddr; int prefixlen; int varlen; const unsigned char terminator; int termlen; int vartype; int table_column; };

static TDSODBC_INLINE RETCODE SQL_API bcp_bind(HDBC hdbc, const unsigned char varaddr, int prefixlen, int varlen, const unsigned char terminator, int termlen, int vartype, int table_column) { struct tdsodbc_impl_bcp_bind_params params = {varaddr, prefixlen, varlen, terminator, termlen, vartype, table_column}; return SQL_SUCCEEDED(SQLSetConnectAttr(hdbc, SQL_COPT_TDSODBC_IMPL_BCP_BIND, &params, SQL_IS_POINTER)) ? SUCCEED : FAIL; }

ifdef UNICODE

define bcp_init bcp_initW

else

define bcp_init bcp_initA

endif

endif / TDSODBC_BCP /

ifdef __cplusplus

}

endif

endif / _odbcssh /