亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? parameter.cpp

?? 開發(fā)環(huán)境為VC++ 的數(shù)據(jù)庫管理系統(tǒng)
?? CPP
字號:
// OraLib 0.0.3 / 2002-06-30
//	parameter.cpp
//
//	http://606u.dir.bg/
//	606u@dir.bg
#include "stdafx.h"

#include "_p.h"

#include "oralib.h"


namespace oralib
{


parameter::parameter (
	IN statement *to,
	IN const char *name,
	IN OPTIONAL DataTypesEnum type,	// = DT_UNKNOWN
	IN OPTIONAL ub2 fetch_size)		// = FETCH_SIZE
{
	initialize ();
	try
	{
		attach (
			to,
			name,
			type,
			fetch_size);
	}
	catch (...)
	{
		cleanup ();
		throw;
	}
}


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


void
parameter::initialize (void)
{
	param_type = DT_UNKNOWN;
	oci_type = 0;
	size = 0;
	indicator = 0;
	data_len = 0;
	fetch_buffer = NULL;
	is_array = false;
	stmt = NULL;
	bind_handle = NULL;
	result_set = NULL;
	rs_handle = NULL;
}


void
parameter::cleanup (void)
{
	// set all to null to be save to call cleanup more than once for a single instance

	// bind handle cannot be freed
	if (bind_handle) bind_handle = NULL;

	// resultset class for bound cursor variable
	if (result_set) delete result_set, result_set = NULL;

	if (rs_handle)
	{
		// free statement handle if result set
		OCIHandleFree (
			rs_handle,
			OCI_HTYPE_STMT);
		rs_handle = NULL;
	}

	if (fetch_buffer) delete [] fetch_buffer, fetch_buffer = NULL;
}


void
parameter::attach (
	IN statement *to,
	IN const char *name,
	IN OPTIONAL DataTypesEnum type, // = DT_UNKNOWN
	IN OPTIONAL ub2 fetch_size)	// = FETCH_SIZE
{
	// prerequisites
	ASSERT (name && to);

	param_name = name;

	// setup type, oci_type, size, is_input, is_array
	setup_type (name, type);

	indicator = -1; // null by default
	data_len = 0;

	fetch_buffer = NULL;

	stmt = NULL;
	bind_handle = NULL;
	rs_handle = NULL;
	result_set = NULL;

	if (param_type == DT_RESULT_SET)
		bind_result_set (to, fetch_size);
	else
		bind (to);
}


void
parameter::setup_type (
	IN const char *param_name,
	IN OPTIONAL DataTypesEnum type)	// = DT_UNKNOWN
{
	// prerequisites
	ASSERT (param_name);

	const char	*p = param_name;

	if (p [0] == ':')
		p++;

	// an array?
	if (p [0] == PP_ARRAY)
	{
		is_array = true;
		p++;
	}

	// determine type
	if (type == DT_NUMBER || (type == DT_UNKNOWN && p [0] == PP_NUMERIC))
	{
		param_type = DT_NUMBER;
		oci_type = SQLT_VNU;
		size = sizeof (OCINumber);
	}
	else if (type == DT_DATE || (type == DT_UNKNOWN && p [0] == PP_DATE))
	{
		param_type = DT_DATE;
		oci_type = SQLT_ODT;
		size = sizeof (OCIDate);
	}
	else if (type == DT_TEXT || (type == DT_UNKNOWN && p [0] == PP_TEXT))
	{
		param_type = DT_TEXT;
		oci_type = SQLT_STR;
		size = MAX_OUTPUT_TEXT_BYTES;
	}
	else if (type == DT_RESULT_SET || (type == DT_UNKNOWN && p [0] == PP_RESULT_SET))
	{
		param_type = DT_RESULT_SET;
		oci_type = SQLT_RSET;
		size = sizeof (OCIBind *);
	}
	else
		// unrecognized data type
		throw (oralib::error (EC_BAD_PARAM_PREFIX, __FILE__, __LINE__, param_name));
}


void
parameter::bind (
	IN statement *to)
{
	// prerequisites
	ASSERT (to);

	sword	result;

	// allocate and initialize memory for the result
	fetch_buffer = new char [size];
	switch (param_type)
	{
	case	DT_NUMBER:
		OCINumberSetZero (
			to->conn->error_handle,
			(OCINumber *) fetch_buffer);
		break;

	case	DT_DATE:
		OCIDateSysDate (
			to->conn->error_handle,
			(OCIDate *) fetch_buffer);
		break;

	case	DT_TEXT:
		*((wchar_t *) fetch_buffer) = L'\0';
		break;

	default:
		ASSERT (FALSE);
		throw (oralib::error (EC_INTERNAL, __FILE__, __LINE__, "Unsupported internal type"));
	}

	// bind
	data_len = static_cast<sb2> (size);
	result = OCIBindByName (
		to->stmt_handle,
		&bind_handle,
		to->conn->error_handle,
		(text *) (param_name.data ()),
		param_name.length (),
		fetch_buffer,
		size,
		oci_type,
		&indicator,
		&data_len,
		NULL,	// pointer to array of column-level return codes
		0,		// maximum possible number of elements of type m_nType
		NULL,	// a pointer to the actual number of elements (PL/SQL binds)
		OCI_DEFAULT);

#if defined (UNICODE)
	// request/pass text parameters as unicode (2.0)
	if (result == OCI_SUCCESS)
	{
		ub4	value = OCI_UCS2ID;
		result = OCIAttrSet (
			bind_handle,
			OCI_HTYPE_BIND,
			&value,
			sizeof (value),
			OCI_ATTR_CHARSET_ID,
			to->conn->error_handle);
	}
#endif // UNICODE defined?

	if (result != OCI_SUCCESS)
		throw (oralib::error (result, to->conn->error_handle, __FILE__, __LINE__, param_name.c_str ()));
	stmt = to;
}


void
parameter::bind_result_set (
	IN statement *to,
	IN OPTIONAL ub2 fetch_size)	// = FETCH_SIZE
{
	// prerequisites
	ASSERT (to && fetch_size > 0);

	sword	result;

	// allocate a statement handle for the result set
	result = OCIHandleAlloc (
		to->conn->environment_handle,
		reinterpret_cast <void **> (&rs_handle),
		OCI_HTYPE_STMT,
		0,		// extra memory to allocate
		NULL);	// pointer to user-memory

	// bind statement handle as result set
	if (result == OCI_SUCCESS)
		result = OCIBindByName (
			to->stmt_handle,
			&bind_handle,
			to->conn->error_handle,
			(text *) param_name.data (),
			param_name.length (),
			&rs_handle,
			size,
			oci_type,
			NULL,	// pointer to array of indicator variables
			NULL,	// pointer to array of actual length of array elements
			NULL,	// pointer to array of column-level return codes
			0,		// maximum possible number of elements of type m_nType
			NULL,	// a pointer to the actual number of elements (PL/SQL binds)
			OCI_DEFAULT);
	else
		throw (oralib::error (result, to->conn->environment_handle, __FILE__, __LINE__));

	if (result != OCI_SUCCESS)
		throw (oralib::error (result, to->conn->error_handle, __FILE__, __LINE__, param_name.c_str ()));
	stmt = to;
}


parameter&
parameter::operator = (Pstr text)
{
	// prerequisites
	ASSERT (stmt);

	if (!text)
		indicator = -1; // set to null
	else if (param_type == DT_TEXT)
	{
#if defined (UNICODE)
		data_len = static_cast <ub2> (wcslen (text) * 2);
#else
		data_len = static_cast <ub2> (strlen (text));
#endif
		if (data_len > size)
			data_len = static_cast <ub2> ((size - 2) & ~1);
		memcpy (fetch_buffer, text, data_len);
#if defined (UNICODE)
		// zero-terminate
		*((wchar_t *) fetch_buffer + data_len / 2) = L'\0';
		// data len should include terminating zero
		data_len += sizeof (wchar_t);
#else
		*((char *) fetch_buffer + data_len) = '\0';
		data_len += sizeof (char);
#endif
		indicator = 0; // not null
	}
	else
		throw (oralib::error (EC_BAD_INPUT_TYPE, __FILE__, __LINE__));
	return (*this);
}


parameter&
parameter::operator = (double value)
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_NUMBER)
	{
		sword result = OCINumberFromReal (
			stmt->conn->error_handle,
			&value,
			sizeof (double),
			reinterpret_cast <OCINumber *> (fetch_buffer));
		if (result != OCI_SUCCESS)
			throw (oralib::error (result, stmt->conn->error_handle, __FILE__, __LINE__));
		indicator = 0; // not null
	}
	else
		throw (oralib::error (EC_BAD_INPUT_TYPE, __FILE__, __LINE__));
	return (*this);
}


parameter&
parameter::operator = (long value)
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_NUMBER)
	{
		sword result = OCINumberFromInt (
			stmt->conn->error_handle,
			&value,
			sizeof (long),
			OCI_NUMBER_SIGNED,
			reinterpret_cast <OCINumber *> (fetch_buffer));
		if (result != OCI_SUCCESS)
			throw (oralib::error (result, stmt->conn->error_handle, __FILE__, __LINE__));
		indicator = 0; // not null
	}
	else
		throw (oralib::error (EC_BAD_INPUT_TYPE, __FILE__, __LINE__));
	return (*this);
}


parameter&
parameter::operator = (const datetime& d)
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_DATE)
	{
		d.set (*reinterpret_cast <OCIDate*> (fetch_buffer));
		indicator = 0; // not null
	}
	else
		throw (oralib::error (EC_BAD_INPUT_TYPE, __FILE__, __LINE__));
	return (*this);
}


Pstr
parameter::as_string (void) const
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_TEXT
		&& indicator != -1) // not null?
		return (reinterpret_cast <Pstr> (fetch_buffer));
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


double
parameter::as_double (void) const
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_NUMBER
		&& indicator != -1) // not null?)
	{
		double	value;
		sword result = OCINumberToReal (
			stmt->conn->error_handle, // could be changed
			reinterpret_cast <OCINumber *> (fetch_buffer),
			sizeof (double),
			&value);
		if (result == OCI_SUCCESS)
			return (value);
		else
			throw (oralib::error (result, stmt->conn->error_handle, __FILE__, __LINE__));
	}
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


long
parameter::as_long (void) const
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_NUMBER
		&& indicator != -1) // not null?)
	{
		long	value;
		sword result = OCINumberToInt (
			stmt->conn->error_handle, // could be changed
			reinterpret_cast <OCINumber *> (fetch_buffer),
			sizeof (long),
			OCI_NUMBER_SIGNED,
			&value);
		if (result == OCI_SUCCESS)
			return (value);
		else
			throw (oralib::error (result, stmt->conn->error_handle, __FILE__, __LINE__));
	}
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


datetime
parameter::as_datetime (void) const
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_DATE
		&& indicator != -1) // not null?)
		return (datetime (*reinterpret_cast <OCIDate *> (fetch_buffer)));
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


resultset&
parameter::as_resultset (void)
{
	// prerequisites
	ASSERT (stmt);

	if (param_type == DT_RESULT_SET)
	{
		if (!result_set)
		{
			// statement should be executed first!
			ASSERT (stmt->is_executed);

			// initialize
			// both could throw an exception
			result_set = new resultset (
				rs_handle,
				stmt->conn);
			result_set->fetch_rows ();
		}
		return (*result_set);
	}
	else
		throw (oralib::error (EC_BAD_OUTPUT_TYPE, __FILE__, __LINE__));
}


}; // oralib namespace

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久影院老司| 日韩亚洲欧美成人一区| 亚洲免费在线播放| jlzzjlzz亚洲日本少妇| 中文字幕国产一区| 日本道精品一区二区三区 | 国产精品自拍一区| 国产女同互慰高潮91漫画| 成人美女视频在线观看18| 亚洲人成人一区二区在线观看| 在线免费不卡视频| 免费人成黄页网站在线一区二区| 亚洲精品在线三区| 91美女在线观看| 日韩一区欧美二区| 国产亚洲一区二区三区四区| 99久久精品国产毛片| 午夜精品久久久久影视| 久久亚洲精品国产精品紫薇| 91亚洲精品久久久蜜桃网站| 五月激情综合婷婷| 国产日韩欧美一区二区三区乱码 | 精品视频一区二区三区免费| 麻豆精品久久久| **网站欧美大片在线观看| 欧美丰满嫩嫩电影| 粉嫩嫩av羞羞动漫久久久| 亚洲高清在线视频| 亚洲国产成人在线| 91精品蜜臀在线一区尤物| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 日韩欧美国产午夜精品| 99在线视频精品| 麻豆精品视频在线| 亚洲一区二区三区中文字幕 | 成人国产亚洲欧美成人综合网 | 国产精品久久久久久久久久久免费看 | 精品国产91洋老外米糕| 91视频你懂的| 日本视频在线一区| 日韩毛片视频在线看| 欧美本精品男人aⅴ天堂| 91在线精品一区二区三区| 九九九精品视频| 亚洲午夜精品一区二区三区他趣| 国产清纯白嫩初高生在线观看91| 555夜色666亚洲国产免| 色婷婷精品久久二区二区蜜臀av| 国产伦精品一区二区三区在线观看 | 8x福利精品第一导航| 成人app在线| 国产一区二区三区四区五区入口| 亚洲成人免费在线观看| 亚洲伦在线观看| 国产精品夫妻自拍| 国产亚洲欧美一级| 精品福利一区二区三区 | 欧美亚洲国产一区二区三区va | 午夜av电影一区| 亚洲乱码国产乱码精品精的特点 | 欧美v日韩v国产v| 69成人精品免费视频| 欧美综合亚洲图片综合区| 成人黄色免费短视频| 国产激情精品久久久第一区二区| 麻豆久久久久久久| 免费成人av资源网| 秋霞av亚洲一区二区三| 亚洲v中文字幕| 亚洲综合在线电影| 亚洲精选免费视频| 一区二区三区在线免费观看| 亚洲欧美在线视频观看| 国产精品国产三级国产专播品爱网| 欧美变态凌虐bdsm| 久久人人爽人人爽| 国产网站一区二区| 中文字幕第一区二区| 国产精品视频你懂的| 欧美国产一区在线| 国产精品电影一区二区| 中文字幕一区二区三区av| 中文字幕在线不卡国产视频| 日日摸夜夜添夜夜添精品视频| 亚洲黄色av一区| 亚洲国产日韩a在线播放性色| 亚洲一区二区av电影| 午夜视频久久久久久| 三级欧美韩日大片在线看| 亚洲.国产.中文慕字在线| 午夜视频一区在线观看| 麻豆成人91精品二区三区| 国内久久精品视频| 成人高清伦理免费影院在线观看| 99re这里只有精品首页| 在线一区二区三区四区五区| 欧美日韩视频第一区| 精品99久久久久久| 国产精品理伦片| 亚洲国产视频网站| 美女性感视频久久| 风间由美性色一区二区三区| 色狠狠综合天天综合综合| 欧美日韩色综合| 精品国产91洋老外米糕| 国产精品不卡在线观看| 午夜久久久久久| 国产一区二区三区精品视频| 成人av电影在线观看| 欧美日本一道本在线视频| 精品国产乱码久久久久久浪潮 | 国产不卡视频在线播放| 色综合久久88色综合天天6| 欧美一区二区三区啪啪| 欧美国产禁国产网站cc| 亚洲成人三级小说| 高清不卡在线观看av| 欧美手机在线视频| 国产三级精品视频| 日韩电影免费一区| av综合在线播放| 精品美女在线播放| 亚洲精品成人在线| 国产一区二区在线观看视频| 在线日韩一区二区| 26uuu国产电影一区二区| 亚洲欧美激情视频在线观看一区二区三区 | 国产免费成人在线视频| 三级一区在线视频先锋| www.视频一区| 日韩午夜精品电影| 亚洲精品大片www| 成人三级伦理片| 精品国产一区二区亚洲人成毛片| 国产精品456| 欧美日韩国产首页| 国产欧美日韩另类一区| 日韩福利视频导航| 91免费观看视频在线| 精品99999| 奇米一区二区三区| 欧美怡红院视频| 中文字幕一区二区三| 精品一区二区日韩| 日韩精品一区二区三区在线播放 | 久久综合久久99| 亚洲v日本v欧美v久久精品| 一本久久a久久免费精品不卡| 国产亚洲欧美日韩在线一区| 麻豆精品在线视频| 91精品国产一区二区三区| 一区二区三区免费| 成人动漫中文字幕| 日本一区二区在线不卡| 国产精品一二二区| 精品99999| 黄色日韩三级电影| 日韩久久免费av| 日韩电影一区二区三区| 欧美剧情片在线观看| 亚洲一区在线免费观看| 一本久道久久综合中文字幕| 国产精品成人午夜| 91在线视频播放| 亚洲免费观看高清完整版在线| 99精品热视频| 中文字幕在线一区免费| 97超碰欧美中文字幕| 中文字幕在线视频一区| 99精品桃花视频在线观看| 亚洲成年人影院| 欧美色图在线观看| 视频一区欧美精品| 91精品国产福利在线观看| 手机精品视频在线观看| 欧美一区二区在线免费观看| 免费精品99久久国产综合精品| 日韩美女一区二区三区| 国内欧美视频一区二区| 国产精品女主播av| 色欲综合视频天天天| 亚洲国产日韩一区二区| 宅男噜噜噜66一区二区66| 日本成人在线视频网站| 久久免费电影网| www.欧美精品一二区| 亚瑟在线精品视频| 精品国产1区二区| 99久久久免费精品国产一区二区| 综合自拍亚洲综合图不卡区| 在线免费观看视频一区| 午夜成人免费电影| 精品国产伦一区二区三区观看方式 | 亚洲乱码国产乱码精品精可以看 | 亚洲线精品一区二区三区八戒| 91精品国产福利| 成人综合婷婷国产精品久久免费| 亚洲另类在线一区| 日韩欧美一二三四区| 97se狠狠狠综合亚洲狠狠|