register struct validate *v = q->validate;
register int i;
register int privileged = 0;
- int len;
+ register char *to,*fr,*stop;
/* copy the arguments into a local argv that we can modify */
if (argc >= QMAXARGS)
return(MR_ARGS);
for (i = 0; i < argc; i++) {
- if ((len = strlen(argv_ro[i])) < ARGLEN)
- strcpy(Argv[i], argv_ro[i]);
- else
- return(MR_ARG_TOO_LONG);
- if (Argv[i][len-1] == '\\')
+ /* Single quotes must be doubled for SQL */
+ for (to=Argv[i], fr=argv_ro[i], stop=to+ARGLEN; (*fr) && (to<stop);) {
+ if(*fr=='\'')
+ *to++ = *fr;
+ *to++ = *fr++;
+ }
+ if (*fr)
+ return(MR_ARG_TOO_LONG);
+ *to='\0';
+
+ if (*--to == '\\')
return(MR_BAD_CHAR);
}
build_sql_stmt(stmt_buf,"SELECT",q->tlist,vaddrs,pqual);
if(psort) { strcat(stmt_buf," ORDER BY "); strcat(stmt_buf,psort); }
EXEC SQL PREPARE stmt INTO :SQLDA USING NAMES FROM :stmt_buf;
- if(ingres_errno)
- return(mr_errcode);
- if((mr_errcode=mr_check_SQLDA(SQLDA)) != MR_SUCCESS)
- return(mr_errcode);
+ if(sqlca.sqlcode)
+ return(MR_INTERNAL);
EXEC SQL DECLARE csr001 CURSOR FOR stmt;
EXEC SQL OPEN csr001;
rowcount = 0;
char *qual;
{
char fmt_buf[MR_STMTBUF_LEN];
- char tmp_buf[16];
- register char *res=result_buf, *tmp=tmp_buf, *fmt=fmt_buf;
- register int state;
-
- sprintf(fmt_buf,"%s %s",cmd,targetlist);
- if(qual) { strcat(fmt_buf," WHERE "); strcat(fmt_buf,qual); }
-
- for(state=0;*fmt != '\0';fmt++) {
- switch(state) {
- case 0:
- if(*fmt=='%') { /* formatting -> tmp */
- *tmp++ = *fmt;
- state=1;
- } else *res++ = *fmt; /* text -> res */
- break;
- case 1:
- if((*fmt=='%') && (tmp==tmp_buf+1)) { /* %% -> % */
- *res++ = *fmt;
- tmp=tmp_buf;
- state=0;
- } else if(isalpha(*fmt) && (*fmt!='h') && (*fmt!='l')) { /* end of formatting */
- *tmp++ = *fmt;
- *tmp='\0';
- tmp=tmp_buf;
- sprintf(res,tmp_buf,*argv++); /* print to result buffer */
- while(*++res) ;
- state=0;
- } else *tmp++ = *fmt; /* keep copying the formatting to tmp */
- break;
- }
+ register char *res, *fmt;
+
+ if(qual)
+ sprintf(fmt_buf,"%s %s WHERE %s",cmd,targetlist,qual);
+ else
+ sprintf(fmt_buf,"%s %s",cmd,targetlist);
+
+ for(res=result_buf, fmt=fmt_buf; *fmt; fmt++) {
+ if(*fmt=='%') {
+ if(*++fmt) {
+ switch(*fmt) {
+ case '%': /* %% -> % */
+ *res++ = *fmt;
+ break;
+ case 's':
+ if(*argv[0]) {
+ *res='\0';
+ strcat(res,*argv);
+ while(*++res) ;
+ }
+ argv++;
+ break;
+ case 'd':
+ sprintf(res,"%d",*(int *)*argv++); /* print to result buffer */
+ while(*++res) ;
+ break;
+ default: /* Swallow other %? pairs */
+ break;
+ }
+ } else break;
+ } else *res++ = *fmt; /* text -> result buffer */
}
*res='\0';
}
sprintf(stmt_buf,"SELECT %s FROM %s WHERE %s=%d",object,table_name,object,value);
EXEC SQL PREPARE stmt INTO :SQLDA USING NAMES FROM :stmt_buf;
+ if(sqlca.sqlcode)
+ return(MR_INTERNAL);
EXEC SQL DECLARE csr002 CURSOR FOR stmt;
EXEC SQL OPEN csr002;
EXEC SQL FETCH csr002 USING DESCRIPTOR :SQLDA;