static bool fetch_column_info( Column_info_t *info) { PGR_DBG("Fetching column info of %s", info->name); info->colNumber = SPI_fnumber(SPI_tuptable->tupdesc, info->name); if (info->strict && !column_found(info->colNumber)) { elog(ERROR, "Column '%s' not Found", info->name); } if (column_found(info->colNumber)) { (info->type) = SPI_gettypeid(SPI_tuptable->tupdesc, (info->colNumber)); if (SPI_result == SPI_ERROR_NOATTRIBUTE) { elog(ERROR, "Type of column '%s' not Found", info->name); } PGR_DBG("Column %s found: %llu", info->name, info->type); return true; } PGR_DBG("Column %s not found", info->name); return false; }
static void fetch_edge_with_xy( HeapTuple *tuple, TupleDesc *tupdesc, Column_info_t info[9], int64_t *default_id, float8 default_rcost, Pgr_edge_xy_t *edge, size_t *valid_edges, bool normal) { if (column_found(info[0].colNumber)) { edge->id = pgr_SPI_getBigInt(tuple, tupdesc, info[0]); } else { edge->id = *default_id; ++(*default_id); } if (normal) { edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[1]); edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[2]); } else { edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[1]); edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[2]); } edge->cost = pgr_SPI_getFloat8(tuple, tupdesc, info[3]); if (column_found(info[4].colNumber)) { edge->reverse_cost = pgr_SPI_getFloat8(tuple, tupdesc, info[4]); } else { edge->reverse_cost = default_rcost; } edge->x1 = pgr_SPI_getFloat8(tuple, tupdesc, info[5]); edge->y1 = pgr_SPI_getFloat8(tuple, tupdesc, info[6]); edge->x2 = pgr_SPI_getFloat8(tuple, tupdesc, info[7]); edge->y2 = pgr_SPI_getFloat8(tuple, tupdesc, info[8]); *valid_edges = edge->cost < 0? *valid_edges: *valid_edges + 1; *valid_edges = edge->reverse_cost < 0? *valid_edges: *valid_edges + 1; }
static void fetch_basic_edge( HeapTuple *tuple, TupleDesc *tupdesc, Column_info_t info[5], int64_t *default_id, pgr_basic_edge_t *edge, size_t *valid_edges) { if (column_found(info[0].colNumber)) { edge->id = pgr_SPI_getBigInt(tuple, tupdesc, info[0]); } else { edge->id = *default_id; ++(*default_id); } edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[1]); edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[2]); edge->going = pgr_SPI_getFloat8(tuple, tupdesc, info[3]) > 0 ? true : false; edge->coming = (column_found(info[4].colNumber) && pgr_SPI_getFloat8(tuple, tupdesc, info[4]) > 0) ? true : false; (*valid_edges)++; }