54 std::vector<std::string> &names;
61 void custom(
const std::string &name)
override
64 throw Exception(
"custom: invalid identifier");
65 names.emplace_back(name);
73 Compiler_Options &options,
74 Compiler_Options *parent_options
77 const std::string joedbi_file_name = options.base_name +
".joedbi";
78 const std::string joedbc_file_name = options.base_name +
".joedbc";
86 Writable_Journal journal(options.schema_file);
88 Custom_Collector custom_collector(options.custom_names);
90 Multiplexer multiplexer{options.db, schema_writable, custom_collector};
92 interpreter.set_echo(
false);
93 interpreter.set_rethrow(
true);
94 interpreter.main_loop(joedbi_file, std::cerr);
95 multiplexer.soft_checkpoint();
98 for (
const auto &[tid, tname]: options.db.get_tables())
99 options.table_options[tid];
112 generator::Database_h(options).generate();
113 generator::Database_Writable_h(options).generate();
114 generator::Database_Writable_cpp(options).generate();
115 generator::Readonly_Database_h(options).generate();
116 generator::Types_h(options).generate();
117 generator::Readable_h(options).generate();
119 generator::readonly_h(options).generate();
120 generator::readonly_cpp(options).generate();
122 generator::Writable_Database_h(options).generate();
123 generator::Writable_Database_cpp(options).generate();
124 generator::File_Database_h(options).generate();
125 generator::Memory_Database_h(options).generate();
126 generator::Readonly_Interpreted_File_Database_h(options).generate();
127 generator::Interpreted_File_Database_h(options).generate();
128 generator::Multiplexer_h(options).generate();
130 generator::writable_h(options).generate();
131 generator::writable_cpp(options).generate();
133 generator::Client_h(options).generate();
134 generator::File_Client_h(options).generate();
135 generator::Readonly_Client_h(options).generate();
137 generator::ids_h(options, parent_options).generate();
138 generator::print_table_h(options).generate();
141 generator::Procedure_h(options, *parent_options).generate();
143 generator::Procedure_h(options, options).generate();
145 for (
const auto &table: options.db.get_tables())
146 generator::introspection_h(options, table).generate();
154 options.output_path +
"/" + options.get_name_space_back() +
"/.gitignore",
163 static int joedbc(Arguments &arguments)
166 const std::string_view base_name = arguments.get_next(
"<base_name>");
168 if (arguments.missing())
170 arguments.print_help(std::cerr);
171 std::cerr <<
"joedbc will read:\n";
172 std::cerr <<
" <base_name>.joedbi for the schema definition\n";
173 std::cerr <<
" <base_name>.joedbc for compiler options\n";
174 std::cerr <<
" <base_name>.rpc (optional) directory for RPC\n";
178 Compiler_Options options;
179 options.exe_path = arguments[0];
180 options.output_path =
".";
181 options.base_name = std::string(base_name);
183 compile(options,
nullptr);
189 std::error_code error_code;
191 std::filesystem::directory_iterator iterator
193 std::string(base_name) +
".rpc",
199 for (
const auto &dir_entry: iterator)
201 if (dir_entry.path().extension() ==
".joedbi")
203 auto path = dir_entry.path();
204 const std::string procedure_name = path.replace_extension(
"").string();
206 Compiler_Options procedure_options;
207 procedure_options.exe_path = arguments[0];
208 procedure_options.output_path = std::string(base_name) +
"/rpc";
209 procedure_options.base_name = procedure_name;
211 compile(procedure_options, &options);
226 options.base_name +
".rpc/Service.h",
229 file.copy_to(memory_file);
237 std::filesystem::copy
239 options.base_name +
".rpc/Service.h",
240 options.base_name +
"/rpc/Service.h",
241 std::filesystem::copy_options::overwrite_existing
244 const std::string &s = memory_file.
get_data();
246 std::vector<generator::Procedure> procedures;
249 const std::regex pattern(
"void\\s+(\\w+)\\s*\\(\\s*(\\w+)\\s*::\\s*Writable_Database\\s*&\\s*\\w+\\s*\\)");
253 std::sregex_iterator i{s.begin(), s.end(), pattern};
254 i != std::sregex_iterator();
258 procedures.push_back({(*i)[1], (*i)[2]});
262 if (!procedures.empty())
264 generator::Procedures_h(options, procedures).generate();
265 generator::Signatures_h(options, procedures).generate();
266 generator::RPC_Client_h(options, procedures).generate();
void custom(const std::string &name) override
Custom_Collector(std::vector< std::string > &names)
Writable with empty insert_vector and delete_vector.
int64_t get_size() const override
Get the size of the file, or -1 if it is unknown.
static const Record_Id null
void parse_compiler_options(std::istream &in, Compiler_Options &compiler_options)
bool is_identifier(const std::string &s)
@ truncate
create new file, or truncate existing file, and locks the file
@ write_lock
like write_existing_or_create_new, but waits instead of failing if already locked
@ read_existing
fails if does not exist
int main_wrapper(int(*main)(Arguments &), int argc, char **argv)
Process command-line arguments and catch exceptions from main.