static void state_free(struct AANode *node, void *arg)
{
ProxyConnectionState *state = container_of(node, ProxyConnectionState, node);
- if (state->db)
- PQfinish(state->db);
+
+ plproxy_disconnect(state);
memset(state, 0, sizeof(*state));
pfree(state);
}
ConnUserInfo *userinfo = arg;
if (cur->userinfo == userinfo && cur->db)
- {
- PQfinish(cur->db);
- cur->db = NULL;
- cur->state = C_NONE;
- }
+ plproxy_disconnect(cur);
}
static void inval_userinfo_conn(struct AANode *node, void *arg)
if (node) {
cur = container_of(node, ProxyConnectionState, node);
} else {
- cur = MemoryContextAlloc(cluster_mem, sizeof(*cur));
+ cur = MemoryContextAllocZero(cluster_mem, sizeof(*cur));
cur->userinfo = userinfo;
aatree_insert(&conn->userstate_tree, (uintptr_t)username, &cur->node);
}
}
if (drop)
- {
- PQfinish(cur->db);
- cur->db = NULL;
- cur->state = C_NONE;
- }
+ plproxy_disconnect(cur);
}
static void clean_conn(struct AANode *node, void *arg)
case C_QUERY_WRITE:
/* close rotten connection */
elog(NOTICE, "PL/Proxy: dropping stale conn");
- PQfinish(conn->cur->db);
- conn->cur->db = NULL;
- conn->cur->state = C_NONE;
- conn->cur->tuning = 0;
+ plproxy_disconnect(conn->cur);
case C_NONE:
break;
}
/* conn state checks are done in prepare_conn */
}
+/* Drop one connection */
+void plproxy_disconnect(ProxyConnectionState *cur)
+{
+ if (cur->db)
+ PQfinish(cur->db);
+ cur->db = NULL;
+ cur->state = C_NONE;
+ cur->tuning = 0;
+ cur->connect_time = 0;
+ cur->query_time = 0;
+ cur->same_ver = 0;
+ cur->tuning = 0;
+}
+
/* Select partitions and execute query on them */
void
plproxy_exec(ProxyFunction *func, FunctionCallInfo fcinfo)
/* execute.c */
void plproxy_exec(ProxyFunction *func, FunctionCallInfo fcinfo);
void plproxy_clean_results(ProxyCluster *cluster);
+void plproxy_disconnect(ProxyConnectionState *cur);
/* scanner.c */
int plproxy_yyget_lineno(void);