Further work on adjusting attribute, method and parameter names to be

consistent and to comply with PEP 8 naming guidelines; add a separate
section to the documentation to deal with all deprecations so that they
are all in one place.
This commit is contained in:
Anthony Tuininga 2021-04-23 13:40:24 -06:00
parent 4b72d0de02
commit c527c06650
12 changed files with 278 additions and 74 deletions

View File

@ -25,33 +25,54 @@ used to enqueue and dequeue messages.
which the queue was created. which the queue was created.
.. method:: Queue.deqMany(maxMessages) .. method:: Queue.deqmany(maxMessages)
Dequeues up to the specified number of messages from the queue and returns Dequeues up to the specified number of messages from the queue and returns
a list of these messages. Each element of the returned list is a a list of these messages. Each element of the returned list is a
:ref:`message property<msgproperties>` object. :ref:`message property<msgproperties>` object.
.. versionchanged:: 8.2
.. method:: Queue.deqOne() For consistency and compliance with the PEP 8 naming style, the name of
the method was changed from `deqMany()`. The old name will continue to
work for a period of time.
.. method:: Queue.deqone()
Dequeues at most one message from the queue. If a message is dequeued, it Dequeues at most one message from the queue. If a message is dequeued, it
will be a :ref:`message property<msgproperties>` object; otherwise, it will will be a :ref:`message property<msgproperties>` object; otherwise, it will
be the value None. be the value None.
.. attribute:: Queue.deqOptions .. versionchanged:: 8.2
For consistency and compliance with the PEP 8 naming style, the name of
the method was changed from `deqOne()`. The old name will continue to
work for a period of time.
.. attribute:: Queue.deqoptions
This read-only attribute returns a reference to the :ref:`options This read-only attribute returns a reference to the :ref:`options
<deqoptions>` that will be used when dequeuing messages from the queue. <deqoptions>` that will be used when dequeuing messages from the queue.
.. versionchanged:: 8.2
.. method:: Queue.enqOne(message) For consistency and compliance with the PEP 8 naming style, the name of
the attribute was changed from `deqOptions`. The old name will continue
to work for a period of time.
.. method:: Queue.enqone(message)
Enqueues a single message into the queue. The message must be a Enqueues a single message into the queue. The message must be a
:ref:`message property<msgproperties>` object which has had its payload :ref:`message property<msgproperties>` object which has had its payload
attribute set to a value that the queue supports. attribute set to a value that the queue supports.
.. versionchanged:: 8.2
.. method:: Queue.enqMany(messages) For consistency and compliance with the PEP 8 naming style, the name of
the method was changed from `enqone()`. The old name will continue
to work for a period of time.
.. method:: Queue.enqmany(messages)
Enqueues multiple messages into the queue. The messages parameter must be a Enqueues multiple messages into the queue. The messages parameter must be a
sequence containing :ref:`message property <msgproperties>` objects which sequence containing :ref:`message property <msgproperties>` objects which
@ -62,26 +83,38 @@ used to enqueue and dequeue messages.
acquired from the same pool may fail due to Oracle bug 29928074. Ensure acquired from the same pool may fail due to Oracle bug 29928074. Ensure
that this function is not run in parallel, use standalone connections or that this function is not run in parallel, use standalone connections or
connections from different pools, or make multiple calls to connections from different pools, or make multiple calls to
:meth:`Queue.enqOne()` instead. The function :meth:`Queue.deqMany()` :meth:`Queue.enqone()` instead. The function :meth:`Queue.deqmany()`
call is not affected. call is not affected.
.. attribute:: Queue.enqOptions .. attribute:: Queue.enqoptions
This read-only attribute returns a reference to the :ref:`options This read-only attribute returns a reference to the :ref:`options
<enqoptions>` that will be used when enqueuing messages into the queue. <enqoptions>` that will be used when enqueuing messages into the queue.
.. versionchanged:: 8.2
For consistency and compliance with the PEP 8 naming style, the name of
the attribute was changed from `enqOptions`. The old name will continue
to work for a period of time.
.. attribute:: Queue.name .. attribute:: Queue.name
This read-only attribute returns the name of the queue. This read-only attribute returns the name of the queue.
.. attribute:: Queue.payloadType .. attribute:: Queue.payload_type
This read-only attribute returns the object type for payloads that can be This read-only attribute returns the object type for payloads that can be
enqueued and dequeued. If using a raw queue, this returns the value None. enqueued and dequeued. If using a raw queue, this returns the value None.
.. versionchanged:: 8.2
For consistency and compliance with the PEP 8 naming style, the name of
the attribute was changed from `payloadType`. The old name will
continue to work for a period of time.
.. _deqoptions: .. _deqoptions:
@ -225,8 +258,8 @@ Message Properties
These objects are used to identify the properties of messages that are These objects are used to identify the properties of messages that are
enqueued and dequeued in queues. They are created by the method enqueued and dequeued in queues. They are created by the method
:meth:`Connection.msgproperties()`. They are used by the methods :meth:`Connection.msgproperties()`. They are used by the methods
:meth:`Queue.enqOne()` and :meth:`Queue.enqMany()` and :meth:`Queue.enqone()` and :meth:`Queue.enqmany()` and
returned by the methods :meth:`Queue.deqOne()` and :meth:`Queue.deqMany()`. returned by the methods :meth:`Queue.deqone()` and :meth:`Queue.deqmany()`.
.. attribute:: MessageProperties.attempts .. attribute:: MessageProperties.attempts

View File

@ -68,7 +68,7 @@ Connection Object
This method is an extension to the DB API definition. This method is an extension to the DB API definition.
.. attribute:: Connection.callTimeout .. attribute:: Connection.call_timeout
This read-write attribute specifies the amount of time (in milliseconds) This read-write attribute specifies the amount of time (in milliseconds)
that a single round-trip to the database may take before a timeout will that a single round-trip to the database may take before a timeout will
@ -76,6 +76,12 @@ Connection Object
.. versionadded:: 7.0 .. versionadded:: 7.0
.. versionchanged:: 8.2
For consistency and compliance with the PEP 8 naming style, the
attribute `callTimeout` was renamed to `call_timeout`. The old name
will continue to work for a period of time.
.. note:: .. note::
This attribute is an extension to the DB API definition and is only This attribute is an extension to the DB API definition and is only
@ -387,6 +393,8 @@ Connection Object
This read-only attribute returns the maximum number of bytes each character This read-only attribute returns the maximum number of bytes each character
can use for the client character set. can use for the client character set.
.. deprecated:: 8.2
.. note:: .. note::
This attribute is an extension to the DB API definition. This attribute is an extension to the DB API definition.
@ -469,7 +477,7 @@ Connection Object
This method is an extension to the DB API definition. This method is an extension to the DB API definition.
.. method:: Connection.queue(name, payloadType=None) .. method:: Connection.queue(name, payload_type=None)
Creates a :ref:`queue <queue>` which is used to enqueue and dequeue Creates a :ref:`queue <queue>` which is used to enqueue and dequeue
messages in Advanced Queueing. messages in Advanced Queueing.
@ -477,12 +485,18 @@ Connection Object
The name parameter is expected to be a string identifying the queue in The name parameter is expected to be a string identifying the queue in
which messages are to be enqueued or dequeued. which messages are to be enqueued or dequeued.
The payloadType parameter, if specified, is expected to be an The payload_type parameter, if specified, is expected to be an
:ref:`object type <objecttype>` that identifies the type of payload the :ref:`object type <objecttype>` that identifies the type of payload the
queue expects. If not specified, RAW data is enqueued and dequeued. queue expects. If not specified, RAW data is enqueued and dequeued.
.. versionadded:: 7.2 .. versionadded:: 7.2
.. versionchanged:: 8.2
For consistency and compliance with the PEP 8 naming style, the
parameter `payloadType` was renamed to `payload_type`. The old name
will continue to work as a keyword parameter for a period of time.
.. note:: .. note::
This method is an extension to the DB API definition. This method is an extension to the DB API definition.

View File

@ -0,0 +1,138 @@
.. _deprecations:
************
Deprecations
************
The following tables contains all of the deprecations in the cx_Oracle API,
when they were first deprecated and a comment on what should be used instead,
if applicable. The most recent deprecations are listed first.
.. list-table:: Deprecated in 8.2
:header-rows: 1
:widths: 25 75
:width: 100%
:name: _deprecations_8_2
* - Name
- Comments
* - `encoding` parameter to :meth:`cx_Oracle.connect()`
- No longer needed as the use of encodings other than UTF-8 is
deprecated.
* - `nencoding` parameter to :meth:`cx_Oracle.connect()`
- No longer needed as the use of encodings other than UTF-8 is
deprecated.
* - `encoding` parameter to :meth:`cx_Oracle.SessionPool()`
- No longer needed as the use of encodings other than UTF-8 is
deprecated.
* - `nencoding` parameter to :meth:`cx_Oracle.SessionPool()`
- No longer needed as the use of encodings other than UTF-8 is
deprecated.
* - Connection.maxBytesPerCharacter
- No longer needed as the use of encodings other than UTF-8 is
deprecated.
* - positional parmeters to :meth:`cx_Oracle.connect()`
- Replace with keyword parameters in order to comply with the Python
database API.
* - positional parmeters to :meth:`cx_Oracle.SessionPool()`
- Replace with keyword parameters in order to comply with the Python
database API.
* - `waitTimeout` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `wait_timeout`
* - `maxLifetimeSession` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `max_lifetime_session`
* - `sessionCallback` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `session_callback`
* - `maxSessionsPerShard` parameter to :meth:`cx_Oracle.SessionPool()`
- Replace with parameter name `max_sessions_per_shard`
* - `payloadType` parameter to :meth:`Connection.queue()`
- Replace with parameter name `payload_type` if using keyword parmeters.
* - `Connection.callTimeout`
- Replace with :data:`Connection.call_timeout`
* - `Queue.deqMany`
- Replace with :meth:`Queue.deqmany()`
* - `Queue.deqOne`
- Replace with :meth:`Queue.deqone()`
* - `Queue.enqMany`
- Replace with :meth:`Queue.enqmany()`
* - `Queue.enqOne`
- Replace with :meth:`Queue.enqone()`
* - `Queue.deqOptions`
- Replace with :data:`Queue.deqoptions()`
* - `Queue.enqOptions`
- Replace with :meth:`Queue.enqoptions()`
* - `Queue.payloadType`
- Replace with :meth:`Queue.payload_type`
.. list-table:: Deprecated in 8.0
:header-rows: 1
:widths: 25 75
:width: 100%
:name: _deprecations_8_0
* - Name
- Comments
* - cx_Oracle.BFILE
- Replace with :data:`cx_Oracle.DB_TYPE_BFILE`
* - cx_Oracle.BLOB
- Replace with :data:`cx_Oracle.DB_TYPE_BLOB`
* - cx_Oracle.BOOLEAN
- Replace with :data:`cx_Oracle.DB_TYPE_BOOLEAN`
* - cx_Oracle.CLOB
- Replace with :data:`cx_Oracle.DB_TYPE_CLOB`
* - cx_Oracle.CURSOR
- Replace with :data:`cx_Oracle.DB_TYPE_CURSOR`
* - cx_Oracle.FIXED_CHAR
- Replace with :data:`cx_Oracle.DB_TYPE_CHAR`
* - cx_Oracle.FIXED_NCHAR
- Replace with :data:`cx_Oracle.DB_TYPE_NCHAR`
* - cx_Oracle.INTERVAL
- Replace with :data:`cx_Oracle.DB_TYPE_INTERVAL_DS`
* - cx_Oracle.LONG_BINARY
- Replace with :data:`cx_Oracle.DB_TYPE_LONG_RAW`
* - cx_Oracle.LONG_STRING
- Replace with :data:`cx_Oracle.DB_TYPE_LONG`
* - cx_Oracle.NATIVE_FLOAT
- Replace with :data:`cx_Oracle.DB_TYPE_BINARY_DOUBLE`
* - cx_Oracle.NATIVE_INT
- Replace with :data:`cx_Oracle.DB_TYPE_BINARY_INTEGER`
* - cx_Oracle.NCHAR
- Replace with :data:`cx_Oracle.DB_TYPE_NVARCHAR`
* - cx_Oracle.NCLOB
- Replace with :data:`cx_Oracle.DB_TYPE_NCLOB`
* - cx_Oracle.OBJECT
- Replace with :data:`cx_Oracle.DB_TYPE_OBJECT`
* - cx_Oracle.TIMESTAMP
- Replace with :data:`cx_Oracle.DB_TYPE_TIMESTAMP`
.. list-table:: Deprecated in 7.2
:header-rows: 1
:widths: 25 75
:width: 100%
:name: _deprecations_7_2
* - Name
- Comments
* - Connection.deq()
- Replace with :meth:`Queue.deqOne()` or :meth:`Queue.deqMany()`.
* - Connection.deqoptions()
- Replace with attribute :attr:`Queue.deqOptions`.
* - Connection.enq()
- Replace with :meth:`Queue.enqOne()` or :meth:`Queue.enqMany()`.
* - Connection.enqoptions()
- Replace with attribute :attr:`Queue.enqOptions`.
.. list-table:: Deprecated in 6.4
:header-rows: 1
:widths: 25 75
:width: 100%
:name: _deprecations_6_4
* - Name
- Comments
* - Cursor.executemanyprepared()
- Replace with :meth:`~Cursor.executemany()` with None for the statement
argument and an integer for the parameters argument.

View File

@ -57,6 +57,7 @@ API Manual
api_manual/object_type.rst api_manual/object_type.rst
api_manual/aq.rst api_manual/aq.rst
api_manual/soda.rst api_manual/soda.rst
api_manual/deprecations.rst
Indices and tables Indices and tables

View File

@ -24,12 +24,11 @@ Version 8.2 (TBD)
<https://github.com/oracle/python-cx_Oracle/issues/530>`__). <https://github.com/oracle/python-cx_Oracle/issues/530>`__).
#) Added check to ensure that when setting variables or object attributes, the #) Added check to ensure that when setting variables or object attributes, the
type of the temporary LOB must match the expected type. type of the temporary LOB must match the expected type.
#) All of the parameter names for the :meth:`~cx_Oracle.SessionPool` #) In order to follow the PEP 8 naming style a number of parameter names,
constructor now follow the PEP 8 naming style. The parameter names method names and attribute names were modified. The old names will be
`waitTimeout` (use `wait_timeout` instead), `maxLifetimeSession` (use removed in a subsequent release of cx_Oracle. In addition, the use of
`max_lifetime_session` instead), `sessionCallback` (use `session_callback` encodings other than UTF-8 is also deprecated. See
instead) and `maxSessionsPerShard` (use `max_sessions_per_shard` instead) :ref:`_deprecations_8_2` for details.
are deprecated and will be removed in a subsequent release of cx_Oracle.
#) Improved test suite. #) Improved test suite.
@ -455,7 +454,7 @@ Version 7.0 (September 2018)
:ref:`SODA Collection <sodacoll>` and :ref:`SODA Document <sodadoc>` for :ref:`SODA Collection <sodacoll>` and :ref:`SODA Document <sodadoc>` for
more information. more information.
#) Added support for call timeouts available in Oracle Client 18.1 and #) Added support for call timeouts available in Oracle Client 18.1 and
higher. See :attr:`Connection.callTimeout`. higher. See :attr:`Connection.call_timeout`.
#) Added support for getting the contents of a SQL collection object as a #) Added support for getting the contents of a SQL collection object as a
dictionary, where the keys are the indices of the collection and the values dictionary, where the keys are the indices of the collection and the values
are the elements of the collection. See function :meth:`Object.asdict()`. are the elements of the collection. See function :meth:`Object.asdict()`.

View File

@ -17,8 +17,8 @@ import cx_Oracle
import sample_env import sample_env
connection = cx_Oracle.connect(sample_env.get_main_connect_string()) connection = cx_Oracle.connect(sample_env.get_main_connect_string())
connection.callTimeout = 2000 connection.call_timeout = 2000
print("Call timeout set at", connection.callTimeout, "milliseconds...") print("Call timeout set at", connection.call_timeout, "milliseconds...")
cursor = connection.cursor() cursor = connection.cursor()
cursor.execute("select sysdate from dual") cursor.execute("select sysdate from dual")

View File

@ -12,7 +12,7 @@
# This script demonstrates how to use multi-consumer advanced queuing using # This script demonstrates how to use multi-consumer advanced queuing using
# cx_Oracle. It makes use of a RAW queue created in the sample setup. # cx_Oracle. It makes use of a RAW queue created in the sample setup.
# #
# This script requires cx_Oracle 7.2 and higher. # This script requires cx_Oracle 8.2 and higher.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
import cx_Oracle import cx_Oracle
@ -32,22 +32,22 @@ cursor = connection.cursor()
# create queue # create queue
queue = connection.queue(QUEUE_NAME) queue = connection.queue(QUEUE_NAME)
queue.deqOptions.wait = cx_Oracle.DEQ_NO_WAIT queue.deqoptions.wait = cx_Oracle.DEQ_NO_WAIT
queue.deqOptions.navigation = cx_Oracle.DEQ_FIRST_MSG queue.deqoptions.navigation = cx_Oracle.DEQ_FIRST_MSG
# enqueue a few messages # enqueue a few messages
print("Enqueuing messages...") print("Enqueuing messages...")
for data in PAYLOAD_DATA: for data in PAYLOAD_DATA:
print(data) print(data)
queue.enqOne(connection.msgproperties(payload=data)) queue.enqone(connection.msgproperties(payload=data))
connection.commit() connection.commit()
print() print()
# dequeue the messages for consumer A # dequeue the messages for consumer A
print("Dequeuing the messages for consumer A...") print("Dequeuing the messages for consumer A...")
queue.deqOptions.consumername = "SUBSCRIBER_A" queue.deqoptions.consumername = "SUBSCRIBER_A"
while True: while True:
props = queue.deqOne() props = queue.deqone()
if not props: if not props:
break break
print(props.payload.decode()) print(props.payload.decode())
@ -56,9 +56,9 @@ print()
# dequeue the message for consumer B # dequeue the message for consumer B
print("Dequeuing the messages for consumer B...") print("Dequeuing the messages for consumer B...")
queue.deqOptions.consumername = "SUBSCRIBER_B" queue.deqoptions.consumername = "SUBSCRIBER_B"
while True: while True:
props = queue.deqOne() props = queue.deqone()
if not props: if not props:
break break
print(props.payload.decode()) print(props.payload.decode())

View File

@ -13,7 +13,7 @@
# cx_Oracle. It makes use of a simple type and queue created in the sample # cx_Oracle. It makes use of a simple type and queue created in the sample
# setup. # setup.
# #
# This script requires cx_Oracle 7.2 and higher. # This script requires cx_Oracle 8.2 and higher.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
import cx_Oracle import cx_Oracle
@ -35,13 +35,13 @@ cursor = connection.cursor()
# create queue # create queue
books_type = connection.gettype(BOOK_TYPE_NAME) books_type = connection.gettype(BOOK_TYPE_NAME)
queue = connection.queue(QUEUE_NAME, books_type) queue = connection.queue(QUEUE_NAME, payload_type=books_type)
queue.deqOptions.wait = cx_Oracle.DEQ_NO_WAIT queue.deqoptions.wait = cx_Oracle.DEQ_NO_WAIT
queue.deqOptions.navigation = cx_Oracle.DEQ_FIRST_MSG queue.deqoptions.navigation = cx_Oracle.DEQ_FIRST_MSG
# dequeue all existing messages to ensure the queue is empty, just so that # dequeue all existing messages to ensure the queue is empty, just so that
# the results are consistent # the results are consistent
while queue.deqOne(): while queue.deqone():
pass pass
# enqueue a few messages # enqueue a few messages
@ -52,13 +52,13 @@ for title, authors, price in BOOK_DATA:
book.AUTHORS = authors book.AUTHORS = authors
book.PRICE = price book.PRICE = price
print(title) print(title)
queue.enqOne(connection.msgproperties(payload=book)) queue.enqone(connection.msgproperties(payload=book))
connection.commit() connection.commit()
# dequeue the messages # dequeue the messages
print("\nDequeuing messages...") print("\nDequeuing messages...")
while True: while True:
props = queue.deqOne() props = queue.deqone()
if not props: if not props:
break break
print(props.payload.TITLE) print(props.payload.TITLE)

View File

@ -12,7 +12,7 @@
# This script demonstrates how to use advanced queuing with RAW data using # This script demonstrates how to use advanced queuing with RAW data using
# cx_Oracle. It makes use of a RAW queue created in the sample setup. # cx_Oracle. It makes use of a RAW queue created in the sample setup.
# #
# This script requires cx_Oracle 7.2 and higher. # This script requires cx_Oracle 8.2 and higher.
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
import cx_Oracle import cx_Oracle
@ -32,25 +32,25 @@ cursor = connection.cursor()
# create queue # create queue
queue = connection.queue(QUEUE_NAME) queue = connection.queue(QUEUE_NAME)
queue.deqOptions.wait = cx_Oracle.DEQ_NO_WAIT queue.deqoptions.wait = cx_Oracle.DEQ_NO_WAIT
queue.deqOptions.navigation = cx_Oracle.DEQ_FIRST_MSG queue.deqoptions.navigation = cx_Oracle.DEQ_FIRST_MSG
# dequeue all existing messages to ensure the queue is empty, just so that # dequeue all existing messages to ensure the queue is empty, just so that
# the results are consistent # the results are consistent
while queue.deqOne(): while queue.deqone():
pass pass
# enqueue a few messages # enqueue a few messages
print("Enqueuing messages...") print("Enqueuing messages...")
for data in PAYLOAD_DATA: for data in PAYLOAD_DATA:
print(data) print(data)
queue.enqOne(connection.msgproperties(payload=data)) queue.enqone(connection.msgproperties(payload=data))
connection.commit() connection.commit()
# dequeue the messages # dequeue the messages
print("\nDequeuing messages...") print("\nDequeuing messages...")
while True: while True:
props = queue.deqOne() props = queue.deqone()
if not props: if not props:
break break
print(props.payload.decode()) print(props.payload.decode())

View File

@ -1348,8 +1348,9 @@ static PyObject *cxoConnection_enqueue(cxoConnection *conn, PyObject* args,
static PyObject *cxoConnection_queue(cxoConnection *conn, PyObject* args, static PyObject *cxoConnection_queue(cxoConnection *conn, PyObject* args,
PyObject* keywordArgs) PyObject* keywordArgs)
{ {
static char *keywordList[] = { "name", "payloadType", NULL }; static char *keywordList[] = { "name", "payload_type", "payloadType",
cxoObjectType *typeObj; NULL };
cxoObjectType *typeObj, *deprecatedTypeObj;
cxoBuffer nameBuffer; cxoBuffer nameBuffer;
PyObject *nameObj; PyObject *nameObj;
dpiQueue *handle; dpiQueue *handle;
@ -1357,12 +1358,21 @@ static PyObject *cxoConnection_queue(cxoConnection *conn, PyObject* args,
int status; int status;
// parse arguments // parse arguments
typeObj = NULL; typeObj = deprecatedTypeObj = NULL;
if (!PyArg_ParseTupleAndKeywords(args, keywordArgs, "O|O!", keywordList, if (!PyArg_ParseTupleAndKeywords(args, keywordArgs, "O|O!O!", keywordList,
&nameObj, &cxoPyTypeObjectType, &typeObj)) &nameObj, &cxoPyTypeObjectType, &typeObj, &cxoPyTypeObjectType,
&deprecatedTypeObj))
return NULL; return NULL;
if (cxoConnection_isConnected(conn) < 0) if (cxoConnection_isConnected(conn) < 0)
return NULL; return NULL;
if (deprecatedTypeObj) {
if (typeObj) {
cxoError_raiseFromString(cxoProgrammingErrorException,
"payload_type and payloadType cannot both be specified");
return NULL;
}
typeObj = deprecatedTypeObj;
}
if (cxoBuffer_fromObject(&nameBuffer, nameObj, if (cxoBuffer_fromObject(&nameBuffer, nameObj,
conn->encodingInfo.encoding) < 0) conn->encodingInfo.encoding) < 0)
return NULL; return NULL;
@ -1964,7 +1974,7 @@ static PyGetSetDef cxoCalcMembers[] = {
{ "version", (getter) cxoConnection_getVersion, 0, 0, 0 }, { "version", (getter) cxoConnection_getVersion, 0, 0, 0 },
{ "encoding", (getter) cxoConnection_getEncoding, 0, 0, 0 }, { "encoding", (getter) cxoConnection_getEncoding, 0, 0, 0 },
{ "nencoding", (getter) cxoConnection_getNationalEncoding, 0, 0, 0 }, { "nencoding", (getter) cxoConnection_getNationalEncoding, 0, 0, 0 },
{ "callTimeout", (getter) cxoConnection_getCallTimeout, { "call_timeout", (getter) cxoConnection_getCallTimeout,
(setter) cxoConnection_setCallTimeout, 0, 0 }, (setter) cxoConnection_setCallTimeout, 0, 0 },
{ "maxBytesPerCharacter", (getter) cxoConnection_getMaxBytesPerCharacter, { "maxBytesPerCharacter", (getter) cxoConnection_getMaxBytesPerCharacter,
0, 0, 0 }, 0, 0, 0 },
@ -2005,6 +2015,8 @@ static PyGetSetDef cxoCalcMembers[] = {
&cxoDataErrorException }, &cxoDataErrorException },
{ "NotSupportedError", (getter) cxoConnection_getException, NULL, NULL, { "NotSupportedError", (getter) cxoConnection_getException, NULL, NULL,
&cxoNotSupportedErrorException }, &cxoNotSupportedErrorException },
{ "callTimeout", (getter) cxoConnection_getCallTimeout,
(setter) cxoConnection_setCallTimeout, 0, 0 },
{ NULL } { NULL }
}; };

View File

@ -355,6 +355,10 @@ static PyObject *cxoQueue_enqOne(cxoQueue *queue, PyObject *args)
// declaration of methods // declaration of methods
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static PyMethodDef cxoMethods[] = { static PyMethodDef cxoMethods[] = {
{ "deqmany", (PyCFunction) cxoQueue_deqMany, METH_VARARGS },
{ "deqone", (PyCFunction) cxoQueue_deqOne, METH_NOARGS },
{ "enqmany", (PyCFunction) cxoQueue_enqMany, METH_VARARGS },
{ "enqone", (PyCFunction) cxoQueue_enqOne, METH_VARARGS },
{ "deqMany", (PyCFunction) cxoQueue_deqMany, METH_VARARGS }, { "deqMany", (PyCFunction) cxoQueue_deqMany, METH_VARARGS },
{ "deqOne", (PyCFunction) cxoQueue_deqOne, METH_NOARGS }, { "deqOne", (PyCFunction) cxoQueue_deqOne, METH_NOARGS },
{ "enqMany", (PyCFunction) cxoQueue_enqMany, METH_VARARGS }, { "enqMany", (PyCFunction) cxoQueue_enqMany, METH_VARARGS },
@ -368,9 +372,12 @@ static PyMethodDef cxoMethods[] = {
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
static PyMemberDef cxoMembers[] = { static PyMemberDef cxoMembers[] = {
{ "connection", T_OBJECT, offsetof(cxoQueue, conn), READONLY }, { "connection", T_OBJECT, offsetof(cxoQueue, conn), READONLY },
{ "deqoptions", T_OBJECT, offsetof(cxoQueue, deqOptions), READONLY },
{ "enqoptions", T_OBJECT, offsetof(cxoQueue, enqOptions), READONLY },
{ "name", T_OBJECT, offsetof(cxoQueue, name), READONLY },
{ "payload_type", T_OBJECT, offsetof(cxoQueue, payloadType), READONLY },
{ "deqOptions", T_OBJECT, offsetof(cxoQueue, deqOptions), READONLY }, { "deqOptions", T_OBJECT, offsetof(cxoQueue, deqOptions), READONLY },
{ "enqOptions", T_OBJECT, offsetof(cxoQueue, enqOptions), READONLY }, { "enqOptions", T_OBJECT, offsetof(cxoQueue, enqOptions), READONLY },
{ "name", T_OBJECT, offsetof(cxoQueue, name), READONLY },
{ "payloadType", T_OBJECT, offsetof(cxoQueue, payloadType), READONLY }, { "payloadType", T_OBJECT, offsetof(cxoQueue, payloadType), READONLY },
{ NULL } { NULL }
}; };

View File

@ -33,10 +33,10 @@ class TestCase(test_env.BaseTestCase):
def __deq_in_thread(self, results): def __deq_in_thread(self, results):
connection = test_env.get_connection(threaded=True) connection = test_env.get_connection(threaded=True)
queue = connection.queue(RAW_QUEUE_NAME) queue = connection.queue(RAW_QUEUE_NAME)
queue.deqOptions.wait = 10 queue.deqoptions.wait = 10
queue.deqOptions.navigation = oracledb.DEQ_FIRST_MSG queue.deqoptions.navigation = oracledb.DEQ_FIRST_MSG
while len(results) < len(RAW_PAYLOAD_DATA): while len(results) < len(RAW_PAYLOAD_DATA):
messages = queue.deqMany(5) messages = queue.deqmany(5)
if not messages: if not messages:
break break
for m in messages: for m in messages:
@ -45,9 +45,9 @@ class TestCase(test_env.BaseTestCase):
def __get_and_clear_raw_queue(self): def __get_and_clear_raw_queue(self):
queue = self.connection.queue(RAW_QUEUE_NAME) queue = self.connection.queue(RAW_QUEUE_NAME)
queue.deqOptions.wait = oracledb.DEQ_NO_WAIT queue.deqoptions.wait = oracledb.DEQ_NO_WAIT
queue.deqOptions.navigation = oracledb.DEQ_FIRST_MSG queue.deqoptions.navigation = oracledb.DEQ_FIRST_MSG
while queue.deqOne(): while queue.deqone():
pass pass
self.connection.commit() self.connection.commit()
return queue return queue
@ -57,8 +57,8 @@ class TestCase(test_env.BaseTestCase):
queue = self.__get_and_clear_raw_queue() queue = self.__get_and_clear_raw_queue()
messages = [self.connection.msgproperties(payload=d) \ messages = [self.connection.msgproperties(payload=d) \
for d in RAW_PAYLOAD_DATA] for d in RAW_PAYLOAD_DATA]
queue.enqMany(messages) queue.enqmany(messages)
messages = queue.deqMany(len(RAW_PAYLOAD_DATA)) messages = queue.deqmany(len(RAW_PAYLOAD_DATA))
data = [m.payload.decode(self.connection.encoding) for m in messages] data = [m.payload.decode(self.connection.encoding) for m in messages]
self.connection.commit() self.connection.commit()
self.assertEqual(data, RAW_PAYLOAD_DATA) self.assertEqual(data, RAW_PAYLOAD_DATA)
@ -66,7 +66,7 @@ class TestCase(test_env.BaseTestCase):
def test_2801_dequeue_empty(self): def test_2801_dequeue_empty(self):
"2801 - test empty bulk dequeue" "2801 - test empty bulk dequeue"
queue = self.__get_and_clear_raw_queue() queue = self.__get_and_clear_raw_queue()
messages = queue.deqMany(5) messages = queue.deqmany(5)
self.connection.commit() self.connection.commit()
self.assertEqual(messages, []) self.assertEqual(messages, [])
@ -78,8 +78,8 @@ class TestCase(test_env.BaseTestCase):
thread.start() thread.start()
messages = [self.connection.msgproperties(payload=d) \ messages = [self.connection.msgproperties(payload=d) \
for d in RAW_PAYLOAD_DATA] for d in RAW_PAYLOAD_DATA]
queue.enqOptions.visibility = oracledb.ENQ_IMMEDIATE queue.enqoptions.visibility = oracledb.ENQ_IMMEDIATE
queue.enqMany(messages) queue.enqmany(messages)
thread.join() thread.join()
self.assertEqual(results, RAW_PAYLOAD_DATA) self.assertEqual(results, RAW_PAYLOAD_DATA)
@ -91,11 +91,11 @@ class TestCase(test_env.BaseTestCase):
messages = [self.connection.msgproperties(payload=d) \ messages = [self.connection.msgproperties(payload=d) \
for d in data_to_enqueue[:num]] for d in data_to_enqueue[:num]]
data_to_enqueue = data_to_enqueue[num:] data_to_enqueue = data_to_enqueue[num:]
queue.enqMany(messages) queue.enqmany(messages)
self.connection.commit() self.connection.commit()
all_data = [] all_data = []
for num in (3, 5, 10): for num in (3, 5, 10):
messages = queue.deqMany(num) messages = queue.deqmany(num)
all_data.extend(m.payload.decode(self.connection.encoding) \ all_data.extend(m.payload.decode(self.connection.encoding) \
for m in messages) for m in messages)
self.connection.commit() self.connection.commit()
@ -106,29 +106,29 @@ class TestCase(test_env.BaseTestCase):
queue = self.__get_and_clear_raw_queue() queue = self.__get_and_clear_raw_queue()
# first test with ENQ_ON_COMMIT (commit required) # first test with ENQ_ON_COMMIT (commit required)
queue.enqOptions.visibility = oracledb.ENQ_ON_COMMIT queue.enqoptions.visibility = oracledb.ENQ_ON_COMMIT
props1 = self.connection.msgproperties(payload="A first message") props1 = self.connection.msgproperties(payload="A first message")
props2 = self.connection.msgproperties(payload="A second message") props2 = self.connection.msgproperties(payload="A second message")
queue.enqMany([props1, props2]) queue.enqmany([props1, props2])
other_connection = test_env.get_connection() other_connection = test_env.get_connection()
other_queue = other_connection.queue(RAW_QUEUE_NAME) other_queue = other_connection.queue(RAW_QUEUE_NAME)
other_queue.deqOptions.wait = oracledb.DEQ_NO_WAIT other_queue.deqoptions.wait = oracledb.DEQ_NO_WAIT
other_queue.deqOptions.visibility = oracledb.DEQ_ON_COMMIT other_queue.deqoptions.visibility = oracledb.DEQ_ON_COMMIT
messages = other_queue.deqMany(5) messages = other_queue.deqmany(5)
self.assertEqual(len(messages), 0) self.assertEqual(len(messages), 0)
self.connection.commit() self.connection.commit()
messages = other_queue.deqMany(5) messages = other_queue.deqmany(5)
self.assertEqual(len(messages), 2) self.assertEqual(len(messages), 2)
other_connection.rollback() other_connection.rollback()
# second test with ENQ_IMMEDIATE (no commit required) # second test with ENQ_IMMEDIATE (no commit required)
queue.enqOptions.visibility = oracledb.ENQ_IMMEDIATE queue.enqoptions.visibility = oracledb.ENQ_IMMEDIATE
other_queue.deqOptions.visibility = oracledb.DEQ_IMMEDIATE other_queue.deqoptions.visibility = oracledb.DEQ_IMMEDIATE
queue.enqMany([props1, props2]) queue.enqmany([props1, props2])
messages = other_queue.deqMany(5) messages = other_queue.deqmany(5)
self.assertEqual(len(messages), 4) self.assertEqual(len(messages), 4)
other_connection.rollback() other_connection.rollback()
messages = other_queue.deqMany(5) messages = other_queue.deqmany(5)
self.assertEqual(len(messages), 0) self.assertEqual(len(messages), 0)
if __name__ == "__main__": if __name__ == "__main__":