10 Type Readable_Writable_Command_Processor::parse_type
17 std::string type_name;
20 if (type_name ==
"references")
22 std::string table_name;
24 const Table_Id table_id = readable.find_table(table_name);
29 #define TYPE_MACRO(type, return_type, type_id, read, write)\
30 if (type_name == #type_id)\
31 return Type::type_id();
32 #define TYPE_MACRO_NO_REFERENCE
35 throw Exception(
"unknown type");
42 const std::string &command,
43 std::istream ¶meters,
56 if (status == Status::done)
58 else if (command ==
"help")
60 out << R
"RRR(Data definition
62 create_table <table_name>
63 drop_table <table_name>
64 rename_table <old_table_name> <new_table_name>
65 add_field <table_name> <field_name> <type> [default <value>]
66 drop_field <table_name> <field_name>
67 rename_field <table_name> <old_field_name> <new_field_name>
73 int8, int16, int32, int64,
76 references <table_name>
82 else if (command ==
"create_table")
84 std::string table_name;
85 parameters >> table_name;
86 writable.create_table(table_name);
88 else if (command ==
"drop_table")
90 const Table_Id table_id = parse_table(parameters, readable);
91 writable.drop_table(table_id);
93 else if (command ==
"rename_table")
95 const Table_Id table_id = parse_table(parameters, readable);
97 parameters >> new_name;
98 writable.rename_table(table_id, new_name);
100 else if (command ==
"add_field")
102 const Table_Id table_id = parse_table(parameters, readable);
103 std::string field_name;
104 parameters >> field_name;
105 const Type type = parse_type(parameters, out);
108 writable.add_field(table_id, field_name, type);
110 std::string next_word;
111 parameters >> next_word;
113 if (next_word ==
"=")
116 readable.get_fields(table_id).rbegin()->first;
118 const Record_Id size = readable.get_size(table_id);
120 switch(type.get_type_id())
123 #define TYPE_MACRO(type, return_type, type_id, read_method, write_method)\
124 case Type::Type_Id::type_id:\
126 const type value = joedb::read_##type_id(parameters);\
127 for (Record_Id record_id{0}; record_id < size; ++record_id)\
128 if (readable.is_used(table_id, record_id))\
129 writable.update_##type_id(table_id, record_id, field_id, value);\
137 else if (command ==
"drop_field")
139 const Table_Id table_id = parse_table(parameters, readable);
140 std::string field_name;
141 parameters >> field_name;
142 const Field_Id field_id = readable.find_field(table_id, field_name);
143 writable.drop_field(table_id, field_id);
145 else if (command ==
"rename_field")
147 const Table_Id table_id = parse_table(parameters, readable);
148 std::string field_name;
149 parameters >> field_name;
150 const Field_Id field_id = readable.find_field(table_id, field_name);
151 std::string new_field_name;
152 parameters >> new_field_name;
153 writable.rename_field(table_id, field_id, new_field_name);
155 else if (command ==
"custom")
159 writable.custom(name);
162 return Status::not_found;
Status process_command(const std::string &command, std::istream ¶meters, std::istream &in, std::ostream &out) override
static Type reference(Table_Id table_id)