summaryrefslogtreecommitdiff
path: root/contrib/rserv/rserv.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2004-08-28 21:36:25 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2004-08-28 21:36:25 +0000
commitd77f74fa7ef52dd13040dc1d57d88a1595e4205a (patch)
treeb169cd17e6856a421d9192e95f0db43952d2a4bc /contrib/rserv/rserv.c
parent448eb0837f7a8db270481475e8803e1e8a19a37e (diff)
downloadpostgresql-d77f74fa7ef52dd13040dc1d57d88a1595e4205a.tar.gz
Remove contrib/rserv, since there are better replication solutions
available elsewhere (including a descendant project on gborg).
Diffstat (limited to 'contrib/rserv/rserv.c')
-rw-r--r--contrib/rserv/rserv.c352
1 files changed, 0 insertions, 352 deletions
diff --git a/contrib/rserv/rserv.c b/contrib/rserv/rserv.c
deleted file mode 100644
index 78f23bbb23..0000000000
--- a/contrib/rserv/rserv.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/* rserv.c
- * Support functions for erServer replication.
- * (c) 2000 Vadim Mikheev, PostgreSQL Inc.
- */
-
-#include "executor/spi.h" /* this is what you need to work with SPI */
-#include "commands/trigger.h" /* -"- and triggers */
-#include "utils/tqual.h" /* -"- and SnapshotData */
-#include <ctype.h> /* tolower () */
-
-#ifdef PG_FUNCTION_INFO_V1
-#define CurrentTriggerData ((TriggerData *) fcinfo->context)
-#endif
-
-#ifdef PG_FUNCTION_INFO_V1
-PG_FUNCTION_INFO_V1(_rserv_log_);
-PG_FUNCTION_INFO_V1(_rserv_sync_);
-PG_FUNCTION_INFO_V1(_rserv_debug_);
-Datum _rserv_log_(PG_FUNCTION_ARGS);
-Datum _rserv_sync_(PG_FUNCTION_ARGS);
-Datum _rserv_debug_(PG_FUNCTION_ARGS);
-
-#else
-HeapTuple _rserv_log_(void);
-int32 _rserv_sync_(int32);
-int32 _rserv_debug_(int32);
-#endif
-
-static int debug = 0;
-
-static char *OutputValue(char *key, char *buf, int size);
-
-#ifdef PG_FUNCTION_INFO_V1
-Datum
-_rserv_log_(PG_FUNCTION_ARGS)
-#else
-HeapTuple
-_rserv_log_()
-#endif
-{
- Trigger *trigger; /* to get trigger name */
- int nargs; /* # of args specified in CREATE TRIGGER */
- char **args; /* argument: argnum */
- Relation rel; /* triggered relation */
- HeapTuple tuple; /* tuple to return */
- HeapTuple newtuple = NULL; /* tuple to return */
- TupleDesc tupdesc; /* tuple description */
- int keynum;
- char *key;
- char *okey;
- char *newkey = NULL;
- int deleted;
- char sql[8192];
- char outbuf[8192];
- char oidbuf[64];
- int ret;
-
- /* Called by trigger manager ? */
- if (!CurrentTriggerData)
- /* internal error */
- elog(ERROR, "_rserv_log_: triggers are not initialized");
-
- /* Should be called for ROW trigger */
- if (TRIGGER_FIRED_FOR_STATEMENT(CurrentTriggerData->tg_event))
- /* internal error */
- elog(ERROR, "_rserv_log_: can't process STATEMENT events");
-
- tuple = CurrentTriggerData->tg_trigtuple;
-
- trigger = CurrentTriggerData->tg_trigger;
- nargs = trigger->tgnargs;
- args = trigger->tgargs;
-
- if (nargs != 1) /* odd number of arguments! */
- /* internal error */
- elog(ERROR, "_rserv_log_: need in *one* argument");
-
- keynum = atoi(args[0]);
-
- if (keynum < 0 && keynum != ObjectIdAttributeNumber)
- /* internal error */
- elog(ERROR, "_rserv_log_: invalid keynum %d", keynum);
-
- rel = CurrentTriggerData->tg_relation;
- tupdesc = rel->rd_att;
-
- deleted = (TRIGGER_FIRED_BY_DELETE(CurrentTriggerData->tg_event)) ?
- 1 : 0;
-
- if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event))
- newtuple = CurrentTriggerData->tg_newtuple;
-
-#ifndef PG_FUNCTION_INFO_V1
-
- /*
- * Setting CurrentTriggerData to NULL prevents direct calls to trigger
- * functions in queries. Normally, trigger functions have to be called
- * by trigger manager code only.
- */
- CurrentTriggerData = NULL;
-#endif
-
- /* Connect to SPI manager */
- if ((ret = SPI_connect()) < 0)
- /* internal error */
- elog(ERROR, "_rserv_log_: SPI_connect returned %d", ret);
-
- if (keynum == ObjectIdAttributeNumber)
- {
- snprintf(oidbuf, sizeof(oidbuf), "%u", HeapTupleGetOid(tuple));
- key = oidbuf;
- }
- else
- key = SPI_getvalue(tuple, tupdesc, keynum);
-
- if (key == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_NOT_NULL_VIOLATION),
- errmsg("key must be not null")));
-
- if (newtuple && keynum != ObjectIdAttributeNumber)
- {
- newkey = SPI_getvalue(newtuple, tupdesc, keynum);
- if (newkey == NULL)
- ereport(ERROR,
- (errcode(ERRCODE_NOT_NULL_VIOLATION),
- errmsg("key must be not null")));
- if (strcmp(newkey, key) == 0)
- newkey = NULL;
- else
- deleted = 1; /* old key was deleted */
- }
-
- if (strpbrk(key, "\\ \n'"))
- okey = OutputValue(key, outbuf, sizeof(outbuf));
- else
- okey = key;
-
- snprintf(sql, 8192, "update _RSERV_LOG_ set logid = %d, logtime = now(), "
- "deleted = %d where reloid = %u and key = '%s'",
- GetCurrentTransactionId(), deleted, rel->rd_id, okey);
-
- if (debug)
- elog(DEBUG4, "sql: %s", sql);
-
- ret = SPI_exec(sql, 0);
-
- if (ret < 0)
- ereport(ERROR,
- (errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
- errmsg("SPI_exec(update) returned %d", ret)));
-
- /*
- * If no tuple was UPDATEd then do INSERT...
- */
- if (SPI_processed > 1)
- ereport(ERROR,
- (errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
- errmsg("duplicate tuples")));
-
- else if (SPI_processed == 0)
- {
- snprintf(sql, 8192, "insert into _RSERV_LOG_ "
- "(reloid, logid, logtime, deleted, key) "
- "values (%u, %d, now(), %d, '%s')",
- rel->rd_id, GetCurrentTransactionId(),
- deleted, okey);
-
- if (debug)
- elog(DEBUG4, "sql: %s", sql);
-
- ret = SPI_exec(sql, 0);
-
- if (ret < 0)
- ereport(ERROR,
- (errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
- errmsg("SPI_exec(insert) returned %d", ret)));
- }
-
- if (okey != key && okey != outbuf)
- pfree(okey);
-
- if (newkey)
- {
- if (strpbrk(newkey, "\\ \n'"))
- okey = OutputValue(newkey, outbuf, sizeof(outbuf));
- else
- okey = newkey;
-
- snprintf(sql, 8192, "insert into _RSERV_LOG_ "
- "(reloid, logid, logtime, deleted, key) "
- "values (%u, %d, now(), 0, '%s')",
- rel->rd_id, GetCurrentTransactionId(), okey);
-
- if (debug)
- elog(DEBUG4, "sql: %s", sql);
-
- ret = SPI_exec(sql, 0);
-
- if (ret < 0)
- ereport(ERROR,
- (errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
- errmsg("SPI_exec returned %d", ret)));
-
- if (okey != newkey && okey != outbuf)
- pfree(okey);
- }
-
- SPI_finish();
-
-#ifdef PG_FUNCTION_INFO_V1
- return (PointerGetDatum(tuple));
-#else
- return (tuple);
-#endif
-}
-
-#ifdef PG_FUNCTION_INFO_V1
-Datum
-_rserv_sync_(PG_FUNCTION_ARGS)
-#else
-int32
-_rserv_sync_(int32 server)
-#endif
-{
-#ifdef PG_FUNCTION_INFO_V1
- int32 server = PG_GETARG_INT32(0);
-#endif
- char sql[8192];
- char buf[8192];
- char *active = buf;
- uint32 xcnt;
- int ret;
-
- if (SerializableSnapshot == NULL)
- /* internal error */
- elog(ERROR, "_rserv_sync_: SerializableSnapshot is NULL");
-
- buf[0] = 0;
- for (xcnt = 0; xcnt < SerializableSnapshot->xcnt; xcnt++)
- {
- snprintf(buf + strlen(buf), 8192 - strlen(buf),
- "%s%u", (xcnt) ? ", " : "",
- SerializableSnapshot->xip[xcnt]);
- }
-
- if ((ret = SPI_connect()) < 0)
- /* internal error */
- elog(ERROR, "_rserv_sync_: SPI_connect returned %d", ret);
-
- snprintf(sql, 8192, "insert into _RSERV_SYNC_ "
- "(server, syncid, synctime, status, minid, maxid, active) "
- "values (%u, currval('_rserv_sync_seq_'), now(), 0, %d, %d, '%s')",
- server, SerializableSnapshot->xmin, SerializableSnapshot->xmax, active);
-
- ret = SPI_exec(sql, 0);
-
- if (ret < 0)
- ereport(ERROR,
- (errcode(ERRCODE_TRIGGERED_ACTION_EXCEPTION),
- errmsg("SPI_exec returned %d", ret)));
-
- SPI_finish();
-
- return (0);
-}
-
-#ifdef PG_FUNCTION_INFO_V1
-Datum
-_rserv_debug_(PG_FUNCTION_ARGS)
-#else
-int32
-_rserv_debug_(int32 newval)
-#endif
-{
-#ifdef PG_FUNCTION_INFO_V1
- int32 newval = PG_GETARG_INT32(0);
-#endif
- int32 oldval = debug;
-
- debug = newval;
-
- return (oldval);
-}
-
-#define ExtendBy 1024
-
-static char *
-OutputValue(char *key, char *buf, int size)
-{
- int i = 0;
- char *out = buf;
- char *subst = NULL;
- int slen = 0;
-
- size--;
- for (;;)
- {
- switch (*key)
- {
- case '\\':
- subst = "\\\\";
- slen = 2;
- break;
- case ' ':
- subst = "\\011";
- slen = 4;
- break;
- case '\n':
- subst = "\\012";
- slen = 4;
- break;
- case '\'':
- subst = "\\047";
- slen = 4;
- break;
- case '\0':
- out[i] = 0;
- return (out);
- default:
- slen = 1;
- break;
- }
-
- if (i + slen >= size)
- {
- if (out == buf)
- {
- out = (char *) palloc(size + ExtendBy);
- strncpy(out, buf, i);
- size += ExtendBy;
- }
- else
- {
- out = (char *) repalloc(out, size + ExtendBy);
- size += ExtendBy;
- }
- }
-
- if (slen == 1)
- out[i++] = *key;
- else
- {
- memcpy(out + i, subst, slen);
- i += slen;
- }
- key++;
- }
-
- return (out);
-
-}