32 #include "utils/array.h"
44 PGDLLEXPORT Datum
bdDijkstra(PG_FUNCTION_ARGS);
59 size_t *result_count) {
62 int64_t* start_vidsArr = NULL;
63 size_t size_start_vidsArr = 0;
64 start_vidsArr = (int64_t*)
67 int64_t* end_vidsArr = NULL;
68 size_t size_end_vidsArr = 0;
69 end_vidsArr = (int64_t*)
73 size_t total_edges = 0;
76 PGR_DBG(
"Total %ld edges in query:", total_edges);
78 if (total_edges == 0) {
85 clock_t start_t = clock();
87 char *notice_msg = NULL;
91 start_vidsArr, size_start_vidsArr,
92 end_vidsArr, size_end_vidsArr,
103 time_msg(
" processing pgr_bdDijkstra", start_t, clock());
104 PGR_DBG(
"Returning %ld tuples", *result_count);
107 if (*result_tuples) free(*result_tuples);
118 FuncCallContext *funcctx;
119 TupleDesc tuple_desc;
125 size_t result_count = 0;
129 if (SRF_IS_FIRSTCALL()) {
130 MemoryContext oldcontext;
131 funcctx = SRF_FIRSTCALL_INIT();
132 oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
147 text_to_cstring(PG_GETARG_TEXT_P(0)),
148 PG_GETARG_ARRAYTYPE_P(1),
149 PG_GETARG_ARRAYTYPE_P(2),
158 #if PGSQL_VERSION > 95
159 funcctx->max_calls = result_count;
161 funcctx->max_calls = (uint32_t)result_count;
163 funcctx->user_fctx = result_tuples;
164 if (get_call_result_type(fcinfo, NULL, &tuple_desc)
165 != TYPEFUNC_COMPOSITE) {
167 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
168 errmsg(
"function returning record called in context "
169 "that cannot accept type record")));
172 funcctx->tuple_desc = tuple_desc;
173 MemoryContextSwitchTo(oldcontext);
176 funcctx = SRF_PERCALL_SETUP();
177 tuple_desc = funcctx->tuple_desc;
181 if (funcctx->call_cntr < funcctx->max_calls) {
186 size_t call_cntr = funcctx->call_cntr;
201 values = palloc(numb *
sizeof(Datum));
202 nulls = palloc(numb *
sizeof(
bool));
206 for (i = 0; i < numb; ++i) {
210 values[0] = Int32GetDatum(call_cntr + 1);
211 values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
212 values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
213 values[3] = Int64GetDatum(result_tuples[call_cntr].end_id);
214 values[4] = Int64GetDatum(result_tuples[call_cntr].node);
215 values[5] = Int64GetDatum(result_tuples[call_cntr].
edge);
216 values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
217 values[7] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
221 tuple = heap_form_tuple(tuple_desc, values, nulls);
222 result = HeapTupleGetDatum(tuple);
223 SRF_RETURN_NEXT(funcctx, result);
225 SRF_RETURN_DONE(funcctx);
static edge_t edges[22573]
PGDLLEXPORT Datum bdDijkstra(PG_FUNCTION_ARGS)
void time_msg(char *msg, clock_t start_t, clock_t end_t)
void pgr_global_report(char *log, char *notice, char *err)
notice & error
void pgr_SPI_finish(void)
static void process(char *edges_sql, ArrayType *starts, ArrayType *ends, bool directed, bool only_cost, General_path_element_t **result_tuples, size_t *result_count)
PG_FUNCTION_INFO_V1(bdDijkstra)
void pgr_SPI_connect(void)
void do_pgr_bdDijkstra(pgr_edge_t *data_edges, size_t total_edges, int64_t *start_vidsArr, size_t size_start_vidsArr, int64_t *end_vidsArr, size_t size_end_vidsArr, bool directed, bool only_cost, General_path_element_t **return_tuples, size_t *return_count, char **log_msg, char **notice_msg, char **err_msg)