Beispiel #1
0
static ValPtr
SA_VALcopy(sql_allocator *sa, ValPtr d, ValPtr s)
{
	if (!ATOMextern(s->vtype)) {
		*d = *s;
	} else if (s->val.pval == 0) {
		d->val.pval = ATOMnil(s->vtype);
		d->vtype = s->vtype;
	} else if (s->vtype == TYPE_str) {
		d->vtype = TYPE_str;
		d->val.sval = sa_strdup(sa, s->val.sval);
		d->len = strLen(d->val.sval);
	} else if (s->vtype == TYPE_bit) {
		d->vtype = s->vtype;
		d->len = 1;
		d->val.btval = s->val.btval;
	} else {
		ptr p = s->val.pval;

		d->vtype = s->vtype;
		d->len = ATOMlen(d->vtype, p);
		d->val.pval = sa_alloc(sa, d->len);
		memcpy(d->val.pval, p, d->len);
	}
	return d;
}
Beispiel #2
0
char *str_tolower(const char* input) {
	if (!input) return NULL;
	size_t ilen = strlen(input);
	if (ilen < 1) return NULL;

	char *out = sa_alloc(ilen + 1);

	int i = 0;
	for (; i < ilen; ++i) {
		out[i] = tolower(input[i]);
	}
	out[i] = '\0';
	return out;

}
Beispiel #3
0
char *substring(const char* str, int beg_pos, int nc) {

	if (!str) { return NULL; }
	if (nc == 0) { return NULL; }

	size_t str_len = strlen(str);
	if (str_len < 1) { return NULL; }

	if (str_len < beg_pos + nc) {
		nc = str_len - beg_pos;
	}

	char *sub = sa_alloc(nc+1);

	strncpy(sub, str+beg_pos, nc);

	sub[nc] = '\0';

	return sub;
}
Beispiel #4
0
void *worker(void *arg)
{
	int i, j;
	void *items[CONCURRENT];

	for (i=0; i<CONCURRENT; i++)
		items[i]=NULL;

	inc(&b1);
	while (b1!=(NWORKER));
	inc(&b2);
	while (b2!=(NWORKER));

	for (j=0; j<NITER; j++) {
		/* get i from 0 to CONCURRENT -1 */
		i=rand()%CONCURRENT;

		if (items[i]) {
			sa_free(&sa, items[i]);
			items[i]=NULL;
		}
		else
			items[i]=sa_alloc(&sa);
	}

	dec(&b1);
	while (b1!=0);
	dec(&b2);
	while (b2!=0);

	for (i=0; i<CONCURRENT; i++)
		if (items[i]) {
			sa_free(&sa, items[i]);
			items[i]=NULL;
		}

	return NULL;
}
Beispiel #5
0
static inline int
sql_get_next_token(YYSTYPE *yylval, void *parm) {
	mvc *c = (mvc*)parm;
	struct scanner *lc = &c->scanner;
	int token = 0, cur = 0;

	if (lc->rs->buf == NULL) /* malloc failure */
		return EOF;

	if (lc->yynext) {
		int next = lc->yynext;

		lc->yynext = 0;
		return(next);
	}

	if (lc->yybak) {
		lc->rs->buf[lc->rs->pos + lc->yycur] = lc->yybak;
		lc->yybak = 0;
	}
	
	lc->yysval = lc->yycur;
	lc->yylast = lc->yyval;
	cur = scanner_getc(lc);
	if (cur < 0)
		return EOF;
	token = tokenize(c, cur);

	yylval->sval = (lc->rs->buf + (int)lc->rs->pos + lc->yysval);

	/* This is needed as ALIAS and aTYPE get defined too late, see
	   sql_keyword.mx */
	if (token == KW_ALIAS)
		token = ALIAS;

	if (token == KW_TYPE)
		token = aTYPE;

	if (token == IDENT || token == COMPARISON || token == FILTER_FUNC || token == AGGR || token == AGGR2 || token == RANK || token == aTYPE || token == ALIAS)
		yylval->sval = sa_strndup(c->sa, yylval->sval, lc->yycur-lc->yysval);
	else if (token == STRING) {
		char quote = *yylval->sval;
		char *str = sa_alloc( c->sa, (lc->yycur-lc->yysval-2)*2 + 1 );
		assert(quote == '"' || quote == '\'');

		lc->rs->buf[lc->rs->pos+lc->yycur- 1] = 0; 
		if (quote == '"') {
			if (valid_ident(yylval->sval+1,str)) {
				token = IDENT;
			} else {
				sql_error(c, 1, "Invalid identifier '%s'", yylval->sval+1);
				return LEX_ERROR;
			}
		} else {
			memcpy(str, yylval->sval+1, lc->yycur-lc->yysval - 1);
		}
		yylval->sval = str;

		/* reset original */
		lc->rs->buf[lc->rs->pos+lc->yycur- 1] = quote; 
	}

	return(token);
}