Exemple #1
0
/*
 * fetch insert plan from cache.
 */
static void *load_insert_plan(struct QueueState *state)
{
	 struct InsertCacheEntry  *entry;
	 Oid queue_id = state->queue_id;
	 bool did_exist = false;

	 entry = hash_search(insert_cache, &queue_id, HASH_ENTER, &did_exist);
	 if (did_exist)
	 {
		 if (state->cur_table == entry->cur_table)
			 return entry->plan;
		 SPI_freeplan(entry->plan);
	 }
	 entry->cur_table = state->cur_table;
	 entry->plan = make_plan(state);
	 return entry->plan;
}
Exemple #2
0
/*
 * fetch insert plan from cache.
 */
static void *load_insert_plan(Datum qname, struct QueueState *state)
{
	struct InsertCacheEntry *entry;
	Oid queue_id = state->queue_id;
	bool did_exist = false;

	entry = hash_search(insert_cache, &queue_id, HASH_ENTER, &did_exist);
	if (did_exist) {
		if (entry->plan && state->cur_table == entry->cur_table)
			goto valid_table;
		if (entry->plan)
			SPI_freeplan(entry->plan);
	}

	entry->cur_table = state->cur_table;
	entry->last_xid = 0;
	entry->plan = NULL;

	/* this can fail, struct must be valid before */
	entry->plan = make_plan(state);
valid_table:

	if (state->per_tx_limit >= 0) {
		TransactionId xid = GetTopTransactionId();
		if (entry->last_xid != xid) {
			entry->last_xid = xid;
			entry->last_count = 0;
		}
		entry->last_count++;
		if (entry->last_count > state->per_tx_limit)
			elog(ERROR, "Queue '%s' allows max %d events from one TX",
			     TextDatumGetCString(qname), state->per_tx_limit);
	}

	return entry->plan;
}