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

📄 opt_remotequeries.c

📁 一个内存数据库的源代码这是服务器端还有客户端
💻 C
📖 第 1 页 / 共 2 页
字号:
#line 112 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"#include "mal_config.h"#include "opt_remoteQueries.h"#include "mal_interpreter.h"	/* for showErrors() */#include "mal_builder.h"#line 120 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"static strRQcall2str(MalBlkPtr mb, InstrPtr p){	int k,len=1;	str msg;	str s,cv= NULL;	msg = (str) GDKmalloc(BUFSIZ);	msg[0]='#';	msg[1]=0;	if( p->barrier)		strcat(msg, operatorName(p->barrier));		if( p->retc > 1) strcat(msg,"(");	len= strlen(msg);	for (k = 0; k < p->retc; k++) {		VarPtr v = getVar(mb, getArg(p, k));		if( v->isudftype){			str tpe = getTypeName(getVarType(mb, getArg(p, k)));			sprintf(msg+len, "%s:%s ", v->name, tpe);			GDKfree(tpe);		} else		if (isTmpVar(mb, getArg(p,k)))			sprintf(msg+len, "%c%d", REFMARKER, v->tmpindex);		else			sprintf(msg+len, "%s", v->name);		if (k < p->retc - 1)			strcat(msg,",");		len= strlen(msg);	}	if( p->retc > 1) strcat(msg,")");	sprintf(msg+len,":= %s.%s(",getModuleId(p),getFunctionId(p));	s = strchr(msg, '(');	if (s) {		s++;		*s = 0;		len = strlen(msg);		for (k = p->retc; k < p->argc; k++) {			VarPtr v = getVar(mb, getArg(p, k));			if( isConstant(mb, getArg(p,k)) ){				if( v->type == TYPE_void) {					sprintf(msg+len, "nil");				} else {					VALformat(&cv, &v->value);					sprintf(msg+len,"%s:%s",cv, ATOMname(v->type));					GDKfree(cv);				}			} else if (isTmpVar(mb, getArg(p,k)))				sprintf(msg+len, "%c%d", REFMARKER, v->tmpindex);			else				sprintf(msg+len, "%s", v->name);			if (k < p->argc - 1)				strcat(msg,",");			len= strlen(msg);		}		strcat(msg,");");	} /* printf("#RQcall:%s\n",msg);*/	return msg;}#line 238 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"typedef struct{	str dbname;	int dbhdl;} DBalias;static intOPTremoteQueriesImplementation(MalBlkPtr mb, MalStkPtr stk, InstrPtr pci){	InstrPtr p, q, r, *old;	int i, j, cnt, limit, doit=0;	int remoteSite,collectFirst;	int *location;	DBalias *dbalias;	int dbtop,k;	char buf[BUFSIZ],*s, *db;	ValRecord cst;	cst.vtype= TYPE_int;	cst.val.ival= 0;#ifdef DEBUG_OPT_REMOTE	stream_printf(GDKout, "RemoteQueries optimizer started\n");#endif	(void) stk;	(void) pci;	setLifespan(mb);	limit = mb->stop;	old = mb->stmt;	location= alloca(mb->vsize * sizeof(int));	memset((char*) location, 0, mb->vsize * sizeof(int));	dbalias= (DBalias*) alloca(128 * sizeof(DBalias));	memset((char*) dbalias, 0, 128 * sizeof(DBalias));	dbtop= 0;	newMalBlkStmt(mb, mb->stop);	for (i = 0; i < limit; i++) {		p = old[i];		/* detect remote instructions */		cnt=0;		for(j=0; j<p->argc; j++)			if (location[getArg(p,j)]) 				cnt++;		/* detect remote variable binding */				if( (getModuleId(p)== mserverRef && getFunctionId(p)==bindRef)){			if( p->argc == 3 && getArgType(mb,p,1) == TYPE_int ) {				int tpe;				freezeVarType(mb,getArg(p,0));				j = getArg(p,1); /* lookupServer with key */				tpe = getArgType(mb,p,0);				/* result is remote */				location[getArg(p,0)]= j;				/* turn the instruction into a local one */				/* one argument less */				p->argc--;				/* only use the second argument (string) */				getArg(p,1)= getArg(p,2);				getModuleId(p) = bbpRef;				#line 215 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	r= newInstruction(mb,ASSIGNsymbol);	getModuleId(r)= mserverRef;	getFunctionId(r)= rpcRef;	getArg(r,0)= newTmpVariable(mb, tpe);	pushArgument(mb,r,j);#line 303 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"				#line 222 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	for(j=p->retc; j<p->argc; j++)	if( location[getArg(p,j)] == 0 && !isConstant(mb,getArg(p,j)) ){		q= newStmt(mb,mserverRef,putRef);		getArg(q,0)= newTmpVariable(mb, TYPE_void);		pushArgument(mb,q,location[getArg(p,j)]);		pushStr(mb,q, getRefName(mb,getArg(p,j)));		pushArgument(mb,q,getArg(p,j));	}#line 304 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"				#line 231 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	s= RQcall2str(mb,p);	pushStr(mb,r,s+1);	GDKfree(s);	pushInstruction(mb,r);	freeInstruction(p);	doit++;#line 305 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"			} else				pushInstruction(mb,p);		} else if( (getModuleId(p)== sqlRef && getFunctionId(p)==evalRef) ){			if( p->argc == 3){				/* a remote sql eval is needed */				#line 192 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	/* lookup the server connection */	if( location[getArg(p,0)] == 0){		db = 0;		if( isConstant(mb,getArg(p,1)) )			db= getVarConstant(mb, getArg(p,1)).val.sval;		for(k=0; k<dbtop; k++)			if( strcmp(db, dbalias[k].dbname)== 0)				break;				if( k== dbtop){			r= newInstruction(mb,ASSIGNsymbol);			getModuleId(r)= mserverRef;			getFunctionId(r)= lookupRef;			j= getArg(r,0)= newTmpVariable(mb, TYPE_int);			pushArgument(mb,r, getArg(p,1));			pushInstruction(mb,r);			dbalias[dbtop].dbhdl= j;			dbalias[dbtop++].dbname= db;			if( dbtop== 127) dbtop--;		} else j= dbalias[k].dbhdl;		location[getArg(p,0)]= j;	} else j= location[getArg(p,0)];#line 311 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"				/* turn the instruction into a local one */				/* one argument less */				p->argc--;				/* only use the second argument (string) */				getArg(p,1)= getArg(p,2);				#line 215 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	r= newInstruction(mb,ASSIGNsymbol);	getModuleId(r)= mserverRef;	getFunctionId(r)= rpcRef;	getArg(r,0)= newTmpVariable(mb, TYPE_void);	pushArgument(mb,r,j);#line 319 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"				s= RQcall2str(mb,p);				pushStr(mb,r,s+1);				GDKfree(s);				pushInstruction(mb,r);				freeInstruction(p);				doit++;			}		} else if( (getModuleId(p)== sqlRef && getFunctionId(p)==bindRef) ){			if( p->argc == 6 && getArgType(mb,p,4) == TYPE_str ) {				int tpe;				freezeVarType(mb,getArg(p,0));				j = getArg(p,1); /* lookupServer with key */				tpe = getArgType(mb,p,0);				#line 192 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"	/* lookup the server connection */	if( location[getArg(p,0)] == 0){		db = 0;		if( isConstant(mb,getArg(p,4)) )			db= getVarConstant(mb, getArg(p,4)).val.sval;		for(k=0; k<dbtop; k++)			if( strcmp(db, dbalias[k].dbname)== 0)				break;				if( k== dbtop){			r= newInstruction(mb,ASSIGNsymbol);			getModuleId(r)= mserverRef;			getFunctionId(r)= lookupRef;			j= getArg(r,0)= newTmpVariable(mb, TYPE_int);			pushArgument(mb,r, getArg(p,4));			pushInstruction(mb,r);			dbalias[dbtop].dbhdl= j;			dbalias[dbtop++].dbname= db;			if( dbtop== 127) dbtop--;		} else j= dbalias[k].dbhdl;		location[getArg(p,0)]= j;	} else j= location[getArg(p,0)];#line 336 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"				/* turn the instruction into a local one */				getArg(p,4)= defConstant(mb, TYPE_int, &cst);				#line 215 "/export/scratch0/monet/monet.GNU.64.64.d.14791/MonetDB5/src/optimizer/opt_remoteQueries.mx"

⌨️ 快捷键说明

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