static ERL_NIF_TERM do_prepare(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) { ErlNifBinary bin; esqlite_statement *stmt; ERL_NIF_TERM esqlite_stmt; const char *tail; int rc; ERL_NIF_TERM eos = enif_make_int(env, 0); enif_inspect_iolist_as_binary(env, enif_make_list2(env, arg, eos), &bin); stmt = enif_alloc_resource(esqlite_statement_type, sizeof(esqlite_statement)); if(!stmt) return make_error_tuple(env, "no_memory"); rc = sqlite3_prepare_v2(conn->db, (char *) bin.data, bin.size, &(stmt->statement), &tail); if(rc != SQLITE_OK) return make_sqlite3_error_tuple(env, rc, conn->db); enif_keep_resource(conn); stmt->connection = conn; esqlite_stmt = enif_make_resource(env, stmt); enif_release_resource(stmt); return make_ok_tuple(env, esqlite_stmt); }
static ERL_NIF_TERM macros(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { const ERL_NIF_TERM* a; ERL_NIF_TERM lists, tuples; int arity; if (!enif_get_tuple(env, argv[0], &arity, &a) || arity != 9) { return enif_make_badarg(env); } lists = enif_make_list(env,9, enif_make_list1(env,a[0]), enif_make_list2(env,a[0],a[1]), enif_make_list3(env,a[0],a[1],a[2]), enif_make_list4(env,a[0],a[1],a[2],a[3]), enif_make_list5(env,a[0],a[1],a[2],a[3],a[4]), enif_make_list6(env,a[0],a[1],a[2],a[3],a[4],a[5]), enif_make_list7(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6]), enif_make_list8(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]), enif_make_list9(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8])); tuples = enif_make_list(env,9, enif_make_tuple1(env,a[0]), enif_make_tuple2(env,a[0],a[1]), enif_make_tuple3(env,a[0],a[1],a[2]), enif_make_tuple4(env,a[0],a[1],a[2],a[3]), enif_make_tuple5(env,a[0],a[1],a[2],a[3],a[4]), enif_make_tuple6(env,a[0],a[1],a[2],a[3],a[4],a[5]), enif_make_tuple7(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6]), enif_make_tuple8(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]), enif_make_tuple9(env,a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8])); return enif_make_tuple2(env,lists,tuples); }
ERL_NIF_TERM geom_to_eterm_point_coords(ErlNifEnv *env, const GEOSGeometry *geom) { const GEOSCoordSequence *coords_seq; double coordx, coordy; coords_seq = GEOSGeom_getCoordSeq(geom); GEOSCoordSeq_getX(coords_seq, 0, &coordx); GEOSCoordSeq_getY(coords_seq, 0, &coordy); return enif_make_list2(env, enif_make_double(env, coordx), enif_make_double(env, coordy)); }
static ERL_NIF_TERM do_exec(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) { ErlNifBinary bin; int rc; ERL_NIF_TERM eos = enif_make_int(env, 0); enif_inspect_iolist_as_binary(env, enif_make_list2(env, arg, eos), &bin); rc = sqlite3_exec(conn->db, (char *) bin.data, NULL, NULL, NULL); if(rc != SQLITE_OK) return make_sqlite3_error_tuple(env, rc, conn->db); return make_atom(env, "ok"); }
/* Currently support for 2 dimensions only */ ERL_NIF_TERM GEOSCoordSequence_to_eterm_list(ErlNifEnv *env, const GEOSCoordSequence *coords_seq, unsigned int len) { int i = 0; double coordx, coordy; ERL_NIF_TERM coords_list[len]; ERL_NIF_TERM coords; for(i=0; i<len; i++) { GEOSCoordSeq_getX(coords_seq, i, &coordx); GEOSCoordSeq_getY(coords_seq, i, &coordy); coords = enif_make_list2(env, enif_make_double(env, coordx), enif_make_double(env, coordy)); coords_list[i] = coords; } return enif_make_list_from_array(env, coords_list, len); }
/* * insert action */ static ERL_NIF_TERM do_insert(ErlNifEnv *env, esqlite_connection *conn, const ERL_NIF_TERM arg) { ErlNifBinary bin; int rc; ERL_NIF_TERM eos = enif_make_int(env, 0); enif_inspect_iolist_as_binary(env, enif_make_list2(env, arg, eos), &bin); rc = sqlite3_exec(conn->db, (char *) bin.data, NULL, NULL, NULL); if(rc != SQLITE_OK) return make_sqlite3_error_tuple(env, rc, conn->db); sqlite3_int64 last_rowid = sqlite3_last_insert_rowid(conn->db); ERL_NIF_TERM last_rowid_term = enif_make_int64(env, last_rowid); return make_ok_tuple(env, last_rowid_term); }
static ERL_NIF_TERM get_config(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]) { return enif_make_list2(env, enif_make_tuple2(env, enif_make_string(env,"sizes", ERL_NIF_LATIN1), enif_make_tuple6(env, enif_make_uint(env, sizeof(short int)), enif_make_uint(env, sizeof(int)), enif_make_uint(env, sizeof(long int)), enif_make_uint(env, sizeof(long long int)), enif_make_uint(env, sizeof(float)), enif_make_uint(env, sizeof(double)))), enif_make_tuple2(env, enif_make_string(env, "arch", ERL_NIF_LATIN1), enif_make_tuple2(env, #ifdef ENV64BIT enif_make_string(env, "64bit", ERL_NIF_LATIN1), #endif #ifdef ENV32BIT enif_make_string(env, "32bit", ERL_NIF_LATIN1), #endif enif_make_uint(env, sizeof(char*))))); }