41 const std::string &command,
42 std::istream ¶meters,
55 if (status == Status::done)
57 else if (command ==
"help")
59 out << R
"RRR(Data manipulation
61 insert_into <table_name> <record_id>
62 delete_from <table_name> <record_id>
63 insert_vector <table_name> <record_id> <size>
64 delete_vector <table_name> <record_id> <size>
65 update <table_name> <record_id> <field_name> <value>
66 update_vector <table_name> <record_id> <field_name> <N> <v_1> ... <v_N>
72 else if (command ==
"insert_into")
74 const Table_Id table_id = parse_table(parameters, readable);
76 parameters >> record_id;
79 record_id = readable.get_size(table_id);
81 writable.insert_into(table_id, record_id);
82 if (parameters.good())
84 for (
const auto &[fid, fname]: readable.get_fields(table_id))
86 update_value(parameters, table_id, record_id, fid);
87 if (parameters.fail())
92 else if (command ==
"delete_from")
94 const Table_Id table_id = parse_table(parameters, readable);
96 parameters >> record_id;
98 writable.delete_from(table_id, record_id);
100 else if (command ==
"insert_vector")
102 const Table_Id table_id = parse_table(parameters, readable);
105 parameters >> record_id >> size;
106 writable.insert_vector(table_id, record_id, size);
108 else if (command ==
"delete_vector")
110 const Table_Id table_id = parse_table(parameters, readable);
113 parameters >> record_id >> size;
114 writable.delete_vector(table_id, record_id, size);
116 else if (command ==
"update")
118 const Table_Id table_id = parse_table(parameters, readable);
120 parameters >> record_id;
121 std::string field_name;
122 parameters >> field_name;
123 const Field_Id field_id = readable.find_field(table_id, field_name);
124 update_value(parameters, table_id, record_id, field_id);
126 else if (command ==
"update_vector")
128 const Table_Id table_id = parse_table(parameters, readable);
130 parameters >> record_id;
131 std::string field_name;
132 parameters >> field_name;
133 const Field_Id field_id = readable.find_field(table_id, field_name);
137 if (max_record_id.is_not_null() && size >=
size_t(
index_t(max_record_id)))
141 switch(readable.get_field_type(table_id, field_id).get_type_id())
147 #define TYPE_MACRO(type, return_type, type_id, R, W)\
148 case Type::Type_Id::type_id:\
150 std::vector<type> v(size);\
151 for (size_t i = 0; i < size; i++)\
152 v[i] = joedb::read_##type_id(parameters);\
153 writable.update_vector_##type_id(table_id, record_id, field_id, size, &v[0]);\