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

📄 fields.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 <defines.h>char *sqlrcursor::getFieldInternal(uint64_t row, uint32_t col) {	if (row<OPTIMISTIC_ROW_COUNT) {		return rows[row]->getField(col);	}	return extrarows[row-OPTIMISTIC_ROW_COUNT]->getField(col);}uint32_t sqlrcursor::getFieldLengthInternal(uint64_t row, uint32_t col) {	if (row<OPTIMISTIC_ROW_COUNT) {		return rows[row]->getFieldLength(col);	}	return extrarows[row-OPTIMISTIC_ROW_COUNT]->getFieldLength(col);}const char *sqlrcursor::getField(uint64_t row, uint32_t col) {	if (rowcount && row>=firstrowindex && col<colcount) {		// in the event that we're stepping through the result set 		// instead of buffering the entire thing, the requested row		// may have to be fetched into the buffer...		uint64_t	rowbufferindex;		if (fetchRowIntoBuffer(false,row,&rowbufferindex)) {			return getFieldInternal(rowbufferindex,col);		}	}	return NULL;}int64_t sqlrcursor::getFieldAsInteger(uint64_t row, uint32_t col) {	const char	*field=getField(row,col);	return (field)?charstring::toInteger(field):0;}double sqlrcursor::getFieldAsDouble(uint64_t row, uint32_t col) {	const char	*field=getField(row,col);	return (field)?charstring::toFloat(field):0.0;}const char *sqlrcursor::getField(uint64_t row, const char *col) {	if (sendcolumninfo==SEND_COLUMN_INFO && 			sentcolumninfo==SEND_COLUMN_INFO &&			rowcount && row>=firstrowindex) {		for (uint32_t i=0; i<colcount; i++) {			if (!charstring::compareIgnoringCase(					getColumnInternal(i)->name,col)) {				// in the event that we're stepping through the				// result set instead of buffering the entire 				// thing, the requested row may have to be 				// fetched into the buffer...				uint64_t	rowbufferindex;				if (fetchRowIntoBuffer(false,row,							&rowbufferindex)) {					return getFieldInternal(							rowbufferindex,i);				}				return NULL;			}		}	}	return NULL;}int64_t sqlrcursor::getFieldAsInteger(uint64_t row, const char *col) {	const char	*field=getField(row,col);	return (field)?charstring::toInteger(field):0;}double sqlrcursor::getFieldAsDouble(uint64_t row, const char *col) {	const char	*field=getField(row,col);	return (field)?charstring::toFloat(field):0.0;}uint32_t sqlrcursor::getFieldLength(uint64_t row, uint32_t col) {	if (rowcount && row>=firstrowindex && col<colcount) {		// in the event that we're stepping through the result set 		// instead of buffering the entire thing, the requested row		// may have to be fetched into the buffer...		uint64_t	rowbufferindex;		if (fetchRowIntoBuffer(false,row,&rowbufferindex)) {			return getFieldLengthInternal(rowbufferindex,col);		}	}	return 0;}uint32_t sqlrcursor::getFieldLength(uint64_t row, const char *col) {	if (sendcolumninfo==SEND_COLUMN_INFO && 			sentcolumninfo==SEND_COLUMN_INFO &&			rowcount && row>=firstrowindex) {		for (uint32_t i=0; i<colcount; i++) {			if (!charstring::compareIgnoringCase(					getColumnInternal(i)->name,col)) {				// in the event that we're stepping through the				// result set instead of buffering the entire 				// thing, the requested row may have to be 				// fetched into the buffer...				uint64_t	rowbufferindex;				if (fetchRowIntoBuffer(false,row,							&rowbufferindex)) {					return getFieldLengthInternal(							rowbufferindex,i);				}				return 0;			}		}	}	return 0;}const char * const *sqlrcursor::getRow(uint64_t row) {	if (rowcount && row>=firstrowindex) {		// in the event that we're stepping through the result set 		// instead of buffering the entire thing, the requested row		// may have to be fetched into the buffer...		uint64_t	rowbufferindex;		if (fetchRowIntoBuffer(false,row,&rowbufferindex)) {			if (!fields) {				createFields();			}			return fields[rowbufferindex];		}	}	return NULL;}void sqlrcursor::createFields() {	// lets say that rowcount=5 and firstrowindex=3,	// the fields array will contain 2 elements:	// 	fields[0] (corresponding to row 3) and	// 	fields[1] (corresponding to row 4)	uint64_t	rowbuffercount=rowcount-firstrowindex;	fields=new char **[rowbuffercount+1];	fields[rowbuffercount]=(char **)NULL;	for (uint64_t i=0; i<rowbuffercount; i++) {		fields[i]=new char *[colcount+1];		fields[i][colcount]=(char *)NULL;		for (uint32_t j=0; j<colcount; j++) {			fields[i][j]=getFieldInternal(i,j);		}	}}uint32_t *sqlrcursor::getRowLengths(uint64_t row) {	if (rowcount && row>=firstrowindex) {		// in the event that we're stepping through the result set 		// instead of buffering the entire thing, the requested row		// may have to be fetched into the buffer...		uint64_t	rowbufferindex;		if (fetchRowIntoBuffer(false,row,&rowbufferindex)) {			if (!fieldlengths) {				createFieldLengths();			}			return fieldlengths[rowbufferindex];		}	}	return NULL;}void sqlrcursor::createFieldLengths() {	// lets say that rowcount=5 and firstrowindex=3,	// the fieldlengths array will contain 2 elements:	// 	fieldlengths[0] (corresponding to row 3) and	// 	fieldlengths[1] (corresponding to row 4)	uint64_t	rowbuffercount=rowcount-firstrowindex;	fieldlengths=new uint32_t *[rowbuffercount+1];	fieldlengths[rowbuffercount]=(uint32_t)NULL;	for (uint64_t i=0; i<rowbuffercount; i++) {		fieldlengths[i]=new uint32_t[colcount+1];		fieldlengths[i][colcount]=(uint32_t)NULL;		for (uint32_t j=0; j<colcount; j++) {			fieldlengths[i][j]=getFieldLengthInternal(i,j);		}	}}

⌨️ 快捷键说明

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