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

📄 execute.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
📖 第 1 页 / 共 2 页
字号:
//      -       -       -       -       -       -       -       -       -RETCODE SQL_API SQLCancel(        HSTMT   hstmt)  // Statement to cancel.{static char *func="SQLCancel";StatementClass *stmt = (StatementClass *) hstmt;RETCODE result;#ifdef WIN32HMODULE hmodule;FARPROC addr;#endif	mylog( "%s: entering...\n", func);	//	Check if this can handle canceling in the middle of a SQLPutData?	if ( ! stmt) {		SC_log_error(func, "", NULL);		return SQL_INVALID_HANDLE;	}	//	Not in the middle of SQLParamData/SQLPutData so cancel like a close.	if (stmt->data_at_exec < 0) {		/*	MAJOR HACK for Windows to reset the driver manager's cursor state:			Because of what seems like a bug in the Odbc driver manager,			SQLCancel does not act like a SQLFreeStmt(CLOSE), as many			applications depend on this behavior.  So, this 			brute force method calls the driver manager's function on			behalf of the application.  		*/#ifdef WIN32		if (globals.cancel_as_freestmt) {			hmodule = GetModuleHandle("ODBC32");			addr = GetProcAddress(hmodule, "SQLFreeStmt");			result = addr( (char *) (stmt->phstmt) - 96, SQL_CLOSE);		}		else {			result = SQLFreeStmt( hstmt, SQL_CLOSE);		}#else		result = SQLFreeStmt( hstmt, SQL_CLOSE);#endif		mylog("SQLCancel:  SQLFreeStmt returned %d\n", result);		SC_clear_error(hstmt);		return SQL_SUCCESS;	}	//	In the middle of SQLParamData/SQLPutData, so cancel that.	//	Note, any previous data-at-exec buffers will be freed in the recycle	//	if they call SQLExecDirect or SQLExecute again.	stmt->data_at_exec = -1;	stmt->current_exec_param = -1;	stmt->put_data = FALSE;	return SQL_SUCCESS;}//      -       -       -       -       -       -       -       -       -//      Returns the SQL string as modified by the driver.//		Currently, just copy the input string without modification//		observing buffer limits and truncation.RETCODE SQL_API SQLNativeSql(        HDBC      hdbc,        UCHAR FAR *szSqlStrIn,        SDWORD     cbSqlStrIn,        UCHAR FAR *szSqlStr,        SDWORD     cbSqlStrMax,        SDWORD FAR *pcbSqlStr){static char *func="SQLNativeSql";int len = 0;char *ptr;ConnectionClass *conn = (ConnectionClass *) hdbc;RETCODE result;	mylog( "%s: entering...cbSqlStrIn=%d\n", func, cbSqlStrIn);	ptr = (cbSqlStrIn == 0) ? "" : make_string(szSqlStrIn, cbSqlStrIn, NULL);	if ( ! ptr) {		conn->errornumber = CONN_NO_MEMORY_ERROR;		conn->errormsg = "No memory available to store native sql string";		CC_log_error(func, "", conn);		return SQL_ERROR;	}	result = SQL_SUCCESS;	len = strlen(ptr);	if (szSqlStr) {		strncpy_null(szSqlStr, ptr, cbSqlStrMax);		if (len >= cbSqlStrMax)  {			result = SQL_SUCCESS_WITH_INFO;			conn->errornumber = STMT_TRUNCATED;			conn->errormsg = "The buffer was too small for the result.";		}	}	if (pcbSqlStr)		*pcbSqlStr = len;	free(ptr);    return result;}//      -       -       -       -       -       -       -       -       -//      Supplies parameter data at execution time.      Used in conjuction with//      SQLPutData.RETCODE SQL_API SQLParamData(        HSTMT   hstmt,        PTR FAR *prgbValue){static char *func = "SQLParamData";StatementClass *stmt = (StatementClass *) hstmt;int i, retval;	mylog( "%s: entering...\n", func);	if ( ! stmt) {		SC_log_error(func, "", NULL);		return SQL_INVALID_HANDLE;	}	mylog("%s: data_at_exec=%d, params_alloc=%d\n", func, stmt->data_at_exec, stmt->parameters_allocated);	if (stmt->data_at_exec < 0) {		stmt->errornumber = STMT_SEQUENCE_ERROR;		stmt->errormsg = "No execution-time parameters for this statement";		SC_log_error(func, "", stmt);		return SQL_ERROR;	}	if (stmt->data_at_exec > stmt->parameters_allocated) {		stmt->errornumber = STMT_SEQUENCE_ERROR;		stmt->errormsg = "Too many execution-time parameters were present";		SC_log_error(func, "", stmt);		return SQL_ERROR;	}	/* close the large object */	if ( stmt->lobj_fd >= 0) {		lo_close(stmt->hdbc, stmt->lobj_fd);		stmt->lobj_fd = -1;	}	/*	Done, now copy the params and then execute the statement */	if (stmt->data_at_exec == 0) {		retval = copy_statement_with_parameters(stmt);		if (retval != SQL_SUCCESS)			return retval;		stmt->current_exec_param = -1;		return SC_execute(stmt);	}	/*	Set beginning param;  if first time SQLParamData is called , start at 0.		Otherwise, start at the last parameter + 1.	*/	i = stmt->current_exec_param >= 0 ? stmt->current_exec_param+1 : 0;	/*	At least 1 data at execution parameter, so Fill in the token value */	for ( ; i < stmt->parameters_allocated; i++) {		if (stmt->parameters[i].data_at_exec == TRUE) {			stmt->data_at_exec--;			stmt->current_exec_param = i;			stmt->put_data = FALSE;			*prgbValue = stmt->parameters[i].buffer;	/* token */			break;		}	}	return SQL_NEED_DATA;}//      -       -       -       -       -       -       -       -       -//      Supplies parameter data at execution time.      Used in conjunction with//      SQLParamData.RETCODE SQL_API SQLPutData(        HSTMT   hstmt,        PTR     rgbValue,        SDWORD  cbValue){static char *func = "SQLPutData";StatementClass *stmt = (StatementClass *) hstmt;int old_pos, retval;ParameterInfoClass *current_param;char *buffer;	mylog( "%s: entering...\n", func);	if ( ! stmt) {		SC_log_error(func, "", NULL);		return SQL_INVALID_HANDLE;	}		if (stmt->current_exec_param < 0) {		stmt->errornumber = STMT_SEQUENCE_ERROR;		stmt->errormsg = "Previous call was not SQLPutData or SQLParamData";		SC_log_error(func, "", stmt);		return SQL_ERROR;	}	current_param = &(stmt->parameters[stmt->current_exec_param]);	if ( ! stmt->put_data) {	/* first call */		mylog("SQLPutData: (1) cbValue = %d\n", cbValue);		stmt->put_data = TRUE;		current_param->EXEC_used = (SDWORD *) malloc(sizeof(SDWORD));		if ( ! current_param->EXEC_used) {			stmt->errornumber = STMT_NO_MEMORY_ERROR;			stmt->errormsg = "Out of memory in SQLPutData (1)";			SC_log_error(func, "", stmt);			return SQL_ERROR;		}		*current_param->EXEC_used = cbValue;		if (cbValue == SQL_NULL_DATA)			return SQL_SUCCESS;		/*	Handle Long Var Binary with Large Objects */		if ( current_param->SQLType == SQL_LONGVARBINARY) {			/*	store the oid */			current_param->lobj_oid = lo_creat(stmt->hdbc, INV_READ | INV_WRITE);			if (current_param->lobj_oid == 0) {				stmt->errornumber = STMT_EXEC_ERROR;				stmt->errormsg = "Couldnt create large object.";				SC_log_error(func, "", stmt);				return SQL_ERROR;			}			/*	major hack -- to allow convert to see somethings there */			/*					have to modify convert to handle this better */			current_param->EXEC_buffer = (char *) &current_param->lobj_oid;			/*	store the fd */			stmt->lobj_fd = lo_open(stmt->hdbc, current_param->lobj_oid, INV_WRITE);			if ( stmt->lobj_fd < 0) {				stmt->errornumber = STMT_EXEC_ERROR;				stmt->errormsg = "Couldnt open large object for writing.";				SC_log_error(func, "", stmt);				return SQL_ERROR;			}			retval = lo_write(stmt->hdbc, stmt->lobj_fd, rgbValue, cbValue);			mylog("lo_write: cbValue=%d, wrote %d bytes\n", cbValue, retval);		}		else {	/* for handling text fields and small binaries */			if (cbValue == SQL_NTS) {				current_param->EXEC_buffer = strdup(rgbValue);				if ( ! current_param->EXEC_buffer) {					stmt->errornumber = STMT_NO_MEMORY_ERROR;					stmt->errormsg = "Out of memory in SQLPutData (2)";					SC_log_error(func, "", stmt);					return SQL_ERROR;				}			}			else {				current_param->EXEC_buffer = malloc(cbValue + 1);				if ( ! current_param->EXEC_buffer) {					stmt->errornumber = STMT_NO_MEMORY_ERROR;					stmt->errormsg = "Out of memory in SQLPutData (2)";					SC_log_error(func, "", stmt);					return SQL_ERROR;				}				memcpy(current_param->EXEC_buffer, rgbValue, cbValue);				current_param->EXEC_buffer[cbValue] = '\0';			}		}	}	else {	/* calling SQLPutData more than once */		mylog("SQLPutData: (>1) cbValue = %d\n", cbValue);		if (current_param->SQLType == SQL_LONGVARBINARY) {			/* the large object fd is in EXEC_buffer */			retval = lo_write(stmt->hdbc, stmt->lobj_fd, rgbValue, cbValue);			mylog("lo_write(2): cbValue = %d, wrote %d bytes\n", cbValue, retval);			*current_param->EXEC_used += cbValue;		} else {			buffer = current_param->EXEC_buffer;			if (cbValue == SQL_NTS) {				buffer = realloc(buffer, strlen(buffer) + strlen(rgbValue) + 1);				if ( ! buffer) {					stmt->errornumber = STMT_NO_MEMORY_ERROR;					stmt->errormsg = "Out of memory in SQLPutData (3)";					SC_log_error(func, "", stmt);					return SQL_ERROR;				}				strcat(buffer, rgbValue);				mylog("       cbValue = SQL_NTS: strlen(buffer) = %d\n", strlen(buffer));				*current_param->EXEC_used = cbValue;				/*	reassign buffer incase realloc moved it */				current_param->EXEC_buffer = buffer;			}			else if (cbValue > 0) {				old_pos = *current_param->EXEC_used;				*current_param->EXEC_used += cbValue;				mylog("        cbValue = %d, old_pos = %d, *used = %d\n", cbValue, old_pos, *current_param->EXEC_used);				/* dont lose the old pointer in case out of memory */				buffer = realloc(current_param->EXEC_buffer, *current_param->EXEC_used + 1);				if ( ! buffer) {					stmt->errornumber = STMT_NO_MEMORY_ERROR;					stmt->errormsg = "Out of memory in SQLPutData (3)";					SC_log_error(func, "", stmt);					return SQL_ERROR;				}				memcpy(&buffer[old_pos], rgbValue, cbValue);				buffer[*current_param->EXEC_used] = '\0';				/*	reassign buffer incase realloc moved it */				current_param->EXEC_buffer = buffer;							}			else {				SC_log_error(func, "bad cbValue", stmt);				return SQL_ERROR;			}		}	}	return SQL_SUCCESS;}

⌨️ 快捷键说明

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