Code

store: Let JSON formatter know about the to-be-formatted object type.
[sysdb.git] / src / frontend / scanner.l
index 5af85e047ec2913747f010638d884f9256cb1943..c8d0dcbca25de94fe27196f7b1d65ff034370522 100644 (file)
@@ -51,19 +51,38 @@ static struct {
        const char *name;
        int id;
 } reserved_words[] = {
-       { "AND",        AND },
-       { "END",        END },
-       { "FETCH",      FETCH },
-       { "FILTER",     FILTER },
-       { "IS",         IS },
-       { "LIST",       LIST },
-       { "LOOKUP",     LOOKUP },
-       { "MATCHING",   MATCHING },
-       { "NOT",        NOT },
-       { "NULL",       NULL_T },
-       { "OR",         OR },
-       { "START",      START },
-       { "TIMESERIES", TIMESERIES },
+       { "ALL",         ALL },
+       { "AND",         AND },
+       { "ANY",         ANY },
+       { "END",         END },
+       { "FETCH",       FETCH },
+       { "FILTER",      FILTER },
+       { "IN",          IN },
+       { "IS",          IS },
+       { "LIST",        LIST },
+       { "LOOKUP",      LOOKUP },
+       { "MATCHING",    MATCHING },
+       { "NOT",         NOT },
+       { "NULL",        NULL_T },
+       { "OR",          OR },
+       { "START",       START },
+       { "TIMESERIES",  TIMESERIES },
+
+       /* object types */
+       { "host",        HOST_T },
+       { "hosts",       HOSTS_T },
+       { "service",     SERVICE_T },
+       { "services",    SERVICES_T },
+       { "metric",      METRIC_T },
+       { "metrics",     METRICS_T },
+       { "attribute",   ATTRIBUTE_T },
+       { "attributes",  ATTRIBUTES_T },
+       /* queryable fields */
+       { "name",        NAME_T },
+       { "last_update", LAST_UPDATE_T },
+       { "age",         AGE_T },
+       { "interval",    INTERVAL_T },
+       { "backend",     BACKEND_T },
 };
 
 void
@@ -102,7 +121,7 @@ csc_end             \*\/
  */
 identifier     ([A-Za-z_][A-Za-z_0-9$]*)
 /* TODO: fully support SQL strings */
-string         ('[^']*')
+string         ('([^']|'')*')
 
 /*
  * Numeric constants.
@@ -146,8 +165,21 @@ time               ([0-9]{1,2}:[0-9]{1,2}(:[0-9]{1,2}(\.[0-9]{1,9})?)?)
                return IDENTIFIER;
        }
 {string} {
+               char *quot;
+               size_t len;
+
+               /* remove the leading and trailing quote */
                yytext[yyleng - 1] = '\0';
                yylval->str = strdup(yytext + 1);
+
+               quot = yylval->str;
+               len = yyleng - 2;
+               while ((quot = strstr(quot, "''")) != NULL) {
+                       memmove(quot, quot + 1, len - (quot - yylval->str) - 1);
+                       yylval->str[len - 1] = '\0';
+                       --len;
+                       ++quot;
+               }
                return STRING;
        }
 {integer} {