/*
 * cl SQLBindParameter_bittest.c /DWIN32 odbc32.lib
 */
#ifdef WIN32
#include <windows.h>
#endif

#include <sqlext.h>
#include <stdio.h>

SQLTCHAR *DSNPrm= (SQLTCHAR*) "PostgreSQL35W";
SQLTCHAR *DSNUid= (SQLTCHAR*) "";
SQLTCHAR *DSNPwd= (SQLTCHAR*) "";

char *droptbl = "DROP TABLE IF EXISTS bbb CASCADE";
char *createtbl = "CREATE TABLE bbb(key BIT(10) Primary Key)";

#define CHECK_STMT(x) \
        if (rc != SQL_SUCCESS && rc != SQL_SUCCESS_WITH_INFO) \
                sqlerrexit(rc,SQL_HANDLE_STMT, x)

void sqlerrexit(RETCODE rc, SQLINTEGER type, SQLHANDLE handle)
{
        SQLCHAR SqlState[6], *sq = &SqlState[0];
        SQLCHAR Msg[SQL_MAX_MESSAGE_LENGTH], *ms = &Msg[0];
        SQLWCHAR SqlStateW[6], *sqw = &SqlStateW[0];
        SQLWCHAR MsgW[SQL_MAX_MESSAGE_LENGTH], *msw = &MsgW[0];
        SQLINTEGER NativeError;
        SQLSMALLINT i=1, MsgLen;
        RETCODE ret;
        int j;

        printf("error number : %d\n", rc);
        while (SQL_SUCCEEDED(SQLGetDiagRec(type, handle, i++,
                 SqlState, &NativeError, Msg, sizeof(Msg), &MsgLen)) )
        {
                 printf("state: %s  error code: %d\n %s (%d)\n",
                          SqlState, NativeError,Msg, MsgLen);
        }
        return;
}

int main(int argc, char **argv)
{ 
	SQLHENV henv;
	SQLHDBC hdbc;
	SQLHSTMT hstmt;
	SQLRETURN rc;
	long len = SQL_NTS;

	SQLTCHAR kd[100];

        if (argc == 2)
                DSNPrm = argv[1];
        else
        if (argc == 4)
        {
                DSNPrm = argv[1];
                DSNUid = argv[2];
                DSNPwd = argv[3];
        }
        else
        if ((argc == 3)||(argc > 4))
        {
                printf("usage: [DSN [UserID Password]]\n");
                return 1;
        }

	strcpy(kd, "1101010101");

        SQLAllocHandle(SQL_HANDLE_ENV, NULL, &henv);
        SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);

        SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
        SQLConnect(hdbc, DSNPrm, SQL_NTS, DSNUid, SQL_NTS,
                        DSNPwd, SQL_NTS);

	SQLAllocStmt(hdbc, &hstmt);

        rc = SQLExecDirect(hstmt, (SQLCHAR*)droptbl, SQL_NTS);
        CHECK_STMT(hstmt);
        rc = SQLExecDirect(hstmt, (SQLCHAR*)createtbl, SQL_NTS);
        CHECK_STMT(hstmt);

	SQLPrepare(hstmt, "INSERT INTO bbb VALUES (?)", 
		SQL_NTS);

	SQLBindParameter(hstmt, (SQLUSMALLINT)1, SQL_PARAM_INPUT, SQL_C_TCHAR,
		SQL_CHAR, 0, 0, &kd[0], 100, &len);

	rc = SQLExecute(hstmt);
        CHECK_STMT(hstmt);

	SQLFreeStmt(hstmt, SQL_DROP);
	SQLDisconnect(hdbc);
	SQLFreeConnect(hdbc);
	SQLFreeEnv(henv);
	return 0;
} 

