index dbc0f4e709081a339d2e4ba23aada92e82f412f1..f780979cac6ed333104d26f15bf2c8829184fb24 100644 (file)
*/
#include "sysdb.h"
-#include "core/error.h"
#include "core/object.h"
#include "frontend/connection-private.h"
+#include "utils/error.h"
#include "utils/strbuf.h"
#include "utils/proto.h"
status = sdb_fe_session_start(conn);
break;
+ case CONNECTION_QUERY:
+ {
+ sdb_llist_t *parsetree;
+ sdb_conn_node_t *node = NULL;
+
+ parsetree = sdb_fe_parse(sdb_strbuf_string(conn->buf),
+ (int)conn->cmd_len);
+ if (! parsetree) {
+ sdb_log(SDB_LOG_ERR, "frontend: Failed to parse query '%s'",
+ sdb_strbuf_string(conn->buf));
+ status = -1;
+ break;
+ }
+
+ switch (sdb_llist_len(parsetree)) {
+ case 0:
+ /* skipping empty command */
+ break;
+ case 1:
+ node = SDB_CONN_NODE(sdb_llist_get(parsetree, 0));
+ break;
+
+ default:
+ sdb_log(SDB_LOG_WARNING, "frontend: Ignoring %d command%s "
+ "in multi-statement query '%s'",
+ sdb_llist_len(parsetree) - 1,
+ sdb_llist_len(parsetree) == 2 ? "" : "s",
+ sdb_strbuf_string(conn->buf));
+ node = SDB_CONN_NODE(sdb_llist_get(parsetree, 0));
+ }
+
+ if (node)
+ status = sdb_fe_exec(conn, node);
+
+ sdb_llist_destroy(parsetree);
+ break;
+ }
+
case CONNECTION_LIST:
status = sdb_fe_list(conn);
break;
default:
{
- sdb_log(SDB_LOG_WARNING, "frontend: Ignoring invalid command");
+ sdb_log(SDB_LOG_WARNING, "frontend: Ignoring invalid command %#x",
+ conn->cmd);
sdb_strbuf_sprintf(conn->errbuf, "Invalid command %#x", conn->cmd);
status = -1;
break;
/* remove the command from the buffer */
if (conn->cmd_len)
- sdb_strbuf_skip(conn->buf, conn->cmd_len);
+ sdb_strbuf_skip(conn->buf, 0, conn->cmd_len);
conn->cmd = CONNECTION_IDLE;
conn->cmd_len = 0;
return status;
len = 2 * sizeof(uint32_t);
if (conn->cmd == CONNECTION_IDLE)
len += conn->cmd_len;
- sdb_strbuf_skip(conn->buf, len);
+ sdb_strbuf_skip(conn->buf, 0, len);
return 0;
} /* command_init */