⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sqlrelaycmd.c

📁 适合于Unix/Linux下的一个持久数据库连接池
💻 C
📖 第 1 页 / 共 4 页
字号:
/* * sqlrelayCmd.c * Copyright (c) 2003 Takeshi Taguchi * $Id: sqlrelayCmd.C,v 1.25 2007/05/18 01:34:35 mused Exp $ */#include <tcl.h>#include <sqlrelay/sqlrclient.h>#include <rudiments/charstring.h>#include <config.h>#ifndef HAVE_TCL_GETSTRING	#define Tcl_GetString(a) Tcl_GetStringFromObj(a,NULL)#endif#ifdef HAVE_TCL_CONSTCHAR	#define CONSTCHAR const char#else	#define CONSTCHAR char#endif#ifndef HAVE_TCL_WIDEINT	#define Tcl_WideInt long	#define Tcl_GetWideIntFromObj(a,b,c) Tcl_GetLongFromObj(a,b,c)#endifextern "C" {/* * getCursorID -- *    This procedure return tcl obj contains sqlrcur command name. * Results: *    Tcl object. * Side effects: *    count up static variable count. */Tcl_Obj *getCursorID(void) {  Tcl_Obj *id;  static int count = 0;  id = Tcl_NewStringObj("sqlrcur", -1);  Tcl_AppendStringsToObj(id, Tcl_GetString(Tcl_NewIntObj(count++)),			(char *)NULL);  return (id);}/* * sqlrcurDelete -- *    This procedure is for deleting sqlrcur command. * Results: *    none * Side effects: *    call cur->free() */void sqlrcurDelete(ClientData data) {  sqlrcursor *cur = (sqlrcursor *)data;  if (cur != (sqlrcursor *)NULL) {    delete cur;    cur = (sqlrcursor *)NULL;  }}/* * sqlrcurObjCmd -- *   This procedure is invoked to process the "sqlrcur" object command. * Synopsis: *   $cur eval query *   $cur setResultSetBufferSize ?rows? *   $cur getResultSetBufferSize *   $cur dontGetColumnInfo *   $cur getColumnInfo *   $cur caseColumnNames mixed|upper|low *   $cur cacheToFile filename *   $cur setCacheTtl ttl *   $cur getCacheFileName *   $cur cacheOff *   $cur sendQuery query *   $cur sendQueryWithLength query length *   $cur sendFileQuery path filename *   $cur prepareQuery query *   $cur prepareQueryWithLength query length *   $cur prepareFileQuery path filename *   $cur substitution variable value *   $cur clearBinds *   $cur countBindVariables *   $cur inputBind *   $cur inputBindBlob variable value size *   $cur inputBindClob variable value size *   $cur defineOutputBindString variable value *   $cur defineOutputBindInteger variable value *   $cur defineOutputBindDouble variable value *   $cur defineOutputBindBlob variable *   $cur defineOutputBindClob variable *   $cur defineOutputBindCursor variable *   $cur substitutions {{variable value} ...} *   $cur inputBinds {{variable value ?precision scale?} ...} *   $cur validateBinds *   $cur validBind *   $cur executeQuery *   $cur fetchFromBindCursor *   $cur getOutputBindString variable *   $cur getOutputBindBlob variable *   $cur getOutputBindClob variable *   $cur getOutputBindInteger variable *   $cur getOutputBindDouble variable *   $cur getOutputBindLength variable *   $cur getOutputBindCursor variable *   $cur openCachedResultSet variable *   $cur colCount *   $cur rowCount *   $cur totalRows *   $cur affectedRows *   $cur firstRowIndex *   $cur endOfResultSet *   $cur errorMessage *   $cur getFieldByIndex row col *   $cur getFieldByName row col *   $cur getFieldAsIntegerByIndex row col *   $cur getFieldAsIntegerByName row col *   $cur getFieldAsDoubleByIndex row col *   $cur getFieldAsDoubleByName row col *   $cur getFieldLengthByIndex row col *   $cur getFieldLengthByName row col *   $cur getRow row *   $cur getRowLengths row *   $cur getColumnNames *   $cur getColumnName col *   $cur getColumnTypeByIndex col *   $cur getColumnTypeByName col *   $cur getColumnLengthByIndex col *   $cur getColumnLengthByName col *   $cur getColumnPrecisionByIndex col *   $cur getColumnPrecisionByName col *   $cur getColumnScaleByIndex col *   $cur getColumnScaleByName col *   $cur getColumnIsNullableByIndex col *   $cur getColumnIsNullableByName col *   $cur getColumnIsPrimaryKeyByIndex col *   $cur getColumnIsPrimaryKeyByName col *   $cur getColumnIsUniqueByIndex col *   $cur getColumnIsUniqueByName col *   $cur getColumnIsPartOfKeyByIndex col *   $cur getColumnIsPartOfKeyByName col *   $cur getColumnIsUnsignedByIndex col *   $cur getColumnIsUnsignedByName col *   $cur getColumnIsZeroFilledByIndex col *   $cur getColumnIsZeroFilledByName col *   $cur getColumnIsBinaryByIndex col *   $cur getColumnIsBinaryByName col *   $cur getColumnIsAutoIncrementByIndex col *   $cur getColumnIsAutoIncrementByName col *   $cur getLongestByIndex col *   $cur getLongestByName col *   $cur getResultSetId *   $cur suspendResultSet *   $cur resumeResultSet is *   $cur resumeCachedResultSet id filename *  Note: *   cur->getNullsAsEmptyStrings, and cur->getNullsAsNulls are not *   supported. */int sqlrcurObjCmd(ClientData data, Tcl_Interp *interp,		  int objc, Tcl_Obj *CONST objv[]) {  sqlrcursor *cur = (sqlrcursor *)data;  int index;  static CONSTCHAR *options[] = {    "eval",    "setResultSetBufferSize",    "getResultSetBufferSize",    "dontGetColumnInfo",    "getColumnInfo",    "caseColumnNames",    "cacheToFile",    "setCacheTtl",    "getCacheFileName",    "cacheOff",    "sendQuery",    "sendQueryWithLength",    "sendFileQuery",    "prepareQuery",    "prepareQueryWithLength",    "prepareFileQuery",    "substitution",    "clearBinds",    "countBindVariables",    "inputBind",    "inputBindBlob",    "inputBindClob",    "defineOutputBindString",    "defineOutputBindInteger",    "defineOutputBindDouble",    "defineOutputBindBlob",    "defineOutputBindClob",    "defineOutputBindCursor",    "substitutions",    "inputBinds",    "validateBinds",    "validBind",    "executeQuery",    "fetchFromBindCursor",    "getOutputBindString",    "getOutputBindBlob",    "getOutputBindClob",    "getOutputBindInteger",    "getOutputBindDouble",    "getOutputBindLength",    "getOutputBindCursor",    "openCachedResultSet",    "colCount",    "rowCount",    "totalRows",    "affectedRows",    "firstRowIndex",    "endOfResultSet",    "errorMessage",    "getFieldByIndex",    "getFieldByName",    "getFieldAsIntegerByIndex",    "getFieldAsIntegerByName",    "getFieldAsDoubleByIndex",    "getFieldAsDoubleByName",    "getFieldLengthByIndex",    "getFieldLengthByName",    "getRow",    "getRowLengths",    "getColumnNames",    "getColumnName",    "getColumnTypeByIndex",    "getColumnTypeByName",    "getColumnLengthByIndex",    "getColumnLengthByName",    "getColumnPrecisionByIndex",    "getColumnPrecisionByName",    "getColumnScaleByIndex",    "getColumnScaleByName",    "getColumnIsNullableByIndex",    "getColumnIsNullableByName",    "getColumnIsPrimaryKeyByIndex",    "getColumnIsPrimaryKeyByName",    "getColumnIsUniqueByIndex",    "getColumnIsUniqueByName",    "getColumnIsPartOfKeyByIndex",    "getColumnIsPartOfKeyByName",    "getColumnIsUnsignedByIndex",    "getColumnIsUnsignedByName",    "getColumnIsZeroFilledByIndex",    "getColumnIsZeroFilledByName",    "getColumnIsBinaryByIndex",    "getColumnIsBinaryByName",    "getColumnIsAutoIncrementByIndex",    "getColumnIsAutoIncrementByName",    "getLongestByIndex",    "getLongestByName",    "getResultSetId",    "suspendResultSet",    "resumeResultSet",    "resumeCachedResultSet",  };    enum options {    SQLRCUR_eval,    SQLRCUR_setResultSetBufferSize,    SQLRCUR_getResultSetBufferSize,    SQLRCUR_dontGetColumnInfo,    SQLRCUR_getColumnInfo,    SQLRCUR_caseColumnNames,    SQLRCUR_cacheToFile,    SQLRCUR_setCacheTtl,    SQLRCUR_getCacheFileName,    SQLRCUR_cacheOff,    SQLRCUR_sendQuery,    SQLRCUR_sendQueryWithLength,    SQLRCUR_sendFileQuery,    SQLRCUR_prepareQuery,    SQLRCUR_prepareQueryWithLength,    SQLRCUR_prepareFileQuery,    SQLRCUR_substitution,    SQLRCUR_clearBinds,    SQLRCUR_countBindVariables,    SQLRCUR_inputBind,    SQLRCUR_inputBindBlob,    SQLRCUR_inputBindClob,    SQLRCUR_defineOutputBindString,    SQLRCUR_defineOutputBindInteger,    SQLRCUR_defineOutputBindDouble,    SQLRCUR_defineOutputBindBlob,    SQLRCUR_defineOutputBindClob,    SQLRCUR_defineOutputBindCursor,    SQLRCUR_substitutions,    SQLRCUR_inputBinds,    SQLRCUR_validateBinds,    SQLRCUR_validBind,    SQLRCUR_executeQuery,    SQLRCUR_fetchFromBindCursor,    SQLRCUR_getOutputBindString,    SQLRCUR_getOutputBindBlob,    SQLRCUR_getOutputBindClob,    SQLRCUR_getOutputBindInteger,    SQLRCUR_getOutputBindDouble,    SQLRCUR_getOutputBindLength,    SQLRCUR_getOutputBindCursor,    SQLRCUR_openCachedResultSet,    SQLRCUR_colCount,    SQLRCUR_rowCount,    SQLRCUR_totalRows,    SQLRCUR_affectedRows,    SQLRCUR_firstRowIndex,    SQLRCUR_endOfResultSet,    SQLRCUR_errorMessage,    SQLRCUR_getFieldByIndex,    SQLRCUR_getFieldByName,    SQLRCUR_getFieldAsIntegerByIndex,    SQLRCUR_getFieldAsIntegerByName,    SQLRCUR_getFieldAsDoubleByIndex,    SQLRCUR_getFieldAsDoubleByName,    SQLRCUR_getFieldLengthByIndex,    SQLRCUR_getFieldLengthByName,    SQLRCUR_getRow,    SQLRCUR_getRowLengths,    SQLRCUR_getColumnNames,    SQLRCUR_getColumnName,    SQLRCUR_getColumnTypeByIndex,    SQLRCUR_getColumnTypeByName,    SQLRCUR_getColumnLengthByIndex,    SQLRCUR_getColumnLengthByName,    SQLRCUR_getColumnPrecisionByIndex,    SQLRCUR_getColumnPrecisionByName,    SQLRCUR_getColumnScaleByIndex,    SQLRCUR_getColumnScaleByName,    SQLRCUR_getColumnIsNullableByIndex,    SQLRCUR_getColumnIsNullableByName,    SQLRCUR_getColumnIsPrimaryKeyByIndex,    SQLRCUR_getColumnIsPrimaryKeyByName,    SQLRCUR_getColumnIsUniqueByIndex,    SQLRCUR_getColumnIsUniqueByName,    SQLRCUR_getColumnIsPartOfKeyByIndex,    SQLRCUR_getColumnIsPartOfKeyByName,    SQLRCUR_getColumnIsUnsignedByIndex,    SQLRCUR_getColumnIsUnsignedByName,    SQLRCUR_getColumnIsZeroFilledByIndex,    SQLRCUR_getColumnIsZeroFilledByName,    SQLRCUR_getColumnIsBinaryByIndex,    SQLRCUR_getColumnIsBinaryByName,    SQLRCUR_getColumnIsAutoIncrementByIndex,    SQLRCUR_getColumnIsAutoIncrementByName,    SQLRCUR_getLongestByIndex,    SQLRCUR_getLongestByName,    SQLRCUR_getResultSetId,    SQLRCUR_suspendResultSet,    SQLRCUR_resumeResultSet,    SQLRCUR_resumeCachedResultSet,  };  if (objc < 2) {    Tcl_WrongNumArgs(interp, 1, objv, "option ?arg?");    return TCL_ERROR;  }  if (Tcl_GetIndexFromObj(interp, objv[1], (CONSTCHAR **)options, "option", 0,			  (int *)&index) != TCL_OK) {    return TCL_ERROR;  }  switch ((enum options)index)    {    case SQLRCUR_eval:      {	uint64_t row;	uint32_t col;	Tcl_Obj *rowObj, *result;	if (objc != 3) {	  Tcl_WrongNumArgs(interp, 2, objv, "query");	  return TCL_ERROR;	}	if (!cur->sendQuery(Tcl_GetString(objv[2]))) {	  Tcl_AppendResult(interp,cur->errorMessage(),(char *)NULL);	  return TCL_ERROR;	}	result = Tcl_NewObj();	for (row = 0; row < cur->rowCount(); row++) {	  rowObj = Tcl_NewObj();	  for (col = 0; col < cur->colCount(); col++) {	    const char *field = cur->getField(row, col);	    uint32_t length = cur->getFieldLength(row, col);	    if (field == (char *)NULL) { field = ""; }	    if (Tcl_ListObjAppendElement(interp, rowObj,					 Tcl_NewStringObj(field, length))		!= TCL_OK) {	      return TCL_ERROR;	    }	  }	  if (Tcl_ListObjAppendElement(interp, result, rowObj) != TCL_OK) {	    return TCL_ERROR;	  }	}	Tcl_SetObjResult(interp, result);	break;      }    case SQLRCUR_setResultSetBufferSize:      {	int rows = 0;	if (objc > 3) {	  Tcl_WrongNumArgs(interp, 2, objv, "?rows?");	  return TCL_ERROR;	} else if (objc == 3) {	  if (Tcl_GetIntFromObj(interp, objv[2], &rows) != TCL_OK) {	    return TCL_ERROR;	  }	  cur->setResultSetBufferSize(rows);	} else {	  Tcl_SetObjResult(interp,			   Tcl_NewIntObj(cur->getResultSetBufferSize()));	}	break;      }    case SQLRCUR_getResultSetBufferSize:      {	if (objc > 2) {	  Tcl_WrongNumArgs(interp, 2, objv, NULL);	  return TCL_ERROR;	}	Tcl_SetObjResult(interp,			 Tcl_NewIntObj(cur->getResultSetBufferSize()));	break;      }    case SQLRCUR_dontGetColumnInfo:      {	if (objc > 2) {	  Tcl_WrongNumArgs(interp, 2, objv, NULL);	  return TCL_ERROR;	}	cur->dontGetColumnInfo();	break;      }    case SQLRCUR_getColumnInfo:      {	if (objc > 2) {	  Tcl_WrongNumArgs(interp, 2, objv, NULL);	  return TCL_ERROR;	}	cur->getColumnInfo();	break;      }    case SQLRCUR_caseColumnNames:      {	if (objc != 3) {	  Tcl_WrongNumArgs(interp, 2, objv, "mixed|upper|lower");	  return TCL_ERROR;	} else {	  char *subopts = Tcl_GetString(objv[2]);	  if (charstring::compareIgnoringCase(subopts, "mixed", 5) == 0) {	    cur->mixedCaseColumnNames();	  } else if (charstring::compareIgnoringCase(subopts, "upper", 5) == 0) {	    cur->upperCaseColumnNames();	  } else if (charstring::compareIgnoringCase(subopts, "lower", 5) == 0) {	    cur->lowerCaseColumnNames();	  } else {	    Tcl_AppendResult(interp, "bad option \"", subopts, "\": must be mixed, upper, or lower", (char *)NULL);	    return TCL_ERROR;	  }	}	break;      }    case SQLRCUR_cacheToFile:      {	if (objc != 3) {	  Tcl_WrongNumArgs(interp,2, objv, "filename");	  return TCL_ERROR;	}	cur->cacheToFile(Tcl_GetString(objv[2]));	break;      }    case SQLRCUR_setCacheTtl:      {	int ttl = 0;	if (objc != 3) {	  Tcl_WrongNumArgs(interp,2, objv, "ttl");	  return TCL_ERROR;	}	if (Tcl_GetIntFromObj(interp, objv[2], &ttl) != TCL_OK) {	  return TCL_ERROR;	}	cur->setCacheTtl(ttl);	break;      }    case SQLRCUR_getCacheFileName:      {	if (objc > 2) {	  Tcl_WrongNumArgs(interp, 2, objv, NULL);	  return TCL_ERROR;	}	Tcl_AppendResult(interp, cur->getCacheFileName(), (char *)NULL);	break;      }    case SQLRCUR_cacheOff:      {	if (objc > 2) {	  Tcl_WrongNumArgs(interp, 2, objv, NULL);	  return TCL_ERROR;	}	cur->cacheOff();	break;      }    case SQLRCUR_sendQuery:       {	int result = 0;	if (objc != 3) {	  Tcl_WrongNumArgs(interp,2, objv, "query");	  return TCL_ERROR;	}	if (!(result = cur->sendQuery(Tcl_GetString(objv[2])))) {	  Tcl_AppendResult(interp,cur->errorMessage(),(char *)NULL);	  return TCL_ERROR;	}	Tcl_SetObjResult(interp, Tcl_NewBooleanObj(result));	break;      }    case SQLRCUR_sendQueryWithLength:       {	int result = 0;	int length = 0;	if (objc != 4) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -