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