/*
 * SubVar
 *
 * This function substitutes variables designated by the leading separator (sep)
 * with values with matching names.  The string buffer will be realloced in 512-byte
 * chunks if needed.
 */
char *SubVar(char sep, char *var_name, char *var_value, char *oldbuf, int *bufsize) {
    char *buf, *s, *t;
    int l, n;
    char o;
    char *local_buf;
#if MSQL
	char *u;
	int i,j;
    int numi, numj;
    char temp[1024];
    m_result *result=NULL;
    m_row record;
    int new_connection=0;
#endif
 
    l=strlen(oldbuf);
    n=strlen(var_value);
 
    if(l-(int)strlen(var_name)-1+(int)strlen(var_value) >(int)(*bufsize-1)) {

#if DEBUG
        fprintf(fperr,"Query buffer re-allocated\n");
        fflush(fperr);
#endif

        buf=realloc(oldbuf,*bufsize+((n>512)?n:512));
        *bufsize+=((n>512)?n:512);
    } else buf=oldbuf;
 
    /* I don't trust strdup() on many systems */
    local_buf=malloc(*bufsize*sizeof(char));
    strcpy(local_buf,buf);
 
    if(!local_buf) {
        html_error("FI Error","Unable to allocate memory");
        exit(-1);
    }
    s=local_buf;
 
    while(*s!='\0') {
        if(*s==sep) {
            if(s>local_buf && *(s-1)=='\\') {  /* Allow for escaping the separator */
                s++;
                continue;
            }
            n=strcspn(s+1," ,()'\n:;.{}[]-+=~!@#$%^*<>\"");
 
            t=s+n+1;
            o=*t;
            *t='\0';
            if(!strcasecmp(var_name,s+1)) {
                *s='\0';
#if MSQL
                if(!strcasecmp(var_name,"sql")) {
                    /* looking for database name */
 
#if DEBUG
                    fprintf(fperr,"var_name=[%s], var_value=[%s]\n",var_name,var_value);
                    fflush(fperr);
#endif
 
                    u=strchr(var_value,' ');
                    if(u) {
                        *u='\0';
                        if(strlen(current_db)==0) {
                            if(dbsock==-1) {
                                dbsock=msqlConnect(NULL);
                                new_connection=1;
                            }
                            if(msqlSelectDB(dbsock,var_value)<0) {
                                strcpy(temp,msqlErrMsg);
                                current_db[0]='\0';
                            } else {
                                strcpy(current_db,var_value);
                            }
                        }
                        if(msqlQuery(dbsock,u+1)<0) strcpy(temp,msqlErrMsg);
                        else {
                            temp[0]='\0';
                            msqlStoreResult(result);
                            numi=msqlNumRows(result);
                            for(i=0;i<numi;i++) {
                                if(strlen(before_record)) strcat(temp,before_record);
                                msqlDataSeek(result,i);
                                numj=msqlNumFields(result);
                                record=msqlFetchRow(result);
                                for(j=0;j<numj;j++) {
                                    if(strlen(before_element)) strcat(temp,before_element);
                                    strcat(temp,record[j]);
                                    if(strlen(after_element)) strcat(temp,after_element);
                                }
                                if(strlen(after_record)) strcat(temp,after_record);
                            }
                            msqlFreeResult(result);
                            if(new_connection) {
                                msqlClose(dbsock);
                                dbsock=-1;
                                current_db[0]='\0';
                            }
                        }
                    }
                }
#endif
                sprintf(buf,"%s%s%c%s",local_buf,var_value,o,t+1);
                strcpy(local_buf,buf);
            } else {
                *t=o;
            }
            s=t+1;
        } else s++;
    }
    free(local_buf);
    return(buf);
}
예제 #2
0
파일: db.c 프로젝트: BPotato/fluffos
static array_t *msql_fetch (dbconn_t * c, int row)
{
	int i, num_fields;
	m_row this_row;
	array_t *v;

	if (!c->msql.result_set) {
		return &the_null_array;
	}
	if (row < 1 || row > msqlNumRows(c->msql.result_set)) {
		return &the_null_array;
	}

	num_fields = msqlNumFields(c->msql.result_set);
	if (num_fields < 1) {
		return &the_null_array;
	}

	msqlDataSeek(c->msql.result_set, row - 1);
	this_row = msqlFetchRow(c->msql.result_set);
	if (!this_row) {
		return &the_null_array;
	}

	v = allocate_empty_array(num_fields);
	for (i = 0;  i < num_fields;  i++) {
		m_field *field;

		field = msqlFetchField(c->msql.result_set);
		if (!field || !this_row[i]) {
			v->item[i] = const0u;
		} else {
			switch (field->type) {
			case INT_TYPE:
			case UINT_TYPE:
				v->item[i].type = T_NUMBER;
				v->item[i].u.number = atoi(this_row[i]);
				break;

			case REAL_TYPE:
			case MONEY_TYPE:
				v->item[i].type = T_REAL;
				v->item[i].u.real = atof(this_row[i]);
				break;

			case CHAR_TYPE:
			case TEXT_TYPE:
			case DATE_TYPE:
			case TIME_TYPE:
				v->item[i].type = T_STRING;
				v->item[i].subtype = STRING_MALLOC;
				v->item[i].u.string = string_copy(this_row[i], "msql_fetch");
				break;

			default:
				v->item[i] = const0u;
				break;
			}
		}
	}

	msqlFieldSeek(c->msql.result_set, 0);
	return v;
}
예제 #3
0
파일: msql_dbc.cpp 프로젝트: nmmmnu/ccc
      return msqlNumRows(result);
   else
      return 0;
};

boolean mSQLDBC::gotoRecordNum(unsigned long int num){