static PyObject * psyco_repl_curs_start_replication_expert(replicationCursorObject *self, PyObject *args, PyObject *kwargs) { cursorObject *curs = &self->cur; connectionObject *conn = self->cur.conn; PyObject *res = NULL; char *command; long int decode = 0; static char *kwlist[] = {"command", "decode", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s|l", kwlist, &command, &decode)) { return NULL; } EXC_IF_CURS_CLOSED(curs); EXC_IF_GREEN(start_replication_expert); EXC_IF_TPC_PREPARED(conn, start_replication_expert); Dprintf("psyco_repl_curs_start_replication_expert: '%s'; decode: %ld", command, decode); if (pq_execute(curs, command, conn->async, 1 /* no_result */, 1 /* no_begin */) >= 0) { res = Py_None; Py_INCREF(res); self->decode = decode; gettimeofday(&self->last_io, NULL); } return res; }
static PyObject * psyco_repl_curs_consume_stream(replicationCursorObject *self, PyObject *args, PyObject *kwargs) { cursorObject *curs = &self->cur; PyObject *consume = NULL, *res = NULL; double keepalive_interval = 10; static char *kwlist[] = {"consume", "keepalive_interval", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|id", kwlist, &consume, &keepalive_interval)) { return NULL; } EXC_IF_CURS_CLOSED(curs); EXC_IF_CURS_ASYNC(curs, consume_stream); EXC_IF_GREEN(consume_stream); EXC_IF_TPC_PREPARED(self->cur.conn, consume_stream); Dprintf("psyco_repl_curs_consume_stream"); if (keepalive_interval < 1.0) { psyco_set_error(ProgrammingError, curs, "keepalive_interval must be >= 1 (sec)"); return NULL; } if (self->consuming) { PyErr_SetString(ProgrammingError, "consume_stream cannot be used when already in the consume loop"); return NULL; } if (curs->pgres == NULL || PQresultStatus(curs->pgres) != PGRES_COPY_BOTH) { PyErr_SetString(ProgrammingError, "consume_stream: not replicating, call start_replication first"); return NULL; } CLEARPGRES(curs->pgres); self->consuming = 1; if (pq_copy_both(self, consume, keepalive_interval) >= 0) { res = Py_None; Py_INCREF(res); } self->consuming = 0; return res; }
static PyObject * psyco_conn_lobject(connectionObject *self, PyObject *args, PyObject *keywds) { Oid oid = InvalidOid, new_oid = InvalidOid; const char *new_file = NULL; const char *smode = ""; PyObject *factory = (PyObject *)&lobjectType; PyObject *obj; static char *kwlist[] = {"oid", "mode", "new_oid", "new_file", "lobject_factory", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "|IzIzO", kwlist, &oid, &smode, &new_oid, &new_file, &factory)) { return NULL; } EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, lobject); EXC_IF_GREEN(lobject); EXC_IF_TPC_PREPARED(self, lobject); Dprintf("psyco_conn_lobject: new lobject for connection at %p", self); Dprintf("psyco_conn_lobject: parameters: oid = %u, mode = %s", oid, smode); Dprintf("psyco_conn_lobject: parameters: new_oid = %d, new_file = %s", new_oid, new_file); if (new_file) obj = PyObject_CallFunction(factory, "OIsIs", self, oid, smode, new_oid, new_file); else obj = PyObject_CallFunction(factory, "OIsI", self, oid, smode, new_oid); if (obj == NULL) return NULL; if (PyObject_IsInstance(obj, (PyObject *)&lobjectType) == 0) { PyErr_SetString(PyExc_TypeError, "lobject factory must be subclass of psycopg2.extensions.lobject"); Py_DECREF(obj); return NULL; } Dprintf("psyco_conn_lobject: new lobject at %p: refcnt = " FORMAT_CODE_PY_SSIZE_T, obj, Py_REFCNT(obj)); return obj; }
static PyObject * psyco_repl_curs_read_message(replicationCursorObject *self) { cursorObject *curs = &self->cur; replicationMessageObject *msg = NULL; EXC_IF_CURS_CLOSED(curs); EXC_IF_GREEN(read_message); EXC_IF_TPC_PREPARED(self->cur.conn, read_message); if (pq_read_replication_message(self, &msg) < 0) { return NULL; } if (msg) { return (PyObject *)msg; } Py_RETURN_NONE; }
static PyObject * psyco_conn_lobject(connectionObject *self, PyObject *args, PyObject *keywds) { Oid oid=InvalidOid, new_oid=InvalidOid; char *smode = NULL, *new_file = NULL; int mode=0; PyObject *obj, *factory = NULL; static char *kwlist[] = {"oid", "mode", "new_oid", "new_file", "cursor_factory", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "|izizO", kwlist, &oid, &smode, &new_oid, &new_file, &factory)) { return NULL; } EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, lobject); EXC_IF_GREEN(lobject); Dprintf("psyco_conn_lobject: new lobject for connection at %p", self); Dprintf("psyco_conn_lobject: parameters: oid = %d, mode = %s", oid, smode); Dprintf("psyco_conn_lobject: parameters: new_oid = %d, new_file = %s", new_oid, new_file); /* build a mode number out of the mode string: right now we only accept 'r', 'w' and 'rw' (but note that 'w' implies 'rw' because PostgreSQL backend does that. */ if (smode) { if (strncmp("rw", smode, 2) == 0) mode = INV_READ+INV_WRITE; else if (smode[0] == 'r') mode = INV_READ; else if (smode[0] == 'w') mode = INV_WRITE; else if (smode[0] == 'n') mode = -1; else { PyErr_SetString(PyExc_TypeError, "mode should be one of 'r', 'w' or 'rw'"); return NULL; } } if (factory == NULL) factory = (PyObject *)&lobjectType; if (new_file) obj = PyObject_CallFunction(factory, "Oiiis", self, oid, mode, new_oid, new_file); else obj = PyObject_CallFunction(factory, "Oiii", self, oid, mode, new_oid); if (obj == NULL) return NULL; if (PyObject_IsInstance(obj, (PyObject *)&lobjectType) == 0) { PyErr_SetString(PyExc_TypeError, "lobject factory must be subclass of psycopg2._psycopg.lobject"); Py_DECREF(obj); return NULL; } Dprintf("psyco_conn_lobject: new lobject at %p: refcnt = " FORMAT_CODE_PY_SSIZE_T, obj, obj->ob_refcnt); return obj; }