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_conn_cancel(connectionObject *self, PyObject *args) { char errbuf[256]; EXC_IF_CONN_CLOSED(self); EXC_IF_TPC_PREPARED(self, cancel); /* do not allow cancellation while the connection is being built */ Dprintf("psyco_conn_cancel: cancelling with key %p", self->cancel); if (self->status != CONN_STATUS_READY && self->status != CONN_STATUS_BEGIN) { PyErr_SetString(OperationalError, "asynchronous connection attempt underway"); return NULL; } if (PQcancel(self->cancel, errbuf, sizeof(errbuf)) == 0) { Dprintf("psyco_conn_cancel: cancelling failed: %s", errbuf); PyErr_SetString(OperationalError, errbuf); return NULL; } Py_INCREF(Py_None); return Py_None; }
static PyObject * psyco_conn_tpc_recover(connectionObject *self) { EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, tpc_recover); EXC_IF_TPC_PREPARED(self, tpc_recover); EXC_IF_TPC_NOT_SUPPORTED(self); return conn_tpc_recover(self); }
static PyObject * psyco_conn_isolation_level_get(connectionObject *self) { int rv; EXC_IF_CONN_CLOSED(self); EXC_IF_TPC_PREPARED(self, set_isolation_level); rv = conn_get_isolation_level(self); if (-1 == rv) { return NULL; } return PyInt_FromLong((long)rv); }
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_conn_set_isolation_level(connectionObject *self, PyObject *args) { int level = 1; PyObject *pyval = NULL; EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, "isolation_level"); EXC_IF_TPC_PREPARED(self, "isolation_level"); if (!PyArg_ParseTuple(args, "O", &pyval)) return NULL; if (pyval == Py_None) { level = ISOLATION_LEVEL_DEFAULT; } /* parse from one of the level constants */ else if (PyInt_Check(pyval)) { level = PyInt_AsLong(pyval); if (level < 0 || level > 4) { PyErr_SetString(PyExc_ValueError, "isolation level must be between 0 and 4"); return NULL; } } if (0 > conn_rollback(self)) { return NULL; } if (level == 0) { if (0 > conn_set_session(self, 1, self->isolevel, self->readonly, self->deferrable)) { return NULL; } } else { if (0 > conn_set_session(self, 0, level, self->readonly, self->deferrable)) { return NULL; } } Py_RETURN_NONE; }
static PyObject * psyco_conn_set_client_encoding(connectionObject *self, PyObject *args) { const char *enc; PyObject *rv = NULL; EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, set_client_encoding); EXC_IF_TPC_PREPARED(self, set_client_encoding); if (!PyArg_ParseTuple(args, "s", &enc)) return NULL; if (conn_set_client_encoding(self, enc) >= 0) { Py_INCREF(Py_None); rv = Py_None; } return rv; }
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_tpc_prepare(connectionObject *self) { EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, tpc_prepare); EXC_IF_TPC_PREPARED(self, tpc_prepare); if (NULL == self->tpc_xid) { PyErr_SetString(ProgrammingError, "prepare must be called inside a two-phase transaction"); return NULL; } if (0 > conn_tpc_command(self, "PREPARE TRANSACTION", self->tpc_xid)) { return NULL; } /* transaction prepared: set the state so that no operation * can be performed until commit. */ self->status = CONN_STATUS_PREPARED; Py_RETURN_NONE; }
static PyObject * psyco_conn_set_isolation_level(connectionObject *self, PyObject *args) { int level = 1; EXC_IF_CONN_CLOSED(self); EXC_IF_CONN_ASYNC(self, set_isolation_level); EXC_IF_TPC_PREPARED(self, set_isolation_level); if (!PyArg_ParseTuple(args, "i", &level)) return NULL; if (level < 0 || level > 4) { PyErr_SetString(PyExc_ValueError, "isolation level must be between 0 and 4"); return NULL; } if (conn_switch_isolation_level(self, level) < 0) { return NULL; } Py_RETURN_NONE; }