usql/usql.h

65 lines
2.3 KiB
C++

#pragma once
#include "parser.h"
#include "table.h"
#include <string>
#include <list>
namespace usql {
class USql {
public:
USql() = default;
std::unique_ptr<Table> execute(const std::string &command);
private:
std::unique_ptr<Table> execute(Node &node);
std::unique_ptr<Table> execute_create_table(CreateTableNode &node);
std::unique_ptr<Table> execute_create_table_as_table(CreateTableAsSelectNode &node);
std::unique_ptr<Table> execute_load(LoadIntoTableNode &node);
std::unique_ptr<Table> execute_save(SaveTableNode &node);
std::unique_ptr<Table> execute_drop(DropTableNode &node);
std::unique_ptr<Table> execute_insert_into_table(InsertIntoTableNode &node);
std::unique_ptr<Table> execute_select(SelectFromTableNode &node);
std::unique_ptr<Table> execute_delete(DeleteFromTableNode &node);
std::unique_ptr<Table> execute_update(UpdateTableNode &node);
private:
bool eval_where(Node *where, Table *table, Row &row) const;
static std::unique_ptr<ValueNode> eval_value_node(Table *table, Row &row, Node *node);
static std::unique_ptr<ValueNode> eval_database_value_node(Table *table, Row &row, Node *node);
static std::unique_ptr<ValueNode> eval_literal_value_node(Table *table, Row &row, Node *node);
static std::unique_ptr<ValueNode> eval_function_value_node(Table *table, Row &row, Node *node);
bool eval_relational_operator(const RelationalOperatorNode &filter, Table *table, Row &row) const;
bool eval_logical_operator(LogicalOperatorNode &node, Table *pTable, Row &row) const;
std::unique_ptr<ValueNode> eval_arithmetic_operator(ColumnType outType, ArithmeticalOperatorNode &node, Table *table, Row &row) const;
static std::unique_ptr<Table> create_stmt_result_table(long code, const std::string &text, long affected_rows);
static std::tuple<int, ColDefNode> get_column_definition(Table *table, SelectColNode *select_col_node, int col_order) ;
Table *find_table(const std::string &name);
void check_table_not_exists(const std::string &name);
private:
Parser m_parser;
std::list<Table> m_tables;
int compare_col_values(const ColDefNode &col_def, ColValue *a_val, ColValue *b_val) const;
void execute_order_by(SelectFromTableNode &node, Table *table, Table *result) const;
void execute_offset_limit(OffsetLimitNode &node, Table *result) const;
};
} // namespace