/* 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); }
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); } }
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); } }
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); }