Ejemplo n.º 1
0
/* mapiuri_uri prefix including database name */
const char *
mapiuri_uri( const char *uri, sql_allocator *sa)
{
	const char *p = uri, *b = uri, *e;

	p = strchr(p, '/')+1;
	p++;
	e = p = strchr(p, '/');
	e = strchr(p+1, '/');
	if (e)
		return sa_strndup(sa, b, e - b);
	else 
		return sa_strdup(sa, b);
}
Ejemplo n.º 2
0
const char *
mapiuri_database( const char *uri, sql_allocator *sa)
{
	const char *p = uri, *b, *e;

	p = strchr(p, '/')+1;
	p++;
	b = p = strchr(p, '/')+1;
	e = strchr(p, '/');

	if (e) {
		return sa_strndup(sa, b, e - b);
	} else {
		return sa_strdup(sa, b);
	}
}
Ejemplo n.º 3
0
const char *
mapiuri_schema( const char *uri, sql_allocator *sa, const char *fallback)
{
	const char *p = uri, *b, *e;

	p = strchr(p, '/')+1;
	p = strchr(p+1, '/');
	p = strchr(p+1, '/');
	if (!p)
		return fallback;
 	b = ++p;
	e = strchr(p, '/');

	if (e) {
		return sa_strndup(sa, b, e - b);
	} else {
		return sa_strdup(sa, b);
	}
}
Ejemplo n.º 4
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);
}