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

📄 column.cpp

📁 对Oracle数据库OCI的一个轻量级封装
💻 CPP
字号:
// OraLib 0.0.3 / 2002-06-30
//	column.cpp
//
//	http://606u.dir.bg/
//	606u@dir.bg

#include "_p.h"

#include "oralib.h"


namespace oralib {


column::column (
	IN resultset *rs,
	IN const char *name,
	IN ub4 name_len,
	IN ub2 oci_data_type,
	IN ub4 max_data_size,
	IN OPTIONAL int fetch_size)	// = FETCH_SIZE
{
	// prerequisites
	ASSERT (rs && name);

	initialize ();

	col_name = std::string (name, name_len);
	oci_type = oci_data_type;

	// decide the format we want oci to return data in (oci_type member)
	switch (oci_data_type)
	{
	case	SQLT_INT:	// integer
	case	SQLT_LNG:	// long
	case	SQLT_UIN:	// unsigned int

	case	SQLT_NUM:	// numeric
	case	SQLT_FLT:	// float
	case	SQLT_VNU:	// numeric with length
	case	SQLT_PDN:	// packed decimal
		oci_type = SQLT_VNU;
		col_type = DT_NUMBER;
		size = sizeof (OCINumber);
		break;

	case	SQLT_DAT:	// date
	case	SQLT_ODT:	// oci date - should not appear?
		oci_type = SQLT_ODT;
		col_type = DT_DATE;
		size = sizeof (OCIDate);
		break;

	case	SQLT_CHR:	// character string
	case	SQLT_STR:	// zero-terminated string
	case	SQLT_VCS:	// variable-character string
	case	SQLT_AFC:	// ansi fixed char
	case	SQLT_AVC:	// ansi var char
	case	SQLT_VST:	// oci string type
		oci_type = SQLT_STR;
		col_type = DT_TEXT;
		size = (max_data_size + 1) * CHAR_SIZE; // + 1 for terminating zero!
		break;

	default:
		throw (oralib::error (EC_UNSUP_ORA_TYPE, __FILE__, __LINE__, name));
	}

	// allocate memory for indicators, column lengths and fetched data
	indicators = new sb2 [fetch_size];

	if (col_type == DT_TEXT)
		// only text columns requires length
		data_lens = new ub2 [fetch_size];
	else
		data_lens = NULL;

	fetch_buffer = new char [size * fetch_size];

	define_handle = NULL;

	if (!indicators || !fetch_buffer)
	{
		cleanup (); // because there could be some memory allocated
		// no memory
		throw (oralib::error (EC_NO_MEMORY, __FILE__, __LINE__));
	}

	result_set = rs;
}


column::~column ()
{
	cleanup ();
}


void
column::initialize (void)
{
	col_type = DT_UNKNOWN;
	oci_type = 0;
	size = 0;
	indicators = NULL;
	data_lens = NULL;
	fetch_buffer = NULL;
	define_handle = NULL;
	result_set = NULL;
}


void
column::cleanup (void)
{
	// set all to null to be save to call cleanup more than once for a single instance
	if (indicators) delete [] indicators, indicators = NULL;
	if (data_lens) delete [] data_lens, data_lens = NULL;
	if (fetch_buffer) delete [] fetch_buffer, fetch_buffer = NULL;
}


bool
column::is_null (void) const
{
	// prerequisites
	ASSERT (result_set);

	ub2	row_no = static_cast <ub2> (result_set->current_row % result_set->fetch_count);
	return (indicators [row_no] == -1);
}


Pstr
column::as_string (void) const
{
	// prerequisites
	ASSERT (result_set);

	ub2	row_no = static_cast <ub2> (result_set->current_row % result_set->fetch_count);
	if (col_type == DT_TEXT &&
		indicators [row_no] != -1)
		return (reinterpret_cast <Pstr> (fetch_buffer + size * row_no));
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


double
column::as_double (void) const
{
	// prerequisites
	ASSERT (result_set);

	ub2	row_no = static_cast <ub2> (result_set->current_row % result_set->fetch_count);
	if (col_type == DT_NUMBER &&
		indicators [row_no] != -1)
	{
		double	value;
		sword result = ::OCINumberToReal (
			result_set->conn->error_handle, // could be changed
			reinterpret_cast <OCINumber *> (fetch_buffer) + row_no,
			sizeof (double),
			&value);
		if (result == OCI_SUCCESS)
			return (value);
		else
			throw (oralib::error (result, result_set->conn->error_handle, __FILE__, __LINE__));
	}
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


long
column::as_long (void) const
{
	// prerequisites
	ASSERT (result_set);

	ub2	row_no = static_cast <ub2> (result_set->current_row % result_set->fetch_count);
	if (col_type == DT_NUMBER &&
		indicators [row_no] != -1)
	{
		long	value;
		sword result = OCINumberToInt (
			result_set->conn->error_handle, // could be changed
			reinterpret_cast <OCINumber *> (fetch_buffer) + row_no,
			sizeof (long),
			OCI_NUMBER_SIGNED,
			&value);
		if (result == OCI_SUCCESS)
			return (value);
		else
			throw (oralib::error (result, result_set->conn->error_handle, __FILE__, __LINE__));
	}
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


datetime
column::as_datetime (void) const
{
	// prerequisites
	ASSERT (result_set);

	ub2	row_no = static_cast <ub2> (result_set->current_row % result_set->fetch_count);
	if (col_type == DT_DATE &&
		indicators [row_no] != -1)
		return (datetime (*(reinterpret_cast <OCIDate *> (fetch_buffer) + row_no)));
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


}; // oralib namespace

⌨️ 快捷键说明

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