def body_find_by_id(struct: Struct, func: FunctionTemplate): func.add_macro_def( MacroDefinition("QUERY", '"{}"'.format(find_by_id_sql_string(struct)))) func.add_macro_def(MacroDefinition("PARAM_COUNT", "1")) func.add_block('\tif (conn == NULL) {\n\t\tconn = db_init();\n\t}\n') func.add_block("{}* out;".format(struct.typedef_name)) func.add_block(""" SQL_RESULT* res; struct {name} {name}; {name}.{pk_name} = id; struct {name}* {name}T = &{name}; """.format(name=struct.name, pk_name=struct.get_pk().name)) func.add_block(struct.get_col_param_buffer(["id_{}".format(struct.name)])) func.add_block( "res = {}_execute_find(conn, QUERY, param, PARAM_COUNT);".format( struct.name)) func.add_block(struct.col_param_buffer_free(1)) func.add_block("\tif (res->results == NULL) { return NULL; }") func.add_block("""out = res->results->data; if (res->count == 1) {{ free(res->results); free(res); return out; }} else {{ fprintf(stderr, "{name}_execute_find(), failed - multiple results (%d)\\n", res->count); mysql_res_free(&res); return NULL; }}""".format(name=struct.name)) return func
def body_delete(struct: Struct, func: FunctionTemplate): func.add_macro_def( MacroDefinition("QUERY", '"{}"'.format(delete_sql_string(struct)))) func.add_macro_def(MacroDefinition("PARAM_COUNT", str(1))) if struct.get_pk() is not None: func.add_block("assert({name}T->{pk_name} != 0);".format( name=struct.name, pk_name=struct.get_pk().name)) func.add_block('\tif (conn == NULL) {\n\t\tconn = db_init();\n\t}\n') func.add_block("""int retval;""") func.add_block(struct.get_col_param_buffer(["id_{}".format(struct.name)])) func.add_block( "retval = {}_execute(conn, QUERY, param, PARAM_COUNT);".format( struct.name)) func.add_block(struct.col_param_buffer_free(1)) func.add_block("return retval;") return func
def body_insert(struct: Struct, func: FunctionTemplate): func.add_macro_def(MacroDefinition("QUERY_LENGTH", "512")) func.add_macro_def(MacroDefinition("STRING_SIZE", "255")) func.add_macro_def( MacroDefinition("QUERY", '"{}"'.format(insert_sql_string(struct)))) func.add_macro_def( MacroDefinition("PARAM_COUNT", "{}".format(struct.param_count()))) func.add_block(struct.get_insert_assertions()) func.add_block(""" MYSQL_STMT* __attribute__((cleanup(mysql_stmt_cleanup))) stmt; uint retval; """) func.add_block('\tif (conn == NULL) {\n\t\tconn = db_init();\n\t}\n') func.add_block('\tstmt = mysql_stmt_init(conn);\n') func.add_block(struct.get_update_fk()) func.add_block(struct.col_param_lengths(func)) func.add_block(struct.get_col_param_buffers()) func.add_block("""if (mysql_stmt_prepare(stmt, QUERY, QUERY_LENGTH)) { fprintf(stderr, " mysql_stmt_prepare(), failed\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); return 0U; }""") func.add_block("""if (mysql_stmt_bind_param(stmt, param)) { fprintf(stderr, " mysql_stmt_bind_param(), failed\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); return 0U; }""") func.add_block("""if (mysql_stmt_execute(stmt)) { fprintf(stderr, " mysql_stmt_execute(), failed\\n"); fprintf(stderr, " %s\\n", mysql_stmt_error(stmt)); return 0U; }""") func.add_block("retval = (uint) mysql_stmt_insert_id(stmt);") if struct.get_pk() is not None: func.add_block( ("// update id after insertion;\n" "{name}T->{pk} = retval;\n").format(name=struct.name, pk=struct.get_pk().name)) func.add_block(struct.col_param_buffer_free()) func.add_block("return retval;") return func
def save_to_file(struct: Struct, out_dir: str = "out"): """ Saves all structs methods to file '{name}.c'. """ insert_func = declaration_insert(struct) struct.methods.append(insert_func) execute_find_func = declaration_execute_find(struct) struct.methods.append(execute_find_func) find_by_id_func = declaration_find_by_id(struct) struct.methods.append(find_by_id_func) update_func = declaration_update(struct) struct.methods.append(update_func) execute_func = declaration_execute(struct) struct.methods.append(execute_func) delete_func = declaration_delete(struct) struct.methods.append(delete_func) find_all_func = declaration_find_all(struct) struct.methods.append(find_all_func) free_func = declaration_free(struct) struct.methods.append(free_func) # add bodies to functions if struct.get_pk() is not None: body_find_by_id(struct, find_by_id_func) body_execute_find(struct, execute_find_func) body_insert(struct, insert_func) body_update(struct, update_func) body_execute(struct, execute_func) body_delete(struct, delete_func) body_find_all(struct, find_all_func) body_free(struct, free_func) file_header = ( "/**\n" " * Generated by {user} on {time}\n" " */\n").format( user=os.getlogin(), time=dt.now().strftime("%d/%m/%Y")).lstrip("\t").rstrip("\t") if not exists(out_dir): os.mkdir(out_dir) if not exists(out_dir + "/src"): os.mkdir(out_dir + "/src") if not exists(out_dir + "/src/db"): os.mkdir(out_dir + "/src/db") if not exists(out_dir + "/src/db/orm"): os.mkdir(out_dir + "/src/db/orm") with open(out_dir + "/src/db/orm/{name}.c".format(name=struct.name), "w") as file: file.write(file_header) file.write(f"\n#include \"db/orm/{struct.name}.h\"\n") for func in struct.methods: file.write(str(func)) if not exists(out_dir + "/internal"): os.mkdir(out_dir + "/internal") if not exists(out_dir + "/internal/db"): os.mkdir(out_dir + "/internal/db") if not exists(out_dir + "/internal/db/orm"): os.mkdir(out_dir + "/internal/db/orm") with open(out_dir + "/internal/db/orm/{name}.h".format(name=struct.name), "w") as file: file.write(file_header) file.write(generate_h(struct))