cgi_odbc.c File Reference

#include "cgi.h"
#include <sqltypes.h>
#include <sql.h>
#include <sqlext.h>
#include <sqlucode.h>

Include dependency graph for cgi_odbc.c:

Go to the source code of this file.

Data Structures

struct  ODBCSession

Defines

#define SQL_NOUNICODEMAP
#define WRITE(a, x)   LogError(x); if (Message) BufferWrite(Message,x)

Functions

void ListErrors (TextBuffer *Message, SQLHANDLE hHandle, SQLSMALLINT hType)
SQLDBODBCConnect (char *service, char *uid, char *pwd, TextBuffer *errors)
int ODBCDisconnect (SQLDB *db)
int ODBCCommit (SQLDB *db)
int ODBCStart (ODBCSession *database, char *command, SQLHSTMT *st)
int ODBCFinish (void *st, int *modified)
int ODBCExec (SQLDB *db, char *command, int *modified)
CGINameValueODBCQuery (SQLDB *database, char *command, int *modified)
int ODBCSelect (SQLDB *db, char *command, void **st)
CGINameValueODBCRead (void *st)


Define Documentation

#define SQL_NOUNICODEMAP
 

Definition at line 35 of file cgi_odbc.c.

#define WRITE a,
 )     LogError(x); if (Message) BufferWrite(Message,x)
 

Referenced by ListErrors().


Function Documentation

void ListErrors TextBuffer Message,
SQLHANDLE  hHandle,
SQLSMALLINT  hType
 

Definition at line 90 of file cgi_odbc.c.

References BufferWrite(), LogError(), and WRITE.

Referenced by ODBCConnect(), and ODBCStart().

00091 {
00092     SQLSMALLINT iRec = 0;
00093     SQLINTEGER  iError;
00094    char szMessage[1024], szState[8];
00095    SQLSMALLINT len=0;
00096 
00097    szMessage[0]=0;
00098    memset(szState,0,sizeof(szState));
00099 
00100     while (SQLGetDiagRec(hType,
00101                          hHandle,
00102                          ++iRec,
00103                          (unsigned char*)szState,
00104                          &iError,
00105                          (unsigned char*)szMessage,
00106                          sizeof(szMessage),
00107                          &len) == SQL_SUCCESS)
00108     {
00109 #define WRITE(a,x) LogError(x); if (Message) BufferWrite(Message,x)
00110     // Hide "data truncated" messages
00111     LogError("\n");
00112     WRITE(Message,"[");
00113     WRITE(Message,szState);
00114     WRITE(Message,"] ");
00115     WRITE(Message,szMessage);
00116     WRITE(Message," (");
00117     sprintf(szMessage,"%d",iError);
00118     WRITE(Message,szMessage);
00119     WRITE(Message,")");
00120     if (Message)BufferWrite(Message,"\n");
00121 #undef WRITE
00122     }
00123 }

int ODBCCommit SQLDB db  ) 
 

Definition at line 218 of file cgi_odbc.c.

References ODBCSession::hdbc.

00219 {
00220  ODBCSession* database = (ODBCSession*)db;
00221  if (!database) return 0;
00222  return (SQL_SUCCEEDED(SQLEndTran(SQL_HANDLE_DBC,database->hdbc,SQL_COMMIT)));
00223 }

SQLDB* ODBCConnect char *  service,
char *  uid,
char *  pwd,
TextBuffer errors
 

Free errors if non-zero

Definition at line 125 of file cgi_odbc.c.

References CGIFREE, CGIMALLOC, ODBCSession::debug, ODBCSession::ErrorMessage, ODBCSession::hdbc, ODBCSession::henv, ListErrors(), LogError(), and NewBuffer().

Referenced by LoadUserDataSQL().

00126 {
00127  int r;
00128  ODBCSession * database = (ODBCSession*)CGIMALLOC(sizeof(ODBCSession));
00129  database->debug = 0;
00130  if (strlen(service) > 256 || strlen(uid) > 256  || strlen(pwd) > 256) return 0;
00131 
00132  if (service[0] == '?')
00133   {
00134    database->debug=1;
00135    service++;
00136   }
00137 
00138  r = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &database->henv);
00139  if (!SQL_SUCCEEDED(r))
00140   {
00141    CGIFREE(database);
00142    LogError("\nCouldn't allocate a SQL environment handle");
00143    return 0;
00144   }
00145 
00146  r = SQLSetEnvAttr(database->henv, SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC3,0);
00147  if (!SQL_SUCCEEDED(r)||database->debug)
00148   {
00149    ListErrors(errors,database->henv,SQL_HANDLE_ENV);
00150   }
00151  if (!SQL_SUCCEEDED(r))
00152   {
00153    SQLFreeHandle(SQL_HANDLE_ENV, database->henv);
00154    CGIFREE(database);
00155    return 0;
00156    }
00157 
00158  r = SQLAllocHandle(SQL_HANDLE_DBC,database->henv,&database->hdbc);
00159 
00160  if (!SQL_SUCCEEDED(r)||database->debug)
00161   {
00162    ListErrors(errors,database->henv,SQL_HANDLE_ENV);
00163   }
00164 
00165  if (!SQL_SUCCEEDED(r))
00166   {
00167    LogError("\nCouldn't allocate a SQL database handle");
00168    SQLFreeHandle(SQL_HANDLE_ENV, database->henv);
00169    CGIFREE(database);
00170    return 0;
00171   }
00172 
00173  if (strchr(service,'='))
00174  {
00175      SQLCHAR outConn[1024];
00176      SQLSMALLINT l = 1024;
00177      r = SQLDriverConnect(database->hdbc,0,(SQLCHAR*)service, SQL_NTS,
00178                           outConn,l,&l,SQL_DRIVER_NOPROMPT);
00179 }
00180 else
00181 {
00182  r = SQLConnect(database->hdbc,
00183  (SQLCHAR*)service, SQL_NTS,
00184  (SQLCHAR*)uid, SQL_NTS,
00185  (SQLCHAR*)pwd, SQL_NTS);
00186 }
00187  if (!SQL_SUCCEEDED(r)||database->debug)
00188   {
00189    ListErrors(errors,database->hdbc,SQL_HANDLE_DBC);
00190    ListErrors(errors,database->henv,SQL_HANDLE_ENV);
00191   }
00192  if (!SQL_SUCCEEDED(r))
00193   {
00194    SQLFreeHandle(SQL_HANDLE_DBC, database->hdbc);
00195    SQLFreeHandle(SQL_HANDLE_ENV, database->henv);
00196    CGIFREE(database);
00197    return 0;
00198   }
00199 
00200  database->ErrorMessage = NewBuffer(1024);
00201  return (SQLDB*)database;
00202 }

int ODBCDisconnect SQLDB db  ) 
 

Definition at line 204 of file cgi_odbc.c.

References CGIFREE, DeleteBuffer(), ODBCSession::ErrorMessage, ODBCSession::hdbc, and ODBCSession::henv.

Referenced by LoadUserDataSQL().

00205 {
00206  ODBCSession* database = (ODBCSession*)db;
00207  if (!database) return 0;
00208 
00209  SQLDisconnect(database->hdbc);
00210  SQLFreeHandle(SQL_HANDLE_DBC, database->hdbc);
00211  SQLFreeHandle(SQL_HANDLE_ENV, database->henv);
00212 
00213  DeleteBuffer(database->ErrorMessage);
00214  CGIFREE(database);
00215  return 0;
00216 }

int ODBCExec SQLDB db,
char *  command,
int *  modified
 

Definition at line 285 of file cgi_odbc.c.

References ODBCFinish(), and ODBCStart().

Referenced by TryODBC().

00286 {
00287  ODBCSession* database = (ODBCSession*)db;
00288  SQLHSTMT st;
00289  int ret;
00290  if (!database) return 0;
00291 
00292  ret = ODBCStart(database,command,&st);
00293  if (ret)
00294  {
00295    SQLFreeHandle(SQL_HANDLE_STMT, (SQLHSTMT)st);
00296    return ret;
00297  }
00298 
00299  ODBCFinish(st,modified);
00300 
00301  return 0;
00302 }

int ODBCFinish void *  st,
int *  modified
 

Definition at line 271 of file cgi_odbc.c.

Referenced by ODBCExec(), and ODBCQuery().

00272 {
00273  if (modified)
00274  {
00275   SQLINTEGER i=0;
00276   SQLRowCount((SQLHSTMT)st,&i);
00277   *modified = i;
00278  }
00279  if (!SQL_SUCCEEDED(SQLFreeHandle(SQL_HANDLE_STMT, (SQLHSTMT)st)))
00280    return 54;
00281 
00282  return 0;
00283 }

CGINameValue* ODBCQuery SQLDB database,
char *  command,
int *  modified
 

Definition at line 305 of file cgi_odbc.c.

References NULL, ODBCFinish(), ODBCRead(), and ODBCSelect().

Referenced by LoadUserDataSQL().

00306 {
00307  void* handle=0;
00308  CGINameValue* ret;
00309  if (ODBCSelect(database,command,&handle)) return NULL;
00310  ret = ODBCRead(handle);
00311  ODBCFinish(handle,modified);
00312  return ret;
00313 }

CGINameValue* ODBCRead void *  st  ) 
 

Definition at line 326 of file cgi_odbc.c.

References CGIMALLOC, DeleteNVP(), CGINameValue::name, NewNVP(), NULL, strndup(), and CGINameValue::value.

Referenced by ODBCQuery().

00327 {
00328   SQLSMALLINT columnCount = 0;
00329   CGINameValue * data;
00330   SQLSMALLINT i;
00331 
00332   int ret = SQLNumResultCols((SQLHSTMT)st,&columnCount);
00333   if (columnCount ==0) return NULL;
00334 
00335   data = NewNVP(columnCount);
00336   /* bind*/
00337   for (i=1; i<= columnCount; i++)
00338     {
00339     char szTitle[256];
00340     long size=0;
00341     szTitle[0]=0;
00342 
00343     ret = SQLColAttribute((SQLHSTMT)st,i,SQL_DESC_LENGTH,
00344                                      NULL,0,NULL,&size);
00345 
00346     if (!SQL_SUCCEEDED(ret) || size <= 0) size = 128;
00347 
00348     SQLColAttribute((SQLHSTMT)st,i,SQL_DESC_NAME,szTitle,
00349                             sizeof(szTitle),NULL,NULL);
00350 
00351     data[i-1].name = strndup(szTitle,sizeof(szTitle));
00352     data[i-1].value = (char*)CGIMALLOC(size+1);
00353     memset(data[i-1].value,0,size+1);
00354 
00355     SQLBindCol((SQLHSTMT)st,i,SQL_C_CHAR,(SQLPOINTER) data[i-1].value,
00356                (size + 1) * sizeof(char),&size);
00357     }
00358   /* end bind */
00359   ret = SQLFetch((SQLHSTMT)st);
00360   if (SQL_SUCCEEDED(ret)) return data;
00361   DeleteNVP(data);
00362   return NULL;
00363 }

int ODBCSelect SQLDB db,
char *  command,
void **  st
 

Definition at line 316 of file cgi_odbc.c.

References ODBCStart().

Referenced by ODBCQuery().

00317 {
00318  ODBCSession* database = (ODBCSession*)db;
00319  int ret;
00320  if (!database) return 0;
00321 
00322  ret= ODBCStart(database,command,st);
00323  return ret;
00324 }

int ODBCStart ODBCSession database,
char *  command,
SQLHSTMT *  st
 

Definition at line 225 of file cgi_odbc.c.

References BufferWrite(), ODBCSession::debug, ODBCSession::ErrorMessage, ODBCSession::hdbc, ODBCSession::henv, ListErrors(), and LogError().

Referenced by ODBCExec(), and ODBCSelect().

00226 {
00227  int r;
00228 
00229  r = SQLAllocHandle(SQL_HANDLE_STMT, database->hdbc, st);
00230  if (!SQL_SUCCEEDED(r))
00231   {
00232    LogError("\nCan't allocate a statement handle");
00233    BufferWrite(database->ErrorMessage,"Can't allocate a statement handle\n");
00234    return 54;
00235   }
00236 
00237  r = SQLExecDirect(*st, (unsigned char*)command, SQL_NTS);
00238 
00239  if (database->debug)
00240    {
00241      char x[32];
00242      LogError("\nSQL statement:");
00243      LogError(command);
00244      LogError("\nSQL result:");
00245      sprintf(x,"%d",r);
00246      LogError(x);
00247    }
00248 
00249  if (database->ErrorMessage)
00250  {
00251    if (!SQL_SUCCEEDED(r))
00252    {
00253      BufferWrite(database->ErrorMessage,"SQL error in:");
00254      BufferWrite(database->ErrorMessage,command);
00255      BufferWrite(database->ErrorMessage,"\n");
00256    }
00257    if (!SQL_SUCCEEDED(r) || database->debug)
00258    {
00259      ListErrors(database->ErrorMessage, st, SQL_HANDLE_STMT);
00260      ListErrors(database->ErrorMessage, database->hdbc, SQL_HANDLE_DBC);
00261      ListErrors(database->ErrorMessage, database->henv, SQL_HANDLE_ENV);
00262    }
00263  }
00264 
00265  if (!SQL_SUCCEEDED(r))
00266    return 54;
00267 
00268  return 0;
00269 }



Raosoft, Inc.
Raosoft EZReport, EZSurvey, InterForm, RapidReport, Raosoft, and SurveyWin are registered trademarks of Raosoft, Inc. Page contents © 1996-2007 by Raosoft, Inc. You may use and modify this file for your own use, but may not distribute it or derivative works without the prior written consent of Raosoft, Inc. This software is provided "as is," and Raosoft makes no warranty, express or implied, of fitness for a particular application. Every measure has been taken to anticipate risks inherent to computer networks, but we cannot guarantee safety or reliability of this program in every situation.
Tel: 206-525-4025 (US) Email: raosoft@raosoft.com
http://www.raosoft.com/