[Liblas-commits] hg: update with latest OCI wrapper code from libPC

liblas-commits at liblas.org liblas-commits at liblas.org
Mon Apr 4 12:21:14 EDT 2011


details:   http://hg.liblas.orghg/rev/2054d13b8d5a
changeset: 2916:2054d13b8d5a
user:      Howard Butler <hobu.inc at gmail.com>
date:      Mon Apr 04 11:21:08 2011 -0500
description:
update with latest OCI wrapper code from libPC

diffstat:

 apps/oci_wrapper.cpp |  564 +++++++++++++++++++++++++++++++++++++++++++-------
 apps/oci_wrapper.h   |   64 +++++-
 2 files changed, 537 insertions(+), 91 deletions(-)

diffs (truncated from 848 to 300 lines):

diff -r 04fbf3a53472 -r 2054d13b8d5a apps/oci_wrapper.cpp
--- a/apps/oci_wrapper.cpp	Mon Apr 04 10:03:46 2011 -0500
+++ b/apps/oci_wrapper.cpp	Mon Apr 04 11:21:08 2011 -0500
@@ -30,6 +30,8 @@
 
 #include "oci_wrapper.h"
 
+#include <iostream>
+
 static const OW_CellDepth ahOW_CellDepth[] = {
     {"8BIT_U",          GDT_Byte},
     {"16BIT_U",         GDT_UInt16},
@@ -148,7 +150,7 @@
     }
 
     if( CheckError( OCIAttrSet((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION,
-        (dvoid *) pszUserId, (ub4) strlen((char *) pszUserId),
+        (dvoid *) pszUserId, (ub4) strlen( pszUserId),
         (ub4) OCI_ATTR_USERNAME, hError), hError ) )
     {
         return;
@@ -223,12 +225,17 @@
         (size_t) 0,
         (dvoid**) NULL ), hError );
 
-    hNumArrayTDO    = DescribeType( (char*) SDO_NUMBER_ARRAY );
-    hGeometryTDO    = DescribeType( (char*) SDO_GEOMETRY );
-    hGeoRasterTDO   = DescribeType( (char*) SDO_GEORASTER );
-    hPCTDO          = DescribeType( (char*) SDO_PC );
-    hElemArrayTDO   = DescribeType( (char*) SDO_ELEM_INFO_ARRAY);
-    hOrdnArrayTDO   = DescribeType( (char* ) SDO_ORDINATE_ARRAY);
+    hNumArrayTDO    = DescribeType( SDO_NUMBER_ARRAY );
+    hGeometryTDO    = DescribeType( SDO_GEOMETRY );
+    hGeoRasterTDO   = DescribeType( SDO_GEORASTER );
+    hElemArrayTDO   = DescribeType( SDO_ELEM_INFO_ARRAY);
+    hOrdnArrayTDO   = DescribeType( SDO_ORDINATE_ARRAY);
+
+    if( nVersion > 10 )
+    {
+        hPCTDO      = DescribeType( SDO_PC );
+        hPC_BLK_TDO = DescribeType( SDO_PC_BLK );
+    }
 }
 
 OWConnection::~OWConnection()
@@ -252,16 +259,9 @@
 
     if( hSession )
         OCIHandleFree((dvoid *) hSession, (ub4) OCI_HTYPE_SESSION);
-    
-    if (pszUser)
-        CPLFree(pszUser);
-    if (pszPassword)
-        CPLFree(pszPassword);
-    if (pszServer)
-        CPLFree(pszServer);
 }
 
-OCIType* OWConnection::DescribeType( char *pszTypeName )
+OCIType* OWConnection::DescribeType( const char *pszTypeName )
 {
     OCIParam* hParam    = NULL;
     OCIRef*   hRef      = NULL;
@@ -329,6 +329,53 @@
         (ub2) 0), NULL );
 }
 
+void OWConnection::CreateType( sdo_pc** pphData )
+{
+    CheckError( OCIObjectNew(
+        hEnv,
+        hError,
+        hSvcCtx,
+        OCI_TYPECODE_OBJECT,
+        hPCTDO,
+        (dvoid *) 0,
+        OCI_DURATION_CALL,
+        TRUE,
+        (dvoid **) pphData), hError );
+}
+
+void OWConnection::DestroyType( sdo_pc** pphData )
+{
+    CheckError( OCIObjectFree(
+        hEnv,
+        hError,
+        (dvoid*) *pphData,
+        (ub2) 0), NULL );
+}
+
+void OWConnection::CreateType( sdo_orgscl_type** pphData )
+{
+    CheckError( OCIObjectNew(
+        hEnv,
+        hError,
+        hSvcCtx,
+        OCI_TYPECODE_OBJECT,
+        hPCTDO,
+        (dvoid *) 0,
+        OCI_DURATION_CALL,
+        TRUE,
+        (dvoid **) pphData), hError );
+}
+
+void OWConnection::DestroyType( sdo_orgscl_type** pphData )
+{
+    CheckError( OCIObjectFree(
+        hEnv,
+        hError,
+        (dvoid*) *pphData,
+        (ub2) 0), NULL );
+}
+
+
 void OWConnection::CreateType( OCIArray** phData, OCIType* otype)
 {
     CheckError( OCIObjectNew(   hEnv,
@@ -565,7 +612,7 @@
 
     if( nStmtType != OCI_STMT_SELECT )
     {
-        nStmtMode = OCI_DEFAULT;// OCI_COMMIT_ON_SUCCESS; //?? Transaction ??//
+        nStmtMode = OCI_DEFAULT;
     }
 
     CPLDebug("PL/SQL","\n%s\n", pszStatement);
@@ -626,6 +673,164 @@
     return true;
 }
 
+
+bool OWStatement::GetNextField(
+                                 int nIndex,
+                                 char* pszName,
+                                 int* pnType,
+                                 int* pnSize,
+                                 int* pnPrecision,
+                                 signed short* pnScale ,
+                                 char* pszTypeName)
+{
+    OCIParam* hParmDesc = NULL;
+
+    sword nStatus = 0;
+
+    nStatus = OCIParamGet(
+        hStmt,
+        (ub4) OCI_HTYPE_STMT,
+        hError,
+        (dvoid**) &hParmDesc,   //Warning
+        (ub4) nIndex + 1 );
+
+    if( nStatus != OCI_SUCCESS )
+    {
+        return false;
+    }
+
+    char* pszFieldName = NULL;
+    ub4 nNameLength = 0;
+
+    CheckError( OCIAttrGet(
+        hParmDesc,
+        (ub4) OCI_DTYPE_PARAM,
+        (dvoid*) &pszFieldName,
+        (ub4*) &nNameLength,
+        (ub4) OCI_ATTR_NAME,
+        hError ), hError );
+
+    ub2 nOCIType = 0;
+
+    CheckError( OCIAttrGet(
+        hParmDesc,
+        (ub4) OCI_DTYPE_PARAM,
+        (dvoid*) &nOCIType,
+        (ub4*) NULL,
+        (ub4) OCI_ATTR_DATA_TYPE,
+        hError ), hError );
+
+    ub2 nOCILen = 0;
+
+    CheckError( OCIAttrGet(
+        hParmDesc,
+        (ub4) OCI_DTYPE_PARAM,
+        (dvoid*) &nOCILen,
+        (ub4*) NULL,
+        (ub4) OCI_ATTR_DATA_SIZE,
+        hError ), hError );
+
+    unsigned short nOCIPrecision = 0;
+    sb1 nOCIScale = 0;
+
+    if( nOCIType == SQLT_NUM )
+    {
+        CheckError( OCIAttrGet(
+            hParmDesc,
+            (ub4) OCI_DTYPE_PARAM,
+            (dvoid*) &nOCIPrecision,
+            (ub4*) 0,
+            (ub4) OCI_ATTR_PRECISION,
+            hError ), hError );
+
+        CheckError( OCIAttrGet(
+            hParmDesc,
+            (ub4) OCI_DTYPE_PARAM,
+            (dvoid*) &nOCIScale,
+            (ub4*) 0,
+            (ub4) OCI_ATTR_SCALE,
+            hError ), hError );
+
+        if( nOCIPrecision > 255 ) // Lesson learned from ogrocisession.cpp
+        {
+            nOCIPrecision = nOCIPrecision / 256;
+        }
+    }
+
+    if (nOCIType == SQLT_NTY)
+    {
+        OCIRef* type_ref;
+
+        OCIParam* typeParam = NULL;
+    
+        CheckError( OCIAttrGet(
+            hParmDesc,
+            (ub4) OCI_DTYPE_PARAM,
+            (dvoid*) &type_ref,
+            (ub4*) NULL,
+            (ub4) OCI_ATTR_REF_TDO,
+            hError ), hError );
+
+        CheckError( OCIDescribeAny(
+            poConnection->hSvcCtx,
+            hError,
+            (dvoid*) type_ref,
+            0,
+            (ub1) OCI_OTYPE_REF,
+            (ub1) OCI_DEFAULT,
+            (ub1) OCI_PTYPE_TYPE,
+            poConnection->hDescribe ), hError );
+
+        CheckError( OCIAttrGet(
+            poConnection->hDescribe,
+            (ub4) OCI_HTYPE_DESCRIBE,
+            (dvoid*) &typeParam,
+            (ub4*) 0,
+            (ub4) OCI_ATTR_PARAM,
+            hError ), hError );
+        
+        text* pszFieldTypeName = NULL;
+        ub4 nFieldTypeNameSize = 0;
+                
+        CheckError( OCIAttrGet(
+            typeParam,
+            (ub4) OCI_DTYPE_PARAM,
+            (dvoid*) &pszFieldTypeName,
+            (ub4*) &nFieldTypeNameSize,
+            (ub4) OCI_ATTR_SCHEMA_NAME,
+            hError ), hError );
+
+        // Get Type's name and set it to pszFieldTypeName
+        CheckError( OCIAttrGet(
+            typeParam,
+            (ub4) OCI_DTYPE_PARAM,
+            (dvoid*) &pszFieldTypeName,
+            (ub4*) &nFieldTypeNameSize,
+            (ub4) OCI_ATTR_NAME,
+            hError ), hError );
+
+        nFieldTypeNameSize = MIN(nFieldTypeNameSize, OWNAME);
+        strncpy( pszTypeName, (char*)pszFieldTypeName, nFieldTypeNameSize);
+        pszTypeName[nFieldTypeNameSize] = '\0';
+
+    }
+      
+    nNameLength = MIN( nNameLength, OWNAME );
+
+
+    strncpy( pszName, pszFieldName, nNameLength);
+    pszName[nNameLength] = '\0';
+
+
+    *pnType      = (int) nOCIType;
+    *pnSize      = (int) nOCILen;
+    *pnPrecision = (int) nOCIPrecision;
+    *pnScale     = (signed short) nOCIScale;
+
+    return true;
+
+}
+
 void OWStatement::Bind( int* pnData )
 {
     OCIBind* hBind = NULL;
@@ -695,6 +900,29 @@
         hError );
 }
 
+void OWStatement::Bind( char* pData, long nData )
+{
+    OCIBind* hBind = NULL;
+
+    nNextBnd++;


More information about the Liblas-commits mailing list