X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Ffrontend%2Fquery.c;h=34b35839e03c3d00835e449710f5fffaec5d76fc;hp=b806dcd52c2489dc4d74bae90ac80f582bf2cf61;hb=ac66c9430defd2a0e187e7b3679c8ebbfda8a4bb;hpb=44a02f37e6bfa9e24ddd35162249779e530b7da4 diff --git a/src/frontend/query.c b/src/frontend/query.c index b806dcd..34b3583 100644 --- a/src/frontend/query.c +++ b/src/frontend/query.c @@ -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