📄 mapi.c
字号:
#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 + -