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

📄 parseoutputbinds.c

📁 适合于Unix/Linux下的一个持久数据库连接池
💻 C
字号:
// Copyright (c) 1999-2001  David Muse// See the file COPYING for more information#include <config.h>#include <sqlrelay/sqlrclient.h>#include <rudiments/rawbuffer.h>#include <defines.h>bool sqlrcursor::parseOutputBinds() {	if (sqlrc->debug) {		sqlrc->debugPreStart();		sqlrc->debugPrint("Receiving Output Bind Values: \n");		sqlrc->debugPreEnd();	}	// useful variables	uint16_t	type;	uint32_t	length;	uint16_t	count=0;	// get the bind values	for (;;) {		if (sqlrc->debug) {			sqlrc->debugPreStart();			sqlrc->debugPrint("	getting type...\n");			sqlrc->debugPreEnd();		}		// get the data type		if (getShort(&type)!=sizeof(uint16_t)) {			setError("Failed to get data type.\n "				"A network error may have occurred.");			return false;		}		if (sqlrc->debug) {			sqlrc->debugPreStart();			sqlrc->debugPrint("	done getting type: ");			sqlrc->debugPrint((int64_t)type);			sqlrc->debugPrint("\n");			sqlrc->debugPreEnd();		}		// check for end of bind values		if (type==END_BIND_VARS) {			break;		} else if (type==NULL_DATA) {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	NULL output bind\n");				sqlrc->debugPreEnd();			}			// handle a null value			outbindvars[count].valuesize=0;			if (outbindvars[count].type==STRING_BIND) {				if (returnnulls) {					outbindvars[count].value.							stringval=NULL;				} else {					outbindvars[count].value.							stringval=new char[1];					outbindvars[count].value.							stringval[0]=(char)NULL;				}			} else if (outbindvars[count].type==INTEGER_BIND) {				outbindvars[count].value.integerval=0;			} else if (outbindvars[count].type==DOUBLE_BIND) {				outbindvars[count].value.doubleval.value=0;				outbindvars[count].value.doubleval.precision=0;				outbindvars[count].value.doubleval.scale=0;			} 			if (sqlrc->debug) {				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching.\n");			}		} else if (type==STRING_DATA) {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	STRING output bind\n");				sqlrc->debugPreEnd();			}			// get the value length			if (getLong(&length)!=sizeof(uint32_t)) {				setError("Failed to get string value length.\n "					"A network error may have occurred.");				return false;			}			outbindvars[count].valuesize=length;			outbindvars[count].value.stringval=new char[length+1];			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		length=");				sqlrc->debugPrint((int64_t)length);				sqlrc->debugPrint("\n");				sqlrc->debugPreEnd();			}			// get the value			if ((uint32_t)getString(outbindvars[count].value.						stringval,length)!=length) {				setError("Failed to get string value.\n "					"A network error may have occurred.");				return false;			}			outbindvars[count].value.stringval[length]=(char)NULL;			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching\n");				sqlrc->debugPreEnd();			}		} else if (type==INTEGER_DATA) {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	INTEGER output bind\n");				sqlrc->debugPreEnd();			}			// get the value			if (getLongLong((uint64_t *)&outbindvars[count].					value.integerval)!=sizeof(uint64_t)) {				setError("Failed to get integer value.\n "					"A network error may have occurred.");				return false;			}			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching\n");				sqlrc->debugPreEnd();			}		} else if (type==DOUBLE_DATA) {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	DOUBLE output bind\n");				sqlrc->debugPreEnd();			}			// get the value			if (getDouble(&outbindvars[count].value.						doubleval.value)!=						sizeof(double)) {				setError("Failed to get double value.\n "					"A network error may have occurred.");				return false;			}			// get the precision			if (getLong(&outbindvars[count].value.						doubleval.precision)!=						sizeof(uint32_t)) {				setError("Failed to get precision.\n "					"A network error may have occurred.");				return false;			}			// get the scale			if (getLong(&outbindvars[count].value.						doubleval.scale)!=						sizeof(uint32_t)) {				setError("Failed to get scale.\n "					"A network error may have occurred.");				return false;			}			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching\n");				sqlrc->debugPreEnd();			}		} else if (type==CURSOR_DATA) {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	CURSOR output bind\n");				sqlrc->debugPreEnd();			}			// get the cursor id			if (getShort((uint16_t *)					&(outbindvars[count].value.cursorid))!=						sizeof(uint16_t)) {				setError("Failed to get cursor id.\n "					"A network error may have occurred.");				return false;			}			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching\n");				sqlrc->debugPreEnd();			}		} else {			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("	LOB/CLOB ");				sqlrc->debugPrint("output bind\n");				sqlrc->debugPreEnd();			}			// must be START_LONG_DATA...			// get the total length of the long data			uint64_t	totallength;			if (getLongLong(&totallength)!=sizeof(uint64_t)) {				setError("Failed to get total length.\n "					"A network error may have occurred.");				return false;			}			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		length=");				sqlrc->debugPrint((int64_t)totallength);				sqlrc->debugPrint("\n");				sqlrc->debugPreEnd();			}			// create a buffer to hold the data			char	*buffer=new char[totallength+1];			uint64_t	offset=0;			uint32_t	length;			for (;;) {				if (sqlrc->debug) {					sqlrc->debugPreStart();					sqlrc->debugPrint("		");					sqlrc->debugPrint("fetching...\n");					sqlrc->debugPreEnd();				}				// get the type of the chunk				if (getShort(&type)!=sizeof(uint16_t)) {					delete[] buffer;					setError("Failed to get chunk type.\n "						"A network error may have "						"occurred.");					return false;				}				// check to see if we're done				if (type==END_LONG_DATA) {					break;				}				// get the length of the chunk				if (getLong(&length)!=sizeof(uint32_t)) {					delete[] buffer;					setError("Failed to get chunk length.\n"						" A network error may have "						"occurred.");					return false;				}				// get the chunk of data				if ((uint32_t)getString(buffer+offset,							length)!=length) {					delete[] buffer;					setError("Failed to get chunk data.\n "						"A network error may have "						"occurred.");					return false;				}				offset=offset+length;			}			if (sqlrc->debug) {				sqlrc->debugPreStart();				sqlrc->debugPrint("		");				sqlrc->debugPrint("done fetching.\n");				sqlrc->debugPreEnd();			}			// NULL terminate the buffer.  This makes 			// certain operations safer and won't hurt			// since the actual length (which doesn't			// include the NULL) is available from			// getOutputBindLength.			buffer[totallength]=(char)NULL;			outbindvars[count].value.lobval=buffer;			outbindvars[count].valuesize=totallength;		}		if (sqlrc->debug) {			sqlrc->debugPreStart();			sqlrc->debugPrint(outbindvars[count].variable);			sqlrc->debugPrint("=");			if (outbindvars[count].type==BLOB_BIND) {				sqlrc->debugPrintBlob(					outbindvars[count].value.lobval,					outbindvars[count].valuesize);			} else if (outbindvars[count].type==CLOB_BIND) {				sqlrc->debugPrintClob(					outbindvars[count].value.lobval,					outbindvars[count].valuesize);			} else if (outbindvars[count].type==CURSOR_BIND) {				sqlrc->debugPrint((int64_t)outbindvars[count].								value.cursorid);			} else if (outbindvars[count].type==INTEGER_BIND) {				sqlrc->debugPrint(outbindvars[count].							value.integerval);			} else if (outbindvars[count].type==DOUBLE_BIND) {				sqlrc->debugPrint(outbindvars[count].						value.doubleval.value);				sqlrc->debugPrint("(");				sqlrc->debugPrint((int64_t)outbindvars[count].						value.doubleval.precision);				sqlrc->debugPrint(",");				sqlrc->debugPrint((int64_t)outbindvars[count].						value.doubleval.scale);				sqlrc->debugPrint(")");			} else {				sqlrc->debugPrint(outbindvars[count].							value.stringval);			}			sqlrc->debugPrint("\n");			sqlrc->debugPreEnd();		}		count++;	}	// cache the output binds	cacheOutputBinds(count);	return true;}

⌨️ 快捷键说明

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