Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
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
Exemple #4
0
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))