/*
    test case
*/

#include <sql.h>
#include <sqlext.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef unsigned char byte;

void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno);
#define CHECKRC(FUNCSHN,MSG) CheckRC(FUNCSHN, MSG, __FILE__, __LINE__)

SQLHENV     hEnv = SQL_NULL_HENV;
SQLHDBC     hDbc = SQL_NULL_HDBC;
SQLHSTMT    hStmt = SQL_NULL_HSTMT;
SQLCHAR*    connString;
SQLCHAR     connOut[255]; /* buffer for connection output */
SQLSMALLINT szConnOut; /* num bytes returned in connOut */
SQLINTEGER Version = SQL_OV_ODBC3;

void doDrop()
{   
}

void doCreate()
{   
}


void doTest()
{
    SQLINTEGER m_rows;
    SQLSMALLINT nCols;
    SQLRETURN retcode;
    int nCol;

    printf("Test....\n");

    CHECKRC(SQLAllocStmt(hDbc, &hStmt), "SQLAllocStmt()" );
    CHECKRC(SQLSetStmtAttr(hStmt, SQL_ATTR_MAX_ROWS, 10, 0),"SQLSetStmtAttr()");

    CHECKRC(SQLPrepare (hStmt, (SQLCHAR *) "SELECT * FROM site_all", SQL_NTS), "SQLPrepare()" );

    CHECKRC(SQLExecute(hStmt),"SQLExecute()" );

    CHECKRC(SQLRowCount(hStmt, &m_rows),"SQLRowCount()");

    CHECKRC(SQLNumResultCols(hStmt, &nCols),"SQLNumResultCols()");

    if(m_rows > 0)
    {
      for(nCol=0;nCol<nCols;nCol++)
      {
        SQLCHAR         colname[1024];
        SQLSMALLINT     coltype;
        SQLSMALLINT     colnamelen;
        SQLSMALLINT     nullable;
        SQLUINTEGER     collen;
        SQLSMALLINT     scale;
        SQLINTEGER displaysize;
        SQLINTEGER m_size;
        byte* m_Value;
        

        CHECKRC(SQLDescribeCol(hStmt, 
                            nCol+1, 
                            colname, 
                            sizeof(colname), 
                            &colnamelen, 
                            &coltype, 
                            &collen, 
                            &scale, 
                            &nullable),"SQLDescribeCol()");

        CHECKRC(SQLColAttributes(hStmt, nCol+1, SQL_DESC_LENGTH, NULL, 0,
                              NULL, &displaysize),"SQLColAttributes()");

        m_size = (collen > displaysize) ? collen : displaysize ;
        m_Value = malloc(m_size);

        CHECKRC(SQLBindCol (hStmt, nCol+1, coltype, m_Value, m_size,
                         NULL),"SQLBindCol()");

      }

      CHECKRC(retcode = SQLFetch(hStmt),"SQLFetch()");
      if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
      {
          printf("Fetched...\n");
      }

    }	

}

int main(int argc, char** argv)
{
    int nPrompt = SQL_DRIVER_NOPROMPT;
    int i;

    if (argc < 2 || strlen(argv[1]) == 0)
    {
        connString = (SQLCHAR *)"DRIVER=MySQL ODBC 3.51 Driver;UID=root;database=test";
    }
    else
        connString = (SQLCHAR *)argv[1];

    if (SQLAllocEnv(&hEnv) != SQL_SUCCESS)
    {
        fprintf(stderr, "Unable to allocate SQLHENV\n");
        return(1);
    }

    for (i = 0; i < 4; i++) 
    {
      printf("Connect....\n");
      SQLAllocEnv(&hEnv);
      CHECKRC( SQLSetEnvAttr(hEnv,SQL_ATTR_ODBC_VERSION,Version,0 ), "SQLSetEnvAttr()" );
      CHECKRC( SQLAllocConnect(hEnv, &hDbc), "SQLAllocConnect()" );
      CHECKRC( SQLDriverConnect(hDbc, (HWND)0, connString, SQL_NTS, connOut, 255, &szConnOut, nPrompt), "SQLDriverConnect()" );

      doDrop();
      doCreate();
      doTest();

      printf("Disconnect....\n");
      CHECKRC( SQLDisconnect(hDbc), "SQLDisconnect()" );
      CHECKRC( SQLFreeConnect(hDbc), "SQLFreeConnect()" );
      CHECKRC( SQLFreeEnv(hEnv), "SQLFreeEnv()" );
    }

    return 0;
}

void CheckRC(SQLRETURN rc, char* msg, char* filename, int lineno)
{
#define MSG_LNG 512

    SQLCHAR     szSqlState[MSG_LNG];
    SQLINTEGER  pfNativeError;
    SQLCHAR     szErrorMsg[MSG_LNG];
    SQLSMALLINT pcbErrorMsg;
    SQLRETURN   ret = SQL_SUCCESS;

    int error = 0;

    if (rc != SQL_SUCCESS && rc != SQL_NO_DATA_FOUND)
    {
        if (rc != SQL_SUCCESS_WITH_INFO)
        {
            fprintf(stderr, "\nERROR (%s:%d): %s\n",
                    filename, lineno, msg);
            error = 1;
        }

        while (ret == SQL_SUCCESS || ret == SQL_SUCCESS_WITH_INFO)
        {
            ret = SQLError(hEnv, hDbc, hStmt,
                           szSqlState, &pfNativeError,
                           szErrorMsg, MSG_LNG,
                           &pcbErrorMsg);
            switch (ret)
            {
                case SQL_SUCCESS:  
                    if (rc == SQL_SUCCESS_WITH_INFO)
                    {
                        fprintf(stderr, "\nINFO: (%s:%d): %s\n",
                                filename, lineno, msg);
                    }
                    fprintf(stderr, 
                            "*** %s\n*** ODBC Code: %s, "
                            "Driver Code: %ld\n\n",
                            szErrorMsg, szSqlState, pfNativeError);
                    break;
                case SQL_NO_DATA_FOUND:
                    break;
                default:
                    fprintf(stderr,
                            "*** SQLError() failed with code=%d\n\n", ret);
                    break;
            }
        }
    }
    if (error) exit(1);
}




