sources/cg_udf.c (62 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#if defined(CQL_AMALGAM_LEAN) && !defined(CQL_AMALGAM_UDF)
// stubs to avoid link errors
cql_noexport void cg_udf_main(struct ast_node *root) {}
#else
#include <stdint.h>
#include "ast.h"
#include "cg_udf.h"
#include "charbuf.h"
#include "cg_common.h"
#include "cql.h"
cql_noexport void cg_udf_main(struct ast_node *root) {
Contract(options.file_names_count == 2);
cql_exit_on_semantic_errors(root);
exit_on_validating_schema();
CHARBUF_OPEN(header_file);
CHARBUF_OPEN(body_file);
bprintf(&body_file, "%s", rt->source_prefix);
bprintf(&body_file, "#include \"%s\"\n\n", options.file_names[0]);
bprintf(&body_file, "static void _udf_callback(sqlite3_context* context, int argc, sqlite3_value** argv) {\n");
bprintf(&body_file, "}\n");
bprintf(&body_file, "\nvoid create_udf(sqlite3 *_Nonnull _db_) {\n");
for (list_item *item = all_functions_list; item; item = item->next) {
EXTRACT_ANY_NOTNULL(any_func, item->ast);
Contract(is_ast_declare_func_stmt(any_func) || is_ast_declare_select_func_stmt(any_func));
if (is_ast_declare_select_func_stmt(any_func)) {
EXTRACT_STRING(name, any_func->left);
EXTRACT_NOTNULL(func_params_return, any_func->right);
EXTRACT(params, func_params_return->left);
int32_t count = 0;
while (params) {
count++;
params = params->right;
}
bprintf(&body_file, " sqlite3_create_function_v2(\n");
bprintf(&body_file, " _db_,\n");
bprintf(&body_file, " \"%s\",\n", name);
bprintf(&body_file, " %d,\n", count);
bprintf(&body_file, " SQLITE_UTF8 | SQLITE_DETERMINISTIC,\n");
bprintf(&body_file, " NULL,\n");
bprintf(&body_file, " &_udf_callback,\n");
bprintf(&body_file, " NULL,\n");
bprintf(&body_file, " NULL,\n");
bprintf(&body_file, " NULL\n");
bprintf(&body_file, " );\n");
}
}
bprintf(&body_file, "}\n");
bprintf(&header_file, "%s", rt->header_prefix);
bprintf(&header_file, rt->cqlrt_template, rt->cqlrt);
bprintf(&header_file, "void create_udf(sqlite3 *_Nonnull _db_); \n\n");
if (options.test) {
while (root->right) {
root = root->right;
}
bprintf(&header_file, "// The statement ending at line %d\n\n", root->left->lineno);
bprintf(&body_file, "// The statement ending at line %d\n\n", root->left->lineno);
}
cql_write_file(options.file_names[0], header_file.ptr);
cql_write_file(options.file_names[1], body_file.ptr);
CHARBUF_CLOSE(body_file);
CHARBUF_CLOSE(header_file);
}
#endif