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

📄 mapi.c

📁 这个是内存数据库的客户端
💻 C
📖 第 1 页 / 共 5 页
字号:
#ifdef HAVE_OPENSSL	mid->secure = 1;	if (mid && mid->error == MOK)		mapi_reconnect(mid);	/* actually, initial connect */#else	mapi_setError(mid, "SSL connections not supported", "mapi_connect_ssl", MERROR);#endif	return mid;}stream **mapi_embedded_init(Mapi *midp, char *lang){	Mapi mid;	stream **streams;	mid = mapi_mapi(NULL, -1, "monetdb", "monetdb", lang, NULL);	if (mid == NULL)		return NULL;	streams = malloc(2 * sizeof(*streams));	if (rendezvous_streams(&streams[0], &mid->to, "to server") == 0 ||	    rendezvous_streams(&mid->from, &streams[1], "from server") == 0) {		mapi_destroy(mid);		return NULL;	}	mid->connected = 1;	*midp = mid;	return streams;}#line 2446 "/export/scratch0/monet/monet.GNU.64.64.d.14791/clients/src/mapilib/Mapi.mx"static voidclose_connection(Mapi mid){	MapiHdl hdl;	struct MapiResultSet *result;	mid->connected = 0;	mid->active = NULL;	for (hdl = mid->first; hdl; hdl = hdl->next) {		hdl->active = NULL;		for (result = hdl->result; result; result = result->next)			result->tableid = -1;	}	/* finish channels */	/* Make sure that the write- (to-) stream is closed first,	 * as the related read- (from-) stream closes the shared	 * socket; see also src/common/stream.mx:socket_close .	 */	if (mid->to) {		stream_close(mid->to);		stream_destroy(mid->to);		mid->to = 0;	}	if (mid->from) {		stream_close(mid->from);		stream_destroy(mid->from);		mid->from = 0;	}}MapiMsgmapi_disconnect(Mapi mid){	mapi_check(mid, "mapi_disconnect");	close_connection(mid);	return MOK;}#line 2489 "/export/scratch0/monet/monet.GNU.64.64.d.14791/clients/src/mapilib/Mapi.mx"#define testBinding(hdl,fnr,funcname)					\	do {								\		mapi_hdl_check(hdl, funcname);				\		if (fnr < 0) {						\			return mapi_setError(hdl->mid,			\					     "Illegal field number",	\					     funcname, MERROR);		\		}							\		/* make sure there is enough space */			\		if (fnr >= hdl->maxbindings)				\			mapi_extend_bindings(hdl, fnr);			\	} while (0)#define testParam(hdl, fnr, funcname)					\	do {								\		mapi_hdl_check(hdl, funcname);				\		if (fnr < 0) {						\			return mapi_setError(hdl->mid,			\					     "Illegal param number",	\					     funcname, MERROR);		\		}							\		if (fnr >= hdl->maxparams)				\			mapi_extend_params(hdl, fnr);			\	} while (0)MapiMsgmapi_bind(MapiHdl hdl, int fnr, char **ptr){	testBinding(hdl, fnr, "mapi_bind");	hdl->bindings[fnr].outparam = ptr;	hdl->bindings[fnr].outtype = MAPI_AUTO;	return MOK;}MapiMsgmapi_bind_var(MapiHdl hdl, int fnr, int type, void *ptr){	testBinding(hdl, fnr, "mapi_bind_var");	hdl->bindings[fnr].outparam = ptr;	if (type >= 0 && type < MAPI_NUMERIC)		hdl->bindings[fnr].outtype = type;	else		return mapi_setError(hdl->mid, "Illegal SQL type identifier", "mapi_bind_var", MERROR);	return MOK;}MapiMsgmapi_bind_numeric(MapiHdl hdl, int fnr, int scale, int prec, void *ptr){	if (mapi_bind_var(hdl, fnr, MAPI_NUMERIC, ptr))		 return hdl->mid->error;	hdl->bindings[fnr].scale = scale;	hdl->bindings[fnr].precision = prec;	return MOK;}MapiMsgmapi_clear_bindings(MapiHdl hdl){	mapi_hdl_check(hdl, "mapi_clear_bindings");	if (hdl->bindings)		memset(hdl->bindings, 0, hdl->maxbindings * sizeof(*hdl->bindings));	return MOK;}MapiMsgmapi_param_type(MapiHdl hdl, int fnr, int ctype, int sqltype, void *ptr){	testParam(hdl, fnr, "mapi_param_type");	hdl->params[fnr].inparam = ptr;	if (ctype >= 0 && ctype < MAPI_NUMERIC)		hdl->params[fnr].intype = ctype;	else		return mapi_setError(hdl->mid, "Illegal SQL type identifier", "mapi_param_type", MERROR);	hdl->params[fnr].sizeptr = NULL;	hdl->params[fnr].outtype = sqltype;	hdl->params[fnr].scale = 0;	hdl->params[fnr].precision = 0;	return MOK;}MapiMsgmapi_param_string(MapiHdl hdl, int fnr, int sqltype, char *ptr, int *sizeptr){	testParam(hdl, fnr, "mapi_param_type");	hdl->params[fnr].inparam = (void *) ptr;	hdl->params[fnr].intype = MAPI_VARCHAR;	hdl->params[fnr].sizeptr = sizeptr;	hdl->params[fnr].outtype = sqltype;	hdl->params[fnr].scale = 0;	hdl->params[fnr].precision = 0;	return MOK;}MapiMsgmapi_param(MapiHdl hdl, int fnr, char **ptr){	return mapi_param_type(hdl, fnr, MAPI_AUTO, MAPI_AUTO, ptr);}MapiMsgmapi_param_numeric(MapiHdl hdl, int fnr, int scale, int prec, void *ptr){	if (mapi_param_type(hdl, fnr, MAPI_NUMERIC, MAPI_NUMERIC, ptr))		 return hdl->mid->error;	hdl->params[fnr].scale = scale;	hdl->params[fnr].precision = prec;	return MOK;}MapiMsgmapi_clear_params(MapiHdl hdl){	mapi_hdl_check(hdl, "mapi_clear_params");	if (hdl->params)		memset(hdl->params, 0, hdl->maxparams * sizeof(*hdl->params));	return MOK;}#line 2623 "/export/scratch0/monet/monet.GNU.64.64.d.14791/clients/src/mapilib/Mapi.mx"static voidmapi_check_query(MapiHdl hdl){	char *c, bracket = 0, *comm = 0;	assert(hdl->query);	for (c = hdl->query; *c; c++) {		if (*c == '\'' || *c == '"') {			if (bracket == *c)				bracket = 0;			else if (bracket == 0)				bracket = *c;		}		if (*c == '#' && bracket == 0) {			comm = c;			while (*c && *c != '\n')				c++;		}	}	if (comm) {		/* remove comment and white space before comment start */		while (--comm >= hdl->query && isspace((int) (unsigned char) *comm))			;		*++comm = 0;	}}static MapiHdlprepareQuery(MapiHdl hdl, const char *cmd){	if (hdl && cmd) {		if (hdl->query)			free(hdl->query);		hdl->query = strdup(cmd);		assert(hdl->query);		if (hdl->template) {			free(hdl->template);			hdl->template = NULL;		}		mapi_check_query(hdl);	}	return hdl;}MapiMsgmapi_timeout(Mapi mid, int timeout){	mapi_check(mid, "mapi_timeout");	if (mid->trace == MAPI_TRACE)		printf("Set timeout to %d\n", timeout);	return mapi_setError(mid, "Operation not yet implemented", "mapi_timeout", MERROR);}static intmapi_Xcommand(Mapi mid, char *cmdname, char *cmdvalue){	MapiHdl hdl;	mapi_check(mid, "mapi_Xcommand");	if (stream_printf(mid->to, "X" "%s %s\n", cmdname, cmdvalue) < 0 ||	    stream_flush(mid->to)) {		close_connection(mid);		mapi_setError(mid, stream_error(mid->to), "mapi_Xcommand", MTIMEOUT);		return MERROR;	}	hdl = prepareQuery(mapi_new_handle(mid), "Xcommand");	mid->active = hdl;	read_into_cache(hdl, 0);	mapi_close_handle(hdl);	/* reads away any output */	return MOK;}#line 2703 "/export/scratch0/monet/monet.GNU.64.64.d.14791/clients/src/mapilib/Mapi.mx"MapiMsgmapi_prepare_handle(MapiHdl hdl, const char *cmd){	mapi_hdl_check(hdl, "mapi_prepare_handle");	if (finish_handle(hdl) != MOK)		return MERROR;	prepareQuery(hdl, cmd);	hdl->template = strdup(hdl->query);	assert(hdl->template);	return hdl->mid->error;}MapiHdlmapi_prepare(Mapi mid, const char *cmd){	MapiHdl hdl;	mapi_check0(mid, "mapi_prepare");	hdl = mapi_new_handle(mid);	mapi_prepare_handle(hdl, cmd);	return hdl;}static MapiMsgmapi_prepare_array_internal(MapiHdl hdl, char **val){	int i;	for (i = 0; val[i]; i++) {		if (i >= hdl->maxparams)			mapi_extend_params(hdl, i + 1);		hdl->params[i].inparam = val[i];		hdl->params[i].intype = MAPI_AUTO;		hdl->params[i].outtype = MAPI_AUTO;		hdl->params[i].sizeptr = NULL;		hdl->params[i].scale = 0;		hdl->params[i].precision = 0;	}	return MOK;}MapiHdlmapi_prepare_array(Mapi mid, const char *cmd, char **val){	MapiHdl hdl;	mapi_check0(mid, "mapi_prepare_array");	hdl = mapi_new_handle(mid);	mapi_prepare_handle(hdl, cmd);	mapi_prepare_array_internal(hdl, val);	return hdl;}#line 2760 "/export/scratch0/monet/monet.GNU.64.64.d.14791/clients/src/mapilib/Mapi.mx"#define checkSpace(len)						\	do {							\		/* note: k==strlen(hdl->query) */		\		if (k+len >= lim) {				\			lim = k + len + MAPIBLKSIZE;		\			hdl->query = realloc(hdl->query, lim);	\			assert(hdl->query);			\		}						\	} while (0)static voidmapi_param_store(MapiHdl hdl){	char *val, buf[MAPIBLKSIZE];	char *p = hdl->template, *q;	int i;	size_t k;	size_t lim;	if (hdl->template == 0)		return;	lim = strlen(hdl->template) + MAPIBLKSIZE;	REALLOC(hdl->query, lim);	assert(hdl->query);	hdl->query[0] = 0;	k = 0;	q = strchr(hdl->template, PLACEHOLDER);	i = 0;	/* loop invariant: k == strlen(hdl->query) */	while (q && i < hdl->maxparams) {		if (q > p && *(q - 1) == '\\') {			q = strchr(q + 1, PLACEHOLDER);			continue;		}		strncpy(hdl->query + k, p, q - p);		k += q - p;		hdl->query[k] = 0;		if (hdl->params[i].inparam == 0) {			checkSpace(5);			strcpy(hdl->query + k, hdl->mid->languageId == LANG_SQL ? "NULL" : "nil");		} else {			void *src = hdl->params[i].inparam;	/* abbrev */			switch (hdl->params[i].intype) {			case MAPI_TINY:				checkSpace(5);				sprintf(hdl->query + k, "%hhd", *(signed char *) src);				break;			case MAPI_UTINY:				checkSpace(5);				sprintf(hdl->query + k, "%hhu", *(unsigned char *) src);				break;			case MAPI_SHORT:				checkSpace(10);				sprintf(hdl->query + k, "%d", *(short *) src);				break;			case MAPI_USHORT:				checkSpace(10);				sprintf(hdl->query + k, "%hu", *(unsigned short *) src);				break;			case MAPI_INT:				checkSpace(20);				sprintf(hdl->query + k, "%d", *(int *) src);				break;			case MAPI_UINT:				checkSpace(20);				sprintf(hdl->query + k, "%u", *(unsigned int *) src);				break;			case MAPI_LONG:				checkSpace(20);				sprintf(hdl->query + k, "%ld", *(long *) src);				break;			case MAPI_ULONG:				checkSpace(20);				sprintf(hdl->query + k, "%lu", *(unsigned long *) src);				break;			case MAPI_LONGLONG:				checkSpace(30);				sprintf(hdl->query + k, LLFMT, *(mapi_int64 *) src);				break;			case MAPI_ULONGLONG:				checkSpace(30);				sprintf(hdl->query + k, ULLFMT, *(mapi_uint64 *) src);				break;			case MAPI_FLOAT:				checkSpace(30);				sprintf(hdl->query + k, "%.9g", *(float *) src);				break;			case MAPI_DOUBLE:				checkSpace(20);				sprintf(hdl->query + k, "%.17g", *(double *) src);				break;			case MAPI_DATE:				checkSpace(50);				sprintf(hdl->query + k,					"DATE '%04d-%02hu-%02hu'",					((MapiDate *) src)->year,					((MapiDate *) src)->month,					((MapiDate *) src)->day);				break;			case MAPI_TIME:				checkSpace(60);				sprintf(hdl->query + k,					"TIME '%02hu:%02hu:%02hu'",					((MapiTime *) src)->hour,					((MapiTime *) src)->minute,					((MapiTime *) src)->second);				break;			case MAPI_DATETIME:				checkSpace(110);				sprintf(hdl->query + k,					"TIMESTAMP '%04d-%02hu-%02hu %02hu:%02hu:%02hu.%09u'",					((MapiDateTime *) src)->year,					((MapiDateTime *) src)->month,					((MapiDateTime *) src)->day,					((MapiDateTime *) src)->hour,					((MapiDateTime *) src)->minute,					((MapiDateTime *) src)->second,					((MapiDateTime *) src)->fraction);				break;			case MAPI_CHAR:				buf[0] = *(char *) src;				buf[1] = 0;				val = mapi_quote(buf, 1);				checkSpace(strlen(val) + 3);				sprintf(hdl->query + k, "'%s'", val);				free(val);				break;			case MAPI_VARCHAR:				val = mapi_quote((char *) src, hdl->params[i].sizeptr ? *hdl->params[i].sizeptr : -1);				checkSpace(strlen(val) + 3);				sprintf(hdl->query + k, "'%s'", val);				free(val);				break;			default:				strcpy(hdl->query + k, src);				break;			}		}		k += strlen(hdl->query + k);		i++;		p = q + 1;		q = strchr(p, PLACEHOLDER);	}	checkSpace(strlen(p) + 1);	strcpy(hdl->query + k, p);	if (hdl->mid->trace == MAPI_TRACE)		printf("param_store: result=%s\n", hdl->query);	return;}/* Read one more line from the input stream and return it.  This   returns a pointer into the input buffer, so the data needs to be   copied if it is to be retained. */static char *read_line(Mapi mid){	char *reply;	char *nl;	char *s;		/* from where to search for newline */	if (mid->active == NULL)		return 0;	/* check if we need to read more blocks to get a new line */	mid->blk.eos = 0;	s = mid->blk.buf + mid->blk.nxt;	while ((nl = strchr(s, '\n')) == NULL && !mid->blk.eos) {		ssize_t len;

⌨️ 快捷键说明

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