📄 sqlrelaycmd.c
字号:
/* * 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 + -