BOOL CODBC::WriteScorcoData(char* SQL, BYTE* pData, int Length) { SQLRETURN retcode; SQLINTEGER cbObjectParam; SQLPOINTER pToken; char* pSQL = new char[strlen(SQL)]; sprintf(pSQL, SQL, "?"); SQLFreeStmt(hstmt,SQL_CLOSE); retcode = SQLPrepare(hstmt, (unsigned char *)pSQL, SQL_NTS); if (MYSQLSUCCESS(rc)) { SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_BINARY, SQL_LONGVARBINARY, 0, 0, (SQLPOINTER) 2, 0, &cbObjectParam); cbObjectParam = SQL_LEN_DATA_AT_EXEC(0); retcode = SQLExecute(hstmt); while (retcode == SQL_NEED_DATA) { retcode = SQLParamData(hstmt, &pToken); if (retcode == SQL_NEED_DATA) SQLPutData(hstmt, pData, Length); } return TRUE; } else { SaveSQLError(); return FALSE; } }
// Execute SQL command with SQLExecDirect() ODBC API. int direxec::sqlexec(char *buffer, unsigned int buffersize) { SQLFreeStmt(hstmt,SQL_CLOSE); rc=SQLExecDirect(hstmt, (unsigned char *) buffer, SQL_NTS); if (!MYSQLSUCCESS(rc)) // Error { errorstate = TRUE; char *msg = error_msg(); if (strlen(msg) < buffersize) strcpy(buffer, msg); else { strncpy(buffer, msg, buffersize); buffer[buffersize] = 0x0; } return -1; } else errorstate = FALSE; strcpy(buffer, ""); return 0; }
// Allocate environment handle, allocate connection handle, // connect to data source, and allocate statement handle. bool direxec::sqlconn(FILE* file) { logFile = file; unsigned int timeout = 10; // seconds SQLAllocEnv(&henv); SQLAllocConnect(henv,&hdbc); SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, &timeout, 0); rc=SQLConnect(hdbc,chr_ds_name,SQL_NTS,NULL,0,NULL,0); // Deallocate handles, display error message, and exit. if (!MYSQLSUCCESS(rc)) { SQLCHAR SqlState[6]; SQLINTEGER NativeError; SQLSMALLINT MsgLen; SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, SqlState, &NativeError, (unsigned char *) szData, 2048, &MsgLen); SQLFreeEnv(henv); SQLFreeConnect(hdbc); fprintf(logFile, "! Error while connecting to database: %s\n", szData); errorstate = TRUE; return FALSE; } rc=SQLAllocStmt(hdbc,&hstmt); errorstate = FALSE; return TRUE; }
BOOL CODBC::Execute(const uchar *query) { SQLFreeStmt(hstmt,SQL_CLOSE); // execute the query rc=SQLExecDirect(hstmt, (unsigned char *)query, SQL_NTS); if (!MYSQLSUCCESS(rc)) // Error { SaveSQLError (); return FALSE; } return TRUE; }
BYTE* CODBC::ReadScorcoData(char* SQL, char *param, BOOL* pSqlError, int *size) { SQLSMALLINT NumCols; SQLUINTEGER columnSizePtr; if (strcmp(param, "FETCHMODE") != 0) { SQLFreeStmt(hstmt,SQL_CLOSE); // execute the query rc=SQLExecDirect(hstmt, (unsigned char *)SQL, SQL_NTS); if (!MYSQLSUCCESS(rc)) { SaveSQLError(); *pSqlError = true; return NULL; } } *pSqlError = false; // walk through the resultset if (SQLFetch(hstmt) != SQL_SUCCESS) return NULL; SQLNumResultCols(hstmt, &NumCols); if (NumCols == 1) { SQLDescribeCol(hstmt, 1, NULL, 0, NULL, NULL, &columnSizePtr, NULL, NULL); if (columnSizePtr > MAXRESULT) { sprintf(lastError, "Critical error - object too large (>%ld bytes).\n", MAXRESULT); *pSqlError = true; return NULL; } SQLGetData(hstmt, 1, SQL_C_BINARY, pReturn, columnSizePtr, &cbData); *size = columnSizePtr; return pReturn; } else return NULL; }
BOOL CODBC::Connect(char* DSN, int timeout) { SQLAllocEnv (&henv); SQLAllocConnect (henv,&hdbc); SQLSetConnectAttr (hdbc, SQL_LOGIN_TIMEOUT, &timeout, 0); rc = SQLConnect (hdbc, (unsigned char*)DSN, SQL_NTS, NULL, 0, NULL, 0); // On error: deallocate handles, display error message, and exit. if (!MYSQLSUCCESS(rc)) { SQLCHAR SqlState[6]; SQLINTEGER NativeError; SQLSMALLINT MsgLen; SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, SqlState, &NativeError, (unsigned char *)lastError, 2048, &MsgLen); SQLFreeEnv(henv); SQLFreeConnect(hdbc); return FALSE; } // connecting was succesfull rc=SQLAllocStmt(hdbc, &hstmt); return TRUE; }