python-cx_Oracle/src/cxoModule.h

566 lines
16 KiB
C

//-----------------------------------------------------------------------------
// Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved.
//
// Licensed under BSD license (see LICENSE.txt).
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// cxoModule.h
// Include file for all cx_Oracle source files.
//-----------------------------------------------------------------------------
#define PY_SSIZE_T_CLEAN 1
#include <Python.h>
#include <structmember.h>
#include <time.h>
#include <dpi.h>
// define macros to get the build version as a string and the driver name
#define xstr(s) str(s)
#define str(s) #s
#define CXO_BUILD_VERSION_STRING xstr(CXO_BUILD_VERSION)
#define CXO_DRIVER_NAME "cx_Oracle : "CXO_BUILD_VERSION_STRING
// define macro for clearing buffers
#define cxoBuffer_clear(buf) Py_CLEAR((buf)->obj)
//-----------------------------------------------------------------------------
// Forward Declarations
//-----------------------------------------------------------------------------
typedef struct cxoApiType cxoApiType;
typedef struct cxoBuffer cxoBuffer;
typedef struct cxoConnection cxoConnection;
typedef struct cxoCursor cxoCursor;
typedef struct cxoDbType cxoDbType;
typedef struct cxoDeqOptions cxoDeqOptions;
typedef struct cxoEnqOptions cxoEnqOptions;
typedef struct cxoError cxoError;
typedef struct cxoFuture cxoFuture;
typedef struct cxoLob cxoLob;
typedef struct cxoMessage cxoMessage;
typedef struct cxoMessageQuery cxoMessageQuery;
typedef struct cxoMessageRow cxoMessageRow;
typedef struct cxoMessageTable cxoMessageTable;
typedef struct cxoMsgProps cxoMsgProps;
typedef struct cxoObject cxoObject;
typedef struct cxoObjectAttr cxoObjectAttr;
typedef struct cxoObjectType cxoObjectType;
typedef struct cxoQueue cxoQueue;
typedef struct cxoSessionPool cxoSessionPool;
typedef struct cxoSodaCollection cxoSodaCollection;
typedef struct cxoSodaDatabase cxoSodaDatabase;
typedef struct cxoSodaDoc cxoSodaDoc;
typedef struct cxoSodaDocCursor cxoSodaDocCursor;
typedef struct cxoSodaOperation cxoSodaOperation;
typedef struct cxoSubscr cxoSubscr;
typedef struct cxoVar cxoVar;
//-----------------------------------------------------------------------------
// Globals
//-----------------------------------------------------------------------------
// exception objects
extern PyObject *cxoWarningException;
extern PyObject *cxoErrorException;
extern PyObject *cxoInterfaceErrorException;
extern PyObject *cxoDatabaseErrorException;
extern PyObject *cxoDataErrorException;
extern PyObject *cxoOperationalErrorException;
extern PyObject *cxoIntegrityErrorException;
extern PyObject *cxoInternalErrorException;
extern PyObject *cxoProgrammingErrorException;
extern PyObject *cxoNotSupportedErrorException;
// type objects
extern PyTypeObject cxoPyTypeApiType;
extern PyTypeObject cxoPyTypeConnection;
extern PyTypeObject cxoPyTypeCursor;
extern PyTypeObject cxoPyTypeDbType;
extern PyTypeObject cxoPyTypeDeqOptions;
extern PyTypeObject cxoPyTypeEnqOptions;
extern PyTypeObject cxoPyTypeError;
extern PyTypeObject cxoPyTypeFuture;
extern PyTypeObject cxoPyTypeLob;
extern PyTypeObject cxoPyTypeMsgProps;
extern PyTypeObject cxoPyTypeMessage;
extern PyTypeObject cxoPyTypeMessageQuery;
extern PyTypeObject cxoPyTypeMessageRow;
extern PyTypeObject cxoPyTypeMessageTable;
extern PyTypeObject cxoPyTypeObject;
extern PyTypeObject cxoPyTypeObjectAttr;
extern PyTypeObject cxoPyTypeObjectType;
extern PyTypeObject cxoPyTypeQueue;
extern PyTypeObject cxoPyTypeSessionPool;
extern PyTypeObject cxoPyTypeSodaCollection;
extern PyTypeObject cxoPyTypeSodaDatabase;
extern PyTypeObject cxoPyTypeSodaDoc;
extern PyTypeObject cxoPyTypeSodaDocCursor;
extern PyTypeObject cxoPyTypeSodaOperation;
extern PyTypeObject cxoPyTypeSubscr;
extern PyTypeObject cxoPyTypeVar;
// datetime types
extern PyTypeObject *cxoPyTypeDate;
extern PyTypeObject *cxoPyTypeDateTime;
// database types
extern cxoDbType *cxoDbTypeBfile;
extern cxoDbType *cxoDbTypeBinaryDouble;
extern cxoDbType *cxoDbTypeBinaryFloat;
extern cxoDbType *cxoDbTypeBinaryInteger;
extern cxoDbType *cxoDbTypeBlob;
extern cxoDbType *cxoDbTypeBoolean;
extern cxoDbType *cxoDbTypeChar;
extern cxoDbType *cxoDbTypeClob;
extern cxoDbType *cxoDbTypeCursor;
extern cxoDbType *cxoDbTypeDate;
extern cxoDbType *cxoDbTypeIntervalDS;
extern cxoDbType *cxoDbTypeIntervalYM;
extern cxoDbType *cxoDbTypeLong;
extern cxoDbType *cxoDbTypeLongRaw;
extern cxoDbType *cxoDbTypeNchar;
extern cxoDbType *cxoDbTypeNclob;
extern cxoDbType *cxoDbTypeNumber;
extern cxoDbType *cxoDbTypeNvarchar;
extern cxoDbType *cxoDbTypeObject;
extern cxoDbType *cxoDbTypeRaw;
extern cxoDbType *cxoDbTypeRowid;
extern cxoDbType *cxoDbTypeTimestamp;
extern cxoDbType *cxoDbTypeTimestampLTZ;
extern cxoDbType *cxoDbTypeTimestampTZ;
extern cxoDbType *cxoDbTypeVarchar;
// database API types
extern cxoApiType *cxoApiTypeBinary;
extern cxoApiType *cxoApiTypeDatetime;
extern cxoApiType *cxoApiTypeNumber;
extern cxoApiType *cxoApiTypeRowid;
extern cxoApiType *cxoApiTypeString;
// JSON dump and load functions for use with SODA
extern PyObject *cxoJsonDumpFunction;
extern PyObject *cxoJsonLoadFunction;
// ODPI-C context and version information
extern dpiContext *cxoDpiContext;
extern dpiVersionInfo cxoClientVersionInfo;
// future object
extern cxoFuture *cxoFutureObj;
//-----------------------------------------------------------------------------
// Transforms
//-----------------------------------------------------------------------------
typedef enum {
CXO_TRANSFORM_NONE = 0,
CXO_TRANSFORM_BINARY,
CXO_TRANSFORM_BFILE,
CXO_TRANSFORM_BLOB,
CXO_TRANSFORM_BOOLEAN,
CXO_TRANSFORM_CLOB,
CXO_TRANSFORM_CURSOR,
CXO_TRANSFORM_DATE,
CXO_TRANSFORM_DATETIME,
CXO_TRANSFORM_DECIMAL,
CXO_TRANSFORM_FIXED_CHAR,
CXO_TRANSFORM_FIXED_NCHAR,
CXO_TRANSFORM_FLOAT,
CXO_TRANSFORM_INT,
CXO_TRANSFORM_LONG_BINARY,
CXO_TRANSFORM_LONG_STRING,
CXO_TRANSFORM_NATIVE_DOUBLE,
CXO_TRANSFORM_NATIVE_FLOAT,
CXO_TRANSFORM_NATIVE_INT,
CXO_TRANSFORM_NCLOB,
CXO_TRANSFORM_NSTRING,
CXO_TRANSFORM_OBJECT,
CXO_TRANSFORM_ROWID,
CXO_TRANSFORM_STRING,
CXO_TRANSFORM_TIMEDELTA,
CXO_TRANSFORM_TIMESTAMP,
CXO_TRANSFORM_TIMESTAMP_LTZ,
CXO_TRANSFORM_TIMESTAMP_TZ,
CXO_TRANSFORM_UNSUPPORTED
} cxoTransformNum;
//-----------------------------------------------------------------------------
// Structures
//-----------------------------------------------------------------------------
struct cxoApiType {
PyObject_HEAD
const char *name;
PyObject *dbTypes;
cxoTransformNum defaultTransformNum;
};
struct cxoBuffer {
const char *ptr;
uint32_t numCharacters;
uint32_t size;
PyObject *obj;
};
struct cxoError {
PyObject_HEAD
long code;
unsigned offset;
PyObject *message;
PyObject *context;
char isRecoverable;
};
struct cxoConnection {
PyObject_HEAD
dpiConn *handle;
cxoSessionPool *sessionPool;
PyObject *inputTypeHandler;
PyObject *outputTypeHandler;
PyObject *username;
PyObject *dsn;
PyObject *version;
PyObject *tag;
dpiEncodingInfo encodingInfo;
int autocommit;
};
struct cxoCursor {
PyObject_HEAD
dpiStmt *handle;
dpiStmtInfo stmtInfo;
cxoConnection *connection;
PyObject *statement;
PyObject *statementTag;
PyObject *bindVariables;
PyObject *fetchVariables;
PyObject *rowFactory;
PyObject *inputTypeHandler;
PyObject *outputTypeHandler;
uint32_t arraySize;
uint32_t bindArraySize;
uint32_t fetchArraySize;
int setInputSizes;
uint64_t rowCount;
uint32_t fetchBufferRowIndex;
uint32_t numRowsInFetchBuffer;
int moreRowsToFetch;
char isScrollable;
int fixupRefCursor;
int isOpen;
};
struct cxoDbType {
PyObject_HEAD
uint32_t num;
const char *name;
cxoTransformNum defaultTransformNum;
};
struct cxoDeqOptions {
PyObject_HEAD
dpiDeqOptions *handle;
const char *encoding;
};
struct cxoEnqOptions {
PyObject_HEAD
dpiEnqOptions *handle;
const char *encoding;
};
struct cxoFuture {
PyObject_HEAD
};
struct cxoLob {
PyObject_HEAD
cxoConnection *connection;
cxoDbType *dbType;
dpiLob *handle;
};
struct cxoMessage {
PyObject_HEAD
cxoSubscr *subscription;
dpiEventType type;
PyObject *dbname;
PyObject *txId;
PyObject *tables;
PyObject *queries;
PyObject *queueName;
PyObject *consumerName;
int registered;
};
struct cxoMessageQuery {
PyObject_HEAD
uint64_t id;
dpiOpCode operation;
PyObject *tables;
};
struct cxoMessageRow {
PyObject_HEAD
PyObject *rowid;
dpiOpCode operation;
};
struct cxoMessageTable {
PyObject_HEAD
PyObject *name;
PyObject *rows;
dpiOpCode operation;
};
struct cxoMsgProps {
PyObject_HEAD
dpiMsgProps *handle;
PyObject *payload;
const char *encoding;
};
struct cxoObject {
PyObject_HEAD
cxoObjectType *objectType;
dpiObject *handle;
};
struct cxoObjectAttr {
PyObject_HEAD
PyObject *name;
dpiObjectAttr *handle;
dpiOracleTypeNum oracleTypeNum;
cxoTransformNum transformNum;
cxoObjectType *objectType;
cxoDbType *dbType;
};
struct cxoObjectType {
PyObject_HEAD
dpiObjectType *handle;
PyObject *schema;
PyObject *name;
PyObject *attributes;
PyObject *attributesByName;
cxoConnection *connection;
dpiOracleTypeNum elementOracleTypeNum;
cxoTransformNum elementTransformNum;
cxoObjectType *elementObjectType;
cxoDbType *elementDbType;
char isCollection;
};
struct cxoQueue {
PyObject_HEAD
cxoConnection *conn;
dpiQueue *handle;
PyObject *name;
PyObject *deqOptions;
PyObject *enqOptions;
cxoObjectType *payloadType;
};
struct cxoSessionPool {
PyObject_HEAD
dpiPool *handle;
uint32_t minSessions;
uint32_t maxSessions;
uint32_t sessionIncrement;
uint32_t cacheSize;
dpiEncodingInfo encodingInfo;
int homogeneous;
int externalAuth;
PyObject *username;
PyObject *dsn;
PyObject *name;
PyObject *sessionCallback;
PyTypeObject *connectionType;
};
struct cxoSodaCollection {
PyObject_HEAD
dpiSodaColl *handle;
cxoSodaDatabase *db;
PyObject *name;
};
struct cxoSodaDatabase {
PyObject_HEAD
dpiSodaDb *handle;
cxoConnection *connection;
};
struct cxoSodaDoc {
PyObject_HEAD
cxoSodaDatabase *db;
dpiSodaDoc *handle;
};
struct cxoSodaDocCursor {
PyObject_HEAD
cxoSodaDatabase *db;
dpiSodaDocCursor *handle;
};
struct cxoSodaOperation {
PyObject_HEAD
cxoSodaCollection *coll;
dpiSodaOperOptions options;
uint32_t numKeyBuffers;
cxoBuffer *keyBuffers;
cxoBuffer keyBuffer;
cxoBuffer versionBuffer;
cxoBuffer filterBuffer;
};
struct cxoSubscr {
PyObject_HEAD
dpiSubscr *handle;
cxoConnection *connection;
PyObject *callback;
uint32_t namespace;
PyObject *name;
uint32_t protocol;
PyObject *ipAddress;
uint32_t port;
uint32_t timeout;
uint32_t operations;
uint32_t qos;
uint8_t groupingClass;
uint32_t groupingValue;
uint8_t groupingType;
uint64_t id;
};
struct cxoVar {
PyObject_HEAD
dpiVar *handle;
dpiData *data;
cxoConnection *connection;
PyObject *inConverter;
PyObject *outConverter;
cxoObjectType *objectType;
const char *encodingErrors;
uint32_t allocatedElements;
uint32_t size;
uint32_t bufferSize;
int isArray;
int isValueSet;
int getReturnedData;
cxoTransformNum transformNum;
dpiNativeTypeNum nativeTypeNum;
cxoDbType *dbType;
};
//-----------------------------------------------------------------------------
// Functions
//-----------------------------------------------------------------------------
int cxoBuffer_fromObject(cxoBuffer *buf, PyObject *obj, const char *encoding);
int cxoBuffer_init(cxoBuffer *buf);
int cxoConnection_getSodaFlags(cxoConnection *conn, uint32_t *flags);
int cxoConnection_isConnected(cxoConnection *conn);
int cxoCursor_performBind(cxoCursor *cursor);
int cxoCursor_setBindVariables(cxoCursor *cursor, PyObject *parameters,
unsigned numElements, unsigned arrayPos, int deferTypeAssignment);
cxoDbType *cxoDbType_fromDataTypeInfo(dpiDataTypeInfo *info);
cxoDbType *cxoDbType_fromTransformNum(cxoTransformNum transformNum);
cxoDeqOptions *cxoDeqOptions_new(cxoConnection *connection,
dpiDeqOptions *handle);
cxoEnqOptions *cxoEnqOptions_new(cxoConnection *connection,
dpiEnqOptions *handle);
cxoError *cxoError_newFromInfo(dpiErrorInfo *errorInfo);
int cxoError_raiseAndReturnInt(void);
PyObject *cxoError_raiseAndReturnNull(void);
int cxoError_raiseFromInfo(dpiErrorInfo *errorInfo);
PyObject *cxoError_raiseFromString(PyObject *exceptionType,
const char *message);
PyObject *cxoLob_new(cxoConnection *connection, cxoDbType *dbType,
dpiLob *handle);
cxoMsgProps *cxoMsgProps_new(cxoConnection*, dpiMsgProps *handle);
int cxoObject_internalExtend(cxoObject *obj, PyObject *sequence);
PyObject *cxoObject_new(cxoObjectType *objectType, dpiObject *handle);
cxoObjectAttr *cxoObjectAttr_new(cxoConnection *connection,
dpiObjectAttr *handle);
cxoObjectType *cxoObjectType_new(cxoConnection *connection,
dpiObjectType *handle);
cxoObjectType *cxoObjectType_newByName(cxoConnection *connection,
PyObject *name);
cxoQueue *cxoQueue_new(cxoConnection *conn, dpiQueue *handle);
cxoSodaCollection *cxoSodaCollection_new(cxoSodaDatabase *db,
dpiSodaColl *handle);
cxoSodaDatabase *cxoSodaDatabase_new(cxoConnection *connection);
cxoSodaDoc *cxoSodaDoc_new(cxoSodaDatabase *db, dpiSodaDoc *handle);
cxoSodaDocCursor *cxoSodaDocCursor_new(cxoSodaDatabase *db,
dpiSodaDocCursor *handle);
cxoSodaOperation *cxoSodaOperation_new(cxoSodaCollection *collection);
void cxoSubscr_callback(cxoSubscr *subscr, dpiSubscrMessage *message);
PyObject *cxoTransform_dateFromTicks(PyObject *args);
int cxoTransform_fromPython(cxoTransformNum transformNum,
dpiNativeTypeNum *nativeTypeNum, PyObject *pyValue,
dpiDataBuffer *dbValue, cxoBuffer *buffer, const char *encoding,
const char *nencoding, cxoVar *var, uint32_t arrayPos);
uint32_t cxoTransform_getDefaultSize(cxoTransformNum transformNum);
cxoTransformNum cxoTransform_getNumFromDataTypeInfo(dpiDataTypeInfo *info);
cxoTransformNum cxoTransform_getNumFromPythonValue(PyObject *value,
int plsql);
int cxoTransform_getNumFromType(PyObject *type, cxoTransformNum *transformNum,
cxoObjectType **objType);
int cxoTransform_getNumFromValue(PyObject *value, int *isArray,
Py_ssize_t *size, Py_ssize_t *numElements, int plsql,
cxoTransformNum *transformNum);
void cxoTransform_getTypeInfo(cxoTransformNum transformNum,
dpiOracleTypeNum *oracleTypeNum, dpiNativeTypeNum *nativeTypeNum);
int cxoTransform_init(void);
PyObject *cxoTransform_timestampFromTicks(PyObject *args);
PyObject *cxoTransform_toPython(cxoTransformNum transformNum,
cxoConnection *connection, cxoObjectType *objType,
dpiDataBuffer *dbValue, const char *encodingErrors);
PyObject *cxoUtils_formatString(const char *format, PyObject *args);
const char *cxoUtils_getAdjustedEncoding(const char *encoding);
int cxoUtils_getBooleanValue(PyObject *obj, int defaultValue, int *value);
int cxoUtils_getModuleAndName(PyTypeObject *type, PyObject **module,
PyObject **name);
int cxoUtils_initializeDPI(void);
int cxoUtils_processJsonArg(PyObject *arg, cxoBuffer *buffer);
int cxoUtils_processSodaDocArg(cxoSodaDatabase *db, PyObject *arg,
dpiSodaDoc **handle);
int cxoVar_bind(cxoVar *var, cxoCursor *cursor, PyObject *name, uint32_t pos);
int cxoVar_check(PyObject *object);
PyObject *cxoVar_getSingleValue(cxoVar *var, dpiData *data, uint32_t arrayPos);
PyObject *cxoVar_getValue(cxoVar *var, uint32_t arrayPos);
cxoVar *cxoVar_new(cxoCursor *cursor, Py_ssize_t numElements,
cxoTransformNum transformNum, Py_ssize_t size, int isArray,
cxoObjectType *objType);
cxoVar *cxoVar_newByType(cxoCursor *cursor, PyObject *value,
uint32_t numElements);
cxoVar *cxoVar_newByValue(cxoCursor *cursor, PyObject *value,
Py_ssize_t numElements);
int cxoVar_setValue(cxoVar *var, uint32_t arrayPos, PyObject *value);