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;
119 readable.get_last_record_id(table_id);\
121 switch(type.get_type_id())
124 #define TYPE_MACRO(type, return_type, type_id, read_method, write_method)\
125 case Type::Type_Id::type_id:\
127 const type value = joedb::read_##type_id(parameters);\
128 for (Record_Id record_id = Record_Id(1); record_id <= last_record_id; ++record_id)\
129 if (readable.is_used(table_id, record_id))\
130 writable.update_##type_id(table_id, record_id, field_id, value);\
138 else if (command ==
"drop_field")
140 const Table_Id table_id = parse_table(parameters, readable);
141 std::string field_name;
142 parameters >> field_name;
143 const Field_Id field_id = readable.find_field(table_id, field_name);
144 writable.drop_field(table_id, field_id);
146 else if (command ==
"rename_field")
148 const Table_Id table_id = parse_table(parameters, readable);
149 std::string field_name;
150 parameters >> field_name;
151 const Field_Id field_id = readable.find_field(table_id, field_name);
152 std::string new_field_name;
153 parameters >> new_field_name;
154 writable.rename_field(table_id, field_id, new_field_name);
156 else if (command ==
"custom")
160 writable.custom(name);
163 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)