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