55 std::vector<std::string> &names;
62 void custom(
const std::string &name)
override
65 throw Exception(
"custom: invalid identifier");
66 names.emplace_back(name);
74 Compiler_Options &options,
75 Compiler_Options *parent_options
78 const std::string joedbi_file_name = options.base_name +
".joedbi";
79 const std::string joedbc_file_name = options.base_name +
".joedbc";
87 Writable_Journal journal(options.schema_file);
89 Custom_Collector custom_collector(options.custom_names);
91 Multiplexer multiplexer{options.db, schema_writable, custom_collector};
93 interpreter.set_echo(
false);
94 interpreter.set_rethrow(
true);
95 interpreter.main_loop(joedbi_file, std::cerr);
96 multiplexer.soft_checkpoint();
99 for (
const auto &[tid, tname]: options.db.get_tables())
100 options.table_options[tid];
113 generator::Database_h(options).generate();
114 generator::Database_Writable_h(options).generate();
115 generator::Database_Writable_cpp(options).generate();
116 generator::Readonly_Database_h(options).generate();
117 generator::Types_h(options).generate();
118 generator::Readable_h(options).generate();
120 generator::readonly_h(options).generate();
121 generator::readonly_cpp(options).generate();
123 generator::Writable_Database_h(options).generate();
124 generator::Writable_Database_cpp(options).generate();
125 generator::File_Database_h(options).generate();
126 generator::Memory_Database_h(options).generate();
127 generator::Readonly_Interpreted_File_Database_h(options).generate();
128 generator::Interpreted_File_Database_h(options).generate();
129 generator::Multiplexer_h(options).generate();
131 generator::writable_h(options).generate();
132 generator::writable_cpp(options).generate();
134 generator::Client_h(options).generate();
135 generator::File_Client_h(options).generate();
136 generator::Readonly_Client_h(options).generate();
138 generator::ids_h(options, parent_options).generate();
139 generator::print_table_h(options).generate();
142 generator::Procedure_h(options, *parent_options).generate();
144 generator::Procedure_h(options, options).generate();
146 for (
const auto &table: options.db.get_tables())
147 generator::introspection_h(options, table).generate();
155 options.output_path +
"/" + options.get_name_space_back() +
"/.gitignore",
158 file.pwrite(
"*\n", 2, 0);
163 static int joedbc(Arguments &arguments)
166 if (arguments.has_flag(
"version"))
169 std::cout <<
", compiled " << __DATE__
" " __TIME__
"\n";
173 const std::string_view base_name = arguments.get_next(
"<base_name>");
175 if (arguments.missing())
177 arguments.print_help(std::cerr);
178 std::cerr <<
"joedbc will read:\n";
179 std::cerr <<
" <base_name>.joedbi for the schema definition\n";
180 std::cerr <<
" <base_name>.joedbc for compiler options\n";
181 std::cerr <<
" <base_name>.rpc (optional) directory for RPC\n";
185 Compiler_Options options;
186 options.exe_path = arguments[0];
187 options.output_path =
".";
188 options.base_name = std::string(base_name);
190 compile(options,
nullptr);
196 std::error_code error_code;
198 std::filesystem::directory_iterator iterator
200 std::string(base_name) +
".rpc",
206 for (
const auto &dir_entry: iterator)
208 if (dir_entry.path().extension() ==
".joedbi")
210 auto path = dir_entry.path();
211 const std::string procedure_name = path.replace_extension(
"").string();
213 Compiler_Options procedure_options;
214 procedure_options.exe_path = arguments[0];
215 procedure_options.output_path = std::string(base_name) +
"/rpc";
216 procedure_options.base_name = procedure_name;
218 compile(procedure_options, &options);
233 options.base_name +
".rpc/Service.h",
236 file.copy_to(memory_file);
244 std::filesystem::copy
246 options.base_name +
".rpc/Service.h",
247 options.base_name +
"/rpc/Service.h",
248 std::filesystem::copy_options::overwrite_existing
251 const std::string &s = memory_file.
get_data();
253 std::vector<generator::Procedure> procedures;
256 const std::regex pattern(
"void\\s+(\\w+)\\s*\\(\\s*(\\w+)\\s*::\\s*Writable_Database\\s*&\\s*\\w+\\s*\\)");
260 std::sregex_iterator i{s.begin(), s.end(), pattern};
261 i != std::sregex_iterator();
265 procedures.push_back({(*i)[1], (*i)[2]});
269 if (!procedures.empty())
271 generator::Procedures_h(options, procedures).generate();
272 generator::Signatures_h(options, procedures).generate();
273 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)
constexpr const char * get_version()
@ 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.