packages feed

Takusen-0.8.1: c-src/test-odbc/test.c

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


SQLRETURN rc;

void printDiagRecs(SQLHANDLE h, SQLSMALLINT htype, SQLSMALLINT msgSeq)
{
  char strState[6];
  char strMsg[1025];
  SQLINTEGER errNum;
  SQLSMALLINT msgLen;
  SQLRETURN rc2;
  rc2 = SQLGetDiagRec(htype, h, msgSeq, strState, &errNum, strMsg, 1024, &msgLen);
  if (SQL_SUCCESS != rc2)
  {
    strState[7] = '\0';
  	strMsg[msgLen+1] = '\0';
    printf("%d %s %s\n", errNum, strState, strMsg);
    printDiagRecs(h, htype, msgSeq+1);
  }
}

void checkRc()
{
  printf("rc = %d\n", rc);
  if (! SQL_SUCCEEDED(rc))
  {
  	exit(1);
  }
}

void checkError(SQLRETURN rc, SQLHANDLE h, SQLSMALLINT htype)
{
  printf("checkError: rc = %d\n", rc);
  if (! SQL_SUCCEEDED(rc))
  {
  	printDiagRecs(h, htype, 0);
  	exit(1);
  }
}


SQLHANDLE allocHdl(SQLHANDLE parent, SQLSMALLINT htype)
{
  SQLHANDLE ptr;
  rc = SQLAllocHandle(htype, parent, &ptr);
  checkError(rc, parent, htype);
  return ptr;
}

SQLHENV allocEnv()  { return allocHdl(NULL, SQL_HANDLE_ENV); }
SQLHDBC allocConn(SQLHENV env)  { return allocHdl(env, SQL_HANDLE_DBC); }
SQLHSTMT allocStmt(SQLHDBC conn) { return allocHdl(conn, SQL_HANDLE_STMT); }


void setOdbcVer(SQLHENV env)
{
  rc = SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (void*) SQL_OV_ODBC3, 0);
  checkError(rc, env, SQL_HANDLE_ENV);
}


void odbc_connect(SQLHDBC conn, char* connstr)
{
  char outStr[1000];
  SQLSMALLINT outSz;
  rc = SQLDriverConnect(conn, NULL, connstr, strlen(connstr), outStr, 1000, &outSz, SQL_DRIVER_NOPROMPT);
  checkError(rc, conn, SQL_HANDLE_DBC);
}


void odbc_disconnect(SQLHDBC conn)
{
  rc = SQLDisconnect(conn);
  checkError(rc, conn, SQL_HANDLE_DBC);
}


void freeHdl(SQLSMALLINT htype, SQLHANDLE h)
{
  rc = SQLFreeHandle(htype, h);
  checkError(rc, h, htype);
}

void freeEnv(SQLHENV env) { freeHdl(SQL_HANDLE_ENV, env); }
void freeConn(SQLHDBC conn) { freeHdl(SQL_HANDLE_DBC, conn); }
void freeStmt(SQLHSTMT stmt) { freeHdl(SQL_HANDLE_STMT, stmt); }


void prepareStmt(SQLHSTMT stmt, char* sqltext)
{
  rc = SQLPrepare(stmt, sqltext, SQL_NTS);
  checkError(rc, stmt, SQL_HANDLE_STMT);
}

void bindParamDatetime(SQLHSTMT stmt, SQLUSMALLINT pos, char* val)
{
  SQLLEN inputSz;
  rc = SQLBindParameter(stmt, pos, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_TYPE_TIMESTAMP, 23, 0, val, strlen(val), &inputSz);
  checkError(rc, stmt, SQL_HANDLE_STMT);
}

void executeStmt(SQLHSTMT stmt)
{
  rc = SQLExecute(stmt);
  checkError(rc, stmt, SQL_HANDLE_STMT);
}

void bindCol ()
{
}

SQLHDBC createConn(char *connstr)
{
  SQLHENV env;
  SQLHDBC conn;
  SQLHSTMT stmt;
  printf("allocEnv\n");
  env = allocEnv();
  printf("setOdbcVer\n");
  setOdbcVer(env);
  printf("allocConn\n");
  conn = allocConn(env);
  printf("odbc_connect\n");
  odbc_connect(conn, "DSN=postgres");
  printf("allocStmt\n");
  stmt = allocStmt(conn);
  printf("prepareStmt\n");
  prepareStmt(stmt, "select ?, ?, ?, ?");
  printf("bind param 1\n");
  bindParamDatetime(stmt, 1, "1753-01-01 00:00:00");
  /*
  printf("bind param 2\n");
  bindParamString(stmt, 2, "hello2");
  printf("bind param 3\n");
  bindParamInt(stmt, 3, 4444);
  */
  printf("executeStmt\n");
  executeStmt(stmt);
  printf("freeStmt\n");
  freeStmt(stmt);
  printf("disconnect\n");
  odbc_disconnect(conn);
  printf("freeConn\n");
  freeConn(conn);
  printf("freeEnv\n");
  freeEnv(env);
}

int main(int argc, char** argv)
{
  createConn("DSN=postgres");
}