#ifdef WIN32
#include <windows.h>
#endif

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

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

char *droptbl = "DROP TABLE IF EXISTS utftest CASCADE";
char *createtbl = "CREATE TABLE utftest(name decimal(20,4))";

#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  Native Error Code: %d\n %s (%d)\n",
			  SqlState,NativeError,Msg, MsgLen);
	}
	return;
}

int main(int argc, char **argv)
{
	SQLHENV henv;
	SQLHDBC hdbc;
	SQLHSTMT hstmt;
	SQLCHAR utfstr[80];
	SQLLEN lena, lenw;
	RETCODE	rc;

        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: ucode [DSN [UserID Password]]\n");
                return 1;
        }


	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);

	SQLAllocHandle(SQL_HANDLE_STMT, 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 utftest(name) values (?)", SQL_NTS);

	strcpy(utfstr, "44.47");
	lenw = strlen(utfstr) * sizeof(SQLCHAR);

	rc = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_WCHAR, 
			SQL_WLONGVARCHAR, 0, 0, utfstr, 0, &lenw);
	CHECK_STMT(hstmt);
	rc = SQLExecute(hstmt);
	CHECK_STMT(hstmt);

	/* commit the transaction */
	rc= SQLEndTran(SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
	CHECK_STMT(hstmt);

	SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
	SQLDisconnect(hdbc);
	SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
	SQLFreeHandle(SQL_HANDLE_ENV, henv);

}
