Code

frontend: Let the analyzer report details about errors.
[sysdb.git] / src / frontend / query.c
index b806dcd52c2489dc4d74bae90ac80f582bf2cf61..34b35839e03c3d00835e449710f5fffaec5d76fc 100644 (file)
@@ -73,13 +73,13 @@ sdb_fe_query(sdb_conn_t *conn)
                return -1;
 
        parsetree = sdb_fe_parse(sdb_strbuf_string(conn->buf),
-                       (int)conn->cmd_len);
+                       (int)conn->cmd_len, conn->errbuf);
        if (! parsetree) {
                char query[conn->cmd_len + 1];
                strncpy(query, sdb_strbuf_string(conn->buf), conn->cmd_len);
                query[sizeof(query) - 1] = '\0';
-               sdb_log(SDB_LOG_ERR, "frontend: Failed to parse query '%s'",
-                               query);
+               sdb_log(SDB_LOG_ERR, "frontend: Failed to parse query '%s': %s",
+                               query, sdb_strbuf_string(conn->errbuf));
                return -1;
        }
 
@@ -107,16 +107,7 @@ sdb_fe_query(sdb_conn_t *conn)
        }
 
        if (node) {
-               if (sdb_fe_analyze(node)) {
-                       char query[conn->cmd_len + 1];
-                       strncpy(query, sdb_strbuf_string(conn->buf), conn->cmd_len);
-                       query[sizeof(query) - 1] = '\0';
-                       sdb_log(SDB_LOG_ERR, "frontend: Failed to verify query '%s'",
-                                       query);
-                       status = -1;
-               }
-               else
-                       status = sdb_fe_exec(conn, node);
+               status = sdb_fe_exec(conn, node);
                sdb_object_deref(SDB_OBJ(node));
        }
 
@@ -133,7 +124,7 @@ sdb_fe_fetch(sdb_conn_t *conn)
        if ((! conn) || (conn->cmd != CONNECTION_FETCH))
                return -1;
 
-       if (conn->cmd_len < sizeof(type)) {
+       if (conn->cmd_len < sizeof(uint32_t)) {
                sdb_log(SDB_LOG_ERR, "frontend: Invalid command length %d for "
                                "FETCH command", conn->cmd_len);
                sdb_strbuf_sprintf(conn->errbuf, "FETCH: Invalid command length %d",
@@ -142,8 +133,8 @@ sdb_fe_fetch(sdb_conn_t *conn)
        }
 
        type = sdb_proto_get_int(conn->buf, 0);
-       strncpy(name, sdb_strbuf_string(conn->buf) + sizeof(type),
-                       conn->cmd_len - sizeof(type));
+       strncpy(name, sdb_strbuf_string(conn->buf) + sizeof(uint32_t),
+                       conn->cmd_len - sizeof(uint32_t));
        name[sizeof(name) - 1] = '\0';
        /* TODO: support other types besides hosts */
        return sdb_fe_exec_fetch(conn, type, name, NULL, /* filter = */ NULL);
@@ -176,7 +167,7 @@ sdb_fe_lookup(sdb_conn_t *conn)
        const char *matcher;
        size_t matcher_len;
 
-       uint32_t type;
+       int type;
        int status;
 
        conn_matcher_t m_node = {
@@ -190,7 +181,7 @@ sdb_fe_lookup(sdb_conn_t *conn)
        if ((! conn) || (conn->cmd != CONNECTION_LOOKUP))
                return -1;
 
-       if (conn->cmd_len < sizeof(type)) {
+       if (conn->cmd_len < sizeof(uint32_t)) {
                sdb_log(SDB_LOG_ERR, "frontend: Invalid command length %d for "
                                "LOOKUP command", conn->cmd_len);
                sdb_strbuf_sprintf(conn->errbuf, "LOOKUP: Invalid command length %d",
@@ -199,27 +190,33 @@ sdb_fe_lookup(sdb_conn_t *conn)
        }
        type = sdb_proto_get_int(conn->buf, 0);
 
-       matcher = sdb_strbuf_string(conn->buf) + sizeof(type);
-       matcher_len = conn->cmd_len - sizeof(type);
-       m = sdb_fe_parse_matcher(matcher, (int)matcher_len);
+       matcher = sdb_strbuf_string(conn->buf) + sizeof(uint32_t);
+       matcher_len = conn->cmd_len - sizeof(uint32_t);
+       m = sdb_fe_parse_matcher(matcher, (int)matcher_len, conn->errbuf);
        if (! m) {
                char expr[matcher_len + 1];
                strncpy(expr, matcher, sizeof(expr));
                expr[sizeof(expr) - 1] = '\0';
                sdb_log(SDB_LOG_ERR, "frontend: Failed to parse "
-                               "lookup condition '%s'", expr);
+                               "lookup condition '%s': %s", expr,
+                               sdb_strbuf_string(conn->errbuf));
                return -1;
        }
 
        node.type = type;
        m_node.matcher = m;
 
-       if (sdb_fe_analyze(SDB_CONN_NODE(&node))) {
+       /* run analyzer separately; parse_matcher is missing
+        * the right context to do so */
+       if (sdb_fe_analyze(SDB_CONN_NODE(&node), conn->errbuf)) {
                char expr[matcher_len + 1];
+               char err[sdb_strbuf_len(conn->errbuf) + sizeof(expr) + 64];
                strncpy(expr, matcher, sizeof(expr));
                expr[sizeof(expr) - 1] = '\0';
-               sdb_log(SDB_LOG_ERR, "frontend: Failed to verify "
-                               "lookup condition '%s'", expr);
+               snprintf(err, sizeof(err), "Failed to parse "
+                               "lookup condition '%s': %s", expr,
+                               sdb_strbuf_string(conn->errbuf));
+               sdb_strbuf_sprintf(conn->errbuf, "%s", err);
                status = -1;
        }
        else