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

📄 mserver.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
📖 第 1 页 / 共 4 页
字号:
				mapi_result_error(SERVERsessions[i].hdl));		}		BUNins(b,&o,fld, FALSE);		o++;	}	if (!(b->batDirty&2)) b = BATsetaccess(b, BAT_READ);	*bid = b->batCacheid;	BBPkeepref(*bid);	return MAL_SUCCEED;}strSERVERerror(int *ret, int *key){	Mapi mid;	int i;	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.error","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1726 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	*ret= mapi_error(mid);	return MAL_SUCCEED;}strSERVERgetError(str *ret, int *key){	Mapi mid;	int i;	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.getError","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1734 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	*ret= GDKstrdup(mapi_error_str(mid));	return MAL_SUCCEED;}str SERVERexplain(str *ret, int *key){	Mapi mid;	int i;	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.explain","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1744 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	*ret= GDKstrdup(mapi_error_str(mid));	return MAL_SUCCEED;}#line 1760 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"void SERVERfieldAnalysis(str fld, int tpe, ValPtr v){	v->vtype= tpe;	switch(tpe){	case TYPE_void:		v->val.oval = void_nil;		break;	case TYPE_oid:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.oval= void_nil;		else v->val.oval = (oid) atol(fld);		break;	case TYPE_bit:		if(fld== 0 || strcmp(fld,"nil")==0)			v->val.cval[0]= bit_nil;		else		if(strcmp(fld,"true")==0)			v->val.cval[0]= TRUE;		if(strcmp(fld,"false")==0)			v->val.cval[0]= FALSE;		v->val.cval[1]= 0;		v->val.cval[2]= 0;		v->val.cval[3]= 0;		break;	case TYPE_chr:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.cval[0]= chr_nil;		else			v->val.cval[0]= *fld;		v->val.cval[1]= 0;		v->val.cval[2]= 0;		v->val.cval[3]= 0;		break;	case TYPE_sht:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.shval = sht_nil;		else v->val.shval= (sht)  atol(fld);		break;	case TYPE_int:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.ival = int_nil;		else v->val.ival= (int)  atol(fld);		break;	case TYPE_lng:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.lval= lng_nil;		else v->val.lval= (lng)  atol(fld);		break;	case TYPE_flt:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.fval= flt_nil;		else v->val.fval= (flt)  atof(fld);		break;	case TYPE_dbl:		if(fld==0 || strcmp(fld,"nil")==0)			v->val.dval= dbl_nil;		else v->val.dval= (dbl)  atof(fld);		break;	case TYPE_str:		if(fld==0 || strcmp(fld,"nil")==0){			v->val.sval= GDKstrdup(str_nil);			v->len= strlen(v->val.sval);		} else {			v->val.sval= GDKstrdup(fld);			v->len= strlen(fld);		}		break;	}}strSERVERmapi_rpc_single_row(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int key,i,j;	Mapi mid;	MapiHdl hdl;	char *s,*fld, *qry=0;	key= * (int*) getArgReference(stk,pci,pci->retc);	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.rpc","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1837 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"#ifdef MAPI_TEST	stream_printf(GDKout,"about to sent: %s\n",qry);#endif	/* glue all strings together */	for(i= pci->retc+1; i<pci->argc; i++){		fld= * (str*) getArgReference(stk,pci,i);		if( qry == 0)			qry= GDKstrdup(fld);		else {				s= (char*) GDKmalloc(strlen(qry)+strlen(fld)+1);			strcpy(s,qry);			strcat(s,fld);			GDKfree(qry);			qry= s;		}	}	hdl= mapi_query(mid, qry);	#line 1197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"{int rn;	if ( ( (rn=mapi_error(mid)) == -4 && hdl && mapi_result_error(hdl))  || rn){		str err,newerr;		size_t l;		char *e,*f;		if( hdl && mapi_result_error(hdl))			err= mapi_result_error(hdl);		else err= mapi_result_error(SERVERsessions[i].hdl);		l= 2*strlen(err)+8192;		newerr= (str) alloca(l);		if (err == NULL)			err = "(no additional error message)";		f= newerr; 		for( e=err+1; *e && l>1; e++)			if( *e== '!' && *(e-1)=='\n'){				snprintf(f,l,"MALException:mserver.rpc:remote error:");				l-= strlen(f);				while(*f) f++;			} else{				*f++ = *e;				l--;			}		*f=0;		throw(MAL, "mserver.rpc", "remote error: %s", newerr);	}}#line 1855 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	GDKfree(qry);	i= 0;	while( mapi_fetch_row(hdl)){		for(j=0; j<pci->retc; j++){			fld= mapi_fetch_field(hdl,j);#ifdef MAPI_TEST			stream_printf(GDKout,"Got: %s\n",fld);#endif			switch(getVarType(mb,getArg(pci,j)) ){			case TYPE_void:			case TYPE_oid:			case TYPE_bit:			case TYPE_chr:			case TYPE_sht:			case TYPE_int:			case TYPE_lng:			case TYPE_flt:			case TYPE_dbl:			case TYPE_str:				SERVERfieldAnalysis(fld, 					getVarType(mb,getArg(pci,j)),					&stk->stk[getArg(pci,j)]);				break;			default:				throw(MAL, "mapi.rpc",						"Missing type implementation ");			/* all the other basic types come here */			}		}		i++;	}	if( i>1)		throw(MAL, "mapi.rpc","Too many answers");	return MAL_SUCCEED;}#line 1897 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"strSERVERmapi_rpc_bat(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int *ret;	int *key;	str *qry,err= MAL_SUCCEED;	int i;	Mapi mid;	MapiHdl hdl;	char *fld1, *fld2;	BAT *b;	ValRecord hval,tval;	int ht,tt;	ret= (int*) getArgReference(stk,pci,0);	key= (int*) getArgReference(stk,pci,pci->retc);	qry= (str*) getArgReference(stk,pci,pci->retc+1);	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.rpc","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1913 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	ht= getHeadType(getVarType(mb,getArg(pci,0)));	tt= getTailType(getVarType(mb,getArg(pci,0)));	hdl= mapi_query(mid, *qry);	#line 1197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"{int rn;	if ( ( (rn=mapi_error(mid)) == -4 && hdl && mapi_result_error(hdl))  || rn){		str err,newerr;		size_t l;		char *e,*f;		if( hdl && mapi_result_error(hdl))			err= mapi_result_error(hdl);		else err= mapi_result_error(SERVERsessions[i].hdl);		l= 2*strlen(err)+8192;		newerr= (str) alloca(l);		if (err == NULL)			err = "(no additional error message)";		f= newerr; 		for( e=err+1; *e && l>1; e++)			if( *e== '!' && *(e-1)=='\n'){				snprintf(f,l,"MALException:mserver.rpc:remote error:");				l-= strlen(f);				while(*f) f++;			} else{				*f++ = *e;				l--;			}		*f=0;		throw(MAL, "mserver.rpc", "remote error: %s", newerr);	}}#line 1918 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"		b= BATnew(ht,tt,256);	i= 0;	if ( mapi_fetch_row(hdl)){		int oht = ht, ott = tt;		fld1= mapi_fetch_field(hdl,0);		fld2= mapi_fetch_field(hdl,1);		if (fld1 && ht == TYPE_void) 			ht = TYPE_oid;		if (fld2 && tt == TYPE_void) 			tt = TYPE_oid;		SERVERfieldAnalysis(fld1, ht, &hval);		SERVERfieldAnalysis(fld2, tt, &tval);		if (oht != ht)			BATseqbase(b, hval.val.oval);		if (ott != tt)			BATseqbase(BATmirror(b), tval.val.oval);		BUNins(b,VALget(&hval),VALget(&tval), FALSE);	}	while( mapi_fetch_row(hdl)){		fld1= mapi_fetch_field(hdl,0);		fld2= mapi_fetch_field(hdl,1);		SERVERfieldAnalysis(fld1, ht, &hval);		SERVERfieldAnalysis(fld2, tt, &tval);		BUNins(b,VALget(&hval),VALget(&tval), FALSE);	}	if (!(b->batDirty&2)) b = BATsetaccess(b, BAT_READ);	*ret = b->batCacheid;	BBPkeepref(*ret);	return err;}strSERVERput(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int *key;	str *nme;	ptr val;	int i,tpe;	Mapi mid;	MapiHdl hdl=0;	char *w=0, buf[BUFSIZ];	key= (int*) getArgReference(stk,pci,pci->retc);	nme= (str*) getArgReference(stk,pci,pci->retc+1);	val= (ptr) getArgReference(stk,pci,pci->retc+2);	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.put","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 1965 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	switch( (tpe=getArgType(mb,pci, pci->retc+2)) ){	case TYPE_bat:	case TYPE_ptr:		throw(MAL, "mserver.glue","Unsupported type");        case TYPE_str:                snprintf(buf,BUFSIZ,"%s:=%s;",*nme,*(char**)val);                break;	default:		ATOMformat(tpe,val,&w);		snprintf(buf,BUFSIZ,"%s:=%s;",*nme,w);		GDKfree(w);		break;	}	if( SERVERsessions[i].hdl)		mapi_close_handle(SERVERsessions[i].hdl);	SERVERsessions[i].hdl= mapi_query(mid, buf);	#line 1197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"{int rn;	if ( ( (rn=mapi_error(mid)) == -4 && hdl && mapi_result_error(hdl))  || rn){		str err,newerr;		size_t l;		char *e,*f;		if( hdl && mapi_result_error(hdl))			err= mapi_result_error(hdl);		else err= mapi_result_error(SERVERsessions[i].hdl);		l= 2*strlen(err)+8192;		newerr= (str) alloca(l);		if (err == NULL)			err = "(no additional error message)";		f= newerr; 		for( e=err+1; *e && l>1; e++)			if( *e== '!' && *(e-1)=='\n'){				snprintf(f,l,"MALException:mserver.put:remote error:");				l-= strlen(f);				while(*f) f++;			} else{				*f++ = *e;				l--;			}		*f=0;		throw(MAL, "mserver.put", "remote error: %s", newerr);	}}#line 1982 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	return MAL_SUCCEED;}strSERVERputLocal(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	str *ret, *nme;	ptr val;	int tpe;	char *w=0, buf[BUFSIZ];	ret= (str*) getArgReference(stk,pci,0);	nme= (str*) getArgReference(stk,pci,pci->retc);	val= (ptr) getArgReference(stk,pci,pci->retc+1);	switch( (tpe=getArgType(mb,pci, pci->retc+1)) ){	case TYPE_bat:	case TYPE_ptr:		throw(MAL, "mserver.glue","Unsupported type");        case TYPE_str:                snprintf(buf,BUFSIZ,"%s:=%s;",*nme,*(char**)val);                break;	default:		ATOMformat(tpe,val,&w);		snprintf(buf,BUFSIZ,"%s:=%s;",*nme,w);		GDKfree(w);		break;	}	*ret= GDKstrdup(buf);	return MAL_SUCCEED;}str SERVERbindBAT(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	int *key;	str *nme,*tab,*col;	int i;	Mapi mid;	MapiHdl hdl=0;	char buf[BUFSIZ];	key= (int*) getArgReference(stk,pci,pci->retc);	nme= (str*) getArgReference(stk,pci,pci->retc+1);	#line 1375 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx" for(i=0; i< MAXSESSIONS; i++) if( SERVERsessions[i].c &&     SERVERsessions[i].key== *key ) break; if( i== MAXSESSIONS)	throw(MAL, "mserver.bind","Access violation,"		" could not find matching session descriptor");  mid= SERVERsessions[i].mid;  (void) mid; /* silence compilers */#line 2021 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	if( pci->argc == 6) {		tab= (str*) getArgReference(stk,pci,pci->retc+2);		col= (str*) getArgReference(stk,pci,pci->retc+3);		i= *(int*) getArgReference(stk,pci,pci->retc+4);		snprintf(buf,BUFSIZ,"%s:bat[:void,:%s]:=sql.bind(\"%s\",\"%s\",\"%s\",0,%d);",			getVarName(mb,getDestVar(pci)),			getTypeName(getTailType(getVarType(mb,getDestVar(pci)))),			*nme, *tab,*col,i);	} else if( pci->argc == 5) {		tab= (str*) getArgReference(stk,pci,pci->retc+2);		i= *(int*) getArgReference(stk,pci,pci->retc+3);		snprintf(buf,BUFSIZ,"%s:bat[:void,:oid]:=sql.bind(\"%s\",\"%s\",0,%d);",			getVarName(mb,getDestVar(pci)),*nme, *tab,i);	} else {		str hn,tn;		int target= getArgType(mb,pci,0);		hn= getTypeName(getHeadType(target));		tn= getTypeName(getTailType(target));		snprintf(buf,BUFSIZ,"%s:bat[%s,%s]:=bbp.bind(\"%s\");",			getVarName(mb,getDestVar(pci)), hn,tn, *nme);		GDKfree(hn);		GDKfree(tn);	}	if( SERVERsessions[i].hdl)		mapi_close_handle(SERVERsessions[i].hdl);	SERVERsessions[i].hdl= mapi_query(mid, buf);	#line 1197 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"{int rn;	if ( ( (rn=mapi_error(mid)) == -4 && hdl && mapi_result_error(hdl))  || rn){		str err,newerr;		size_t l;		char *e,*f;		if( hdl && mapi_result_error(hdl))			err= mapi_result_error(hdl);		else err= mapi_result_error(SERVERsessions[i].hdl);		l= 2*strlen(err)+8192;		newerr= (str) alloca(l);		if (err == NULL)			err = "(no additional error message)";		f= newerr; 		for( e=err+1; *e && l>1; e++)			if( *e== '!' && *(e-1)=='\n'){				snprintf(f,l,"MALException:mserver.bind:remote error:");				l-= strlen(f);				while(*f) f++;			} else{				*f++ = *e;				l--;			}		*f=0;		throw(MAL, "mserver.bind", "remote error: %s", newerr);	}}#line 2048 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"	return MAL_SUCCEED;}#line 2052 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/modules/mal/mserver.mx"

⌨️ 快捷键说明

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