[prev in list] [next in list] [prev in thread] [next in thread]
List: fdo-commits
Subject: [fdo-commits] r7070 - in branches/3.9/Providers/KingOracle/src: Provider UnitTest
From: svn_fdo () osgeo ! org
Date: 2014-04-10 23:05:42
Message-ID: 20140410230543.D179F390276 () trac ! osgeo ! org
[Download RAW message or body]
Author: gregboone
Date: 2014-04-10 16:05:42 -0700 (Thu, 10 Apr 2014)
New Revision: 7070
Added:
branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.cpp
branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.h
branches/3.9/Providers/KingOracle/src/UnitTest/copy_debug_unittest.bat
Modified:
branches/3.9/Providers/KingOracle/src/Provider/Makefile.am
branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API2.cpp
Log:
Ticket #887: Update KingOracle for FDO 3.9.0
Modified: branches/3.9/Providers/KingOracle/src/Provider/Makefile.am
===================================================================
--- branches/3.9/Providers/KingOracle/src/Provider/Makefile.am 2014-04-10 22:44:16 \
UTC (rev 7069)
+++ branches/3.9/Providers/KingOracle/src/Provider/Makefile.am 2014-04-10 23:05:42 \
UTC (rev 7070) @@ -22,6 +22,7 @@
noinst_LTLIBRARIES = libKingOracleProviderSrc.la
libKingOracleProviderSrc_la_SOURCES = \
+c_FdoOra_API3.cpp \
c_FdoOra_API2.cpp \
c_KgOraRasterCapabilities.cpp \
c_FgfToSdoGeom.cpp \
Modified: branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API2.cpp
===================================================================
--- branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API2.cpp 2014-04-10 \
22:44:16 UTC (rev 7069)
+++ branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API2.cpp 2014-04-10 \
23:05:42 UTC (rev 7070) @@ -31,6 +31,7 @@
//#define D_TEST_SHEMASPEED
+#ifdef _WIN32
class c_Timer
{
public:
@@ -55,9 +56,9 @@
protected:
LARGE_INTEGER frequency;LARGE_INTEGER t1,t2;double elapsedtime;
};
+#endif
-
c_FdoOra_API2::c_FdoOra_API2(void)
{
}
@@ -1634,12 +1635,15 @@
- #ifdef _DEBUG
+#ifdef _WIN32
+#ifdef _DEBUG
+
c_Timer time_full;
time_full.Start();
- #endif
+
+#endif
+#endif
-
while( stm->ReadNext() )
{
rec_count++;
@@ -2071,30 +2075,40 @@
// catch erro returned
bool table_exists=false;
+#ifdef _WIN32
+#ifdef _DEBUG
- #ifdef _DEBUG
c_Timer time_columns;
time_columns.Start();
- #endif
+
+#endif
+#endif
-
table_exists = \
DescribeTableProperties(OciConn,ora_tableowner.c_str(),ora_tablename.c_str(),pdc,SC_Collection);
-
- #ifdef _DEBUG
+#ifdef _WIN32
+#ifdef _DEBUG
+
time_total_columns += time_columns.Stop();
- #endif
+
+#endif
+#endif
////////////////////////////////////////////////////////////////////////////////////////////
// Check for primary keys
//////////////////////////////////////////////////////////////////////////////////////////// \
std::vector<std::wstring> pcols;
- #ifdef _DEBUG
+
+#ifdef _WIN32
+#ifdef _DEBUG
+
c_Timer time_pkeys;
time_pkeys.Start();
- #endif
+#endif
+#endif
+
// ckeck for user defined column for identity
// if defined use it - if not look for primary keys on table
if( override_identity.length() > 0 )
@@ -2144,9 +2158,15 @@
}
}
}
- #ifdef _DEBUG
+
+#ifdef _WIN32
+#ifdef _DEBUG
+
time_total_pkeys += time_pkeys.Stop();
- #endif
+
+#endif
+#endif
+
////////////////////////////////////////////////////////////////////////////////////////////
// Set Oracle Sequence
//////////////////////////////////////////////////////////////////////////////////////////// \
@@ -2183,11 +2203,15 @@
}
- #ifdef _DEBUG
- time_full.Stop();
- printf(" Describe: %.4lf (cols: %.4lf , pkeys: %.2lf) \
",time_full.GetElapsedTime(),time_total_columns,time_total_pkeys);
- #endif
+#ifdef _WIN32
+#ifdef _DEBUG
+ time_full.Stop();
+ printf(" Describe: %.4lf (cols: %.4lf , pkeys: %.2lf) \
",time_full.GetElapsedTime(),time_total_columns,time_total_pkeys); +
+#endif
+#endif
+
class_count = FdoClasses->GetCount();
OciConn->TerminateStatement(stm);
Added: branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.cpp
===================================================================
--- branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.cpp \
(rev 0)
+++ branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.cpp 2014-04-10 \
23:05:42 UTC (rev 7070) @@ -0,0 +1,3336 @@
+/*
+* Copyright (C) 2009 SL-King d.o.o
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of version 2.1 of the GNU Lesser
+* General Public License as published by the Free Software Foundation.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+#include "stdafx.h"
+#include "c_OCI_API.h"
+//#include "c_Ora_API2.h"
+#include "KingOracle/FdoKgOraOverrides.h"
+#include "c_KgOraSridDesc.h"
+#include "c_KgOraSpatialContext.h"
+#include "c_KgOraSchemaDesc.h"
+#include "c_FdoOra_API3.h"
+#include "c_Ora_API2.h"
+#include "KgOraProvider.h"
+
+
+#define D_CLASSNAME_DELIMITER L"~"
+//#define D_CLASSNAME_DELIMITER L"_"
+
+//#define D_TEST_SHEMASPEED
+
+#ifdef _WIN32
+class c_Timer
+{
+ public:
+ c_Timer()
+ {
+ elapsedtime=0;
+ QueryPerformanceFrequency(&frequency);
+ }
+ void Start()
+ {
+ QueryPerformanceCounter(&t1);
+ }
+ double Stop()
+ {
+ QueryPerformanceCounter(&t2);elapsedtime=(double)(t2.QuadPart-t1.QuadPart)/frequency.QuadPart;
+ return elapsedtime;
+ }
+ double GetElapsedTime()
+ {
+ return elapsedtime;
+ }
+ protected:
+ LARGE_INTEGER frequency;LARGE_INTEGER t1,t2;double elapsedtime;
+};
+#endif
+
+
+class c_MapOraNameToFdoClass
+{
+public:
+ struct s_data
+ {
+ s_data(const std::wstring& OraOwner,const std::wstring& OraTable,const \
std::wstring& OraGeomColumn,const std::wstring& OverFdoClassName + \
,FdoClassDefinition* ClassDef,FdoKgOraClassDefinition* KgOraClassDef,const \
std::vector<std::wstring>& OverridePrimaryColumns + ,const std::wstring& \
spatialowner,const std::wstring& spatialtable // used to connect to \
xxx_sdo_geom_metada to read srid + )
+ {
+ keyname=OraOwner;
+ keyname.append(OraTable);
+ keyname.append(OraGeomColumn);
+ keyname.append(OverFdoClassName);
+
+ fdoclass=ClassDef;kgoraclass=KgOraClassDef;
+ overprimary = OverridePrimaryColumns;
+
+ spatial_owner = spatialowner;
+ spatial_table = spatialtable;
+ }
+ std::wstring keyname;
+ FdoClassDefinition* fdoclass; // no ref count
+ FdoKgOraClassDefinition* kgoraclass; // no ref count
+
+ std::vector<std::wstring> overprimary; // this one if set from meta view; \
applyied t to class +
+ std::vector<std::wstring> primarycolumns; // her areread from sql; colect them \
together; and after finish reading apply to class +
+ std::wstring spatial_owner; // used to connect to xxx_sdo_geom_metada to read \
srid + std::wstring spatial_table;
+ };
+
+public:
+ c_MapOraNameToFdoClass()
+ {
+ m_LastFound=NULL;
+ }
+public:
+ s_data* FindClassDef(const std::wstring& OraOwner,const std::wstring& \
OraTable,const std::wstring& OraGeomColumn,const std::wstring& OverFdoClassName) // \
no ref count + {
+ if( OraOwner.empty() || OraTable.empty() )
+ return false;
+
+ std::wstring keyname = OraOwner;
+ keyname.append(OraTable);
+ keyname.append(OraGeomColumn);
+ keyname.append(OverFdoClassName);
+
+ if( keyname.compare(m_LasTriedName) == 0 && m_LastFound )
+ {
+ return m_LastFound;
+ }
+ m_LasTriedName = keyname;
+ m_LastFound=NULL;
+ t_datavector::iterator itr = m_DataVector.begin();
+ while(itr != m_DataVector.end())
+ {
+ if( itr->keyname.compare(keyname)==0 )
+ {
+ m_LastFound=&*itr;
+
+ return m_LastFound;
+ }
+ itr++;
+ }
+
+ return m_LastFound;
+ }
+
+ void Add(const std::wstring& OraOwner,const std::wstring& OraTableName,const \
std::wstring& OraGeomName,const std::wstring& OverFdoClassName +
+ ,FdoClassDefinition* ClassDef,FdoKgOraClassDefinition* KgOraClassDef,const \
std::vector<std::wstring>& OverridePrimeryColumns // no ref count + ,const \
std::wstring& spatial_owner,const std::wstring& spatial_table // used to connect to \
xxx_sdo_geom_metada to read srid + )
+ {
+ m_DataVector.push_back(s_data(OraOwner,OraTableName,OraGeomName,OverFdoClassName,ClassDef,KgOraClassDef,OverridePrimeryColumns,spatial_owner,spatial_table));
+ }
+
+ void SetKgOraSpatialContextCollection( c_KgOraSpatialContextCollection* \
SC_Collection ) + {
+ m_SC_Collection=SC_Collection;
+ }
+ c_KgOraSpatialContextCollection* GetKgOraSpatialContextCollection( )
+ {
+ return m_SC_Collection;
+ }
+
+ int GetCount()
+ {
+ return m_DataVector.size();
+ }
+
+ c_MapOraNameToFdoClass::s_data* Get( int ind )
+ {
+ return &m_DataVector.at(ind);
+ }
+
+
+
+
+
+protected:
+ std::wstring m_LasTriedName;
+ s_data* m_LastFound;
+
+ c_KgOraSpatialContextCollection* m_SC_Collection;
+
+
+ typedef std::vector<s_data> t_datavector;
+ t_datavector m_DataVector;
+};
+
+
+c_FdoOra_API3::c_FdoOra_API3(void)
+{
+}
+
+c_FdoOra_API3::~c_FdoOra_API3(void)
+{
+}
+
+
+bool c_FdoOra_API3::OraTypeToFdoDataType(ub2 OCiDataType,int Precision,int Scale,int \
Length,FdoDataType & FdoType) +{
+ bool isfdotype=true;
+ switch( OCiDataType )
+ {
+ case OCI_TYPECODE_VARCHAR2: // varchar2
+ case OCI_TYPECODE_VARCHAR: // varchar2
+ FdoType = FdoDataType_String;
+ break;
+
+ case OCI_TYPECODE_NUMBER: // NUMBER
+ case OCI_TYPECODE_DECIMAL: // NUMBER
+ if( Scale <= 0 && Precision>=1 )
+ {
+ if( Precision <= 4 )
+ {
+ FdoType = FdoDataType_Int16;
+ }
+ else
+ {
+ if( Precision <= 9 )
+ {
+ FdoType = FdoDataType_Int32;
+ }
+ else
+ {
+ if( Precision <= 19 ) // this is deliberately to be 19 so it stay as \
integer (not decimal) + // even 19 places can exceed int64
+ {
+ FdoType = FdoDataType_Int64;
+ }
+ else
+ {
+ FdoType = FdoDataType_Double;
+ }
+
+ }
+
+ }
+ }
+ else FdoType = FdoDataType_Double;
+
+ break;
+
+ case OCI_TYPECODE_CHAR: // char
+ if( Length==1 ) FdoType = FdoDataType_Byte;
+ else FdoType = FdoDataType_String;
+ break;
+
+ case OCI_TYPECODE_SIGNED16:
+ FdoType = FdoDataType_Int16;
+ break;
+
+ case OCI_TYPECODE_INTEGER:
+ case OCI_TYPECODE_SIGNED32:
+ FdoType = FdoDataType_Int32;
+ break;
+
+ case OCI_TYPECODE_SMALLINT:
+ FdoType = FdoDataType_Int16;
+ break;
+
+ case OCI_TYPECODE_BFLOAT:
+ case OCI_TYPECODE_FLOAT:
+ FdoType = FdoDataType_Single;
+ break;
+ case OCI_TYPECODE_BDOUBLE:
+ case OCI_TYPECODE_DOUBLE:
+ case OCI_TYPECODE_REAL:
+ FdoType = FdoDataType_Double;
+ break;
+
+ case OCI_TYPECODE_DATE:
+ FdoType = FdoDataType_DateTime;
+ break;
+ case OCI_TYPECODE_BLOB:
+ FdoType = FdoDataType_BLOB;
+ break;
+ case OCI_TYPECODE_CLOB:
+ FdoType = FdoDataType_CLOB;
+ break;
+ default:
+ isfdotype = false;
+ break;
+ }
+
+
+
+ #ifdef _DEBUG
+ if( !isfdotype )
+ {
+ isfdotype =isfdotype;
+ }
+ #endif
+
+ return isfdotype;
+}//end of c_FdoOra_API3::OraTypeToFdoDataType
+
+/*
+bool c_FdoOra_API3::FdoDataTypeToOraDataType(FdoDataType \
DataType,oracle::occi::Type& OraType) +{
+ switch( DataType )
+ {
+ case FdoDataType_Boolean:
+ OraType = oracle::occi::OCCISTRING;
+ break;
+
+ /// Represents unsigned 8-bit integers with values between 0 and 255.
+ case FdoDataType_Byte:
+ OraType = oracle::occi::OCCISTRING;
+ break;
+
+ /// Represents a date and time value.
+ case FdoDataType_DateTime:
+ OraType = oracle::occi::OCCIDATE;
+ break;
+
+ /// Represents values ranging from 1.0 x 10^-28 to approximately 7.9 x 10^28
+ /// with 28-29 significant digits.
+ case FdoDataType_Decimal:
+ OraType = oracle::occi::OCCINUMBER;
+ break;
+
+ /// Represents a floating point value ranging from approximately 5.0
+ /// x 10^-324 to 1.7 x 10^308 with a precision of 15-16 digits.
+ case FdoDataType_Double:
+ OraType = oracle::occi::OCCIDOUBLE;
+ break;
+
+ /// Represents signed 16-bit integers with values between -32768 and 32767.
+ case FdoDataType_Int16:
+ OraType = oracle::occi::OCCIINT;
+ break;
+
+ /// Represents signed 32-bit integers with values between -2147483648
+ /// and 2147483647.
+ case FdoDataType_Int32:
+ OraType = oracle::occi::OCCIINT;
+ break;
+
+ /// Represents signed 64-bit integers with values
+ /// between -9223372036854775808 and 9223372036854775807.
+ case FdoDataType_Int64:
+ OraType = oracle::occi::OCCINUMBER;
+ break;
+
+ /// Represents floating point values ranging from approximately 1.5 x 10^-45
+ /// to 3.4 x 10^38, with a precision of 7 digits.
+ case FdoDataType_Single:
+ OraType = oracle::occi::OCCIFLOAT;
+ break;
+
+ /// Represents a Unicode character strings.
+ case FdoDataType_String:
+ OraType = oracle::occi::OCCISTRING;
+ break;
+
+ /// Represents a binary large object stored as a collection of bytes.
+ case FdoDataType_BLOB:
+ OraType = oracle::occi::OCCIBLOB;
+ break;
+
+ /// Represents a character large object stored as a collection of
+ /// characters.
+ case FdoDataType_CLOB:
+ OraType = oracle::occi::OCCICLOB;
+ break;
+
+ default:
+ return false;
+ break;
+ }
+
+ return true;
+}//end of c_FdoOra_API3::FdoDataTypeToOraDataType
+*/
+
+
+
+
+bool c_FdoOra_API3::SetOracleStatementData(c_Oci_Statement* Statement,int \
SqlParamNum,FdoDataValue* DataValue) +{
+
+ switch( DataValue->GetDataType() )
+ {
+ case FdoDataType_Boolean:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamNum,NULL);
+ else
+ {
+ FdoBooleanValue * boolval = (FdoBooleanValue*)DataValue;
+ string val;
+ if( boolval->GetBoolean() )
+ Statement->BindStringValue(SqlParamNum,L"1");
+ else
+ Statement->BindStringValue(SqlParamNum,L"0");
+
+
+ }
+ }
+ break;
+
+ /// Represents unsigned 8-bit integers with values between 0 and 255.
+ case FdoDataType_Byte:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamNum,NULL);
+ else
+ {
+ FdoByteValue * byteval = (FdoByteValue*)DataValue;
+ wchar_t chstr[2];
+ chstr[0] = byteval->GetByte();
+ chstr[1] = 0;
+
+ Statement->BindStringValue(SqlParamNum,chstr);
+ }
+ }
+ break;
+
+ /// Represents a date and time value.
+ case FdoDataType_DateTime:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDate(SqlParamNum,NULL);
+ else
+ {
+ FdoDateTimeValue * dateval = (FdoDateTimeValue*)DataValue;
+
+ FdoDateTime date = dateval->GetDateTime();
+ OCIDate val;
+ val.OCIDateYYYY = date.year;
+ val.OCIDateMM = date.month;
+ val.OCIDateDD = date.day;
+ val.OCIDateTime.OCITimeHH = date.hour;
+ val.OCIDateTime.OCITimeMI = date.minute;
+ val.OCIDateTime.OCITimeSS = (ub1)date.seconds;
+
+ Statement->BindDateValue(SqlParamNum,val);
+ }
+ }
+ break;
+
+ /// Represents values ranging from 1.0 x 10^-28 to approximately 7.9 x 10^28
+ /// with 28-29 significant digits.
+ case FdoDataType_Decimal:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamNum,NULL);
+ else
+ {
+ FdoDecimalValue * dval = (FdoDecimalValue*)DataValue;
+
+ Statement->BindDoubleValue(SqlParamNum,dval->GetDecimal());
+ }
+ }
+ break;
+
+ /// Represents a floating point value ranging from approximately 5.0
+ /// x 10^-324 to 1.7 x 10^308 with a precision of 15-16 digits.
+ case FdoDataType_Double:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamNum,NULL);
+ else
+ {
+ FdoDoubleValue * dval = (FdoDoubleValue*)DataValue;
+ Statement->BindDoubleValue(SqlParamNum,dval->GetDouble());
+ }
+ }
+ break;
+
+ /// Represents signed 16-bit integers with values between -32768 and 32767.
+ case FdoDataType_Int16:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt(SqlParamNum,NULL);
+ else
+ {
+ FdoInt16Value * dval = (FdoInt16Value*)DataValue;
+ Statement->BindIntValue(SqlParamNum,dval->GetInt16());
+ }
+ }
+ break;
+
+ /// Represents signed 32-bit integers with values between -2147483648
+ /// and 2147483647.
+ case FdoDataType_Int32:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt(SqlParamNum,NULL);
+ else
+ {
+ FdoInt32Value * dval = (FdoInt32Value*)DataValue;
+ Statement->BindIntValue(SqlParamNum,dval->GetInt32());
+ }
+ }
+ break;
+
+ /// Represents signed 64-bit integers with values
+ /// between -9223372036854775808 and 9223372036854775807.
+ case FdoDataType_Int64:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt64(SqlParamNum,NULL);
+ else
+ {
+ FdoInt64Value * dval = (FdoInt64Value*)DataValue;
+
+ //long dval
+
+ Statement->BindInt64Value(SqlParamNum,dval->GetInt64());
+ }
+ }
+ break;
+
+ /// Represents floating point values ranging from approximately 1.5 x 10^-45
+ /// to 3.4 x 10^38, with a precision of 7 digits.
+ case FdoDataType_Single:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamNum,NULL);
+ else
+ {
+ FdoSingleValue * dval = (FdoSingleValue*)DataValue;
+ Statement->BindDoubleValue(SqlParamNum,dval->GetSingle());
+ }
+ }
+ break;
+
+ /// Represents a Unicode character strings.
+ case FdoDataType_String:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamNum,NULL);
+ else
+ {
+ FdoStringValue * dval = (FdoStringValue*)DataValue;
+
+ Statement->BindString(SqlParamNum,dval->GetString());
+ }
+ }
+ break;
+
+ /// Represents a binary large object stored as a collection of bytes.
+ case FdoDataType_BLOB:
+ {
+ Statement->BindBlob(SqlParamNum,NULL,0);
+ }
+ break;
+
+ /// Represents a character large object stored as a collection of
+ /// characters.
+ case FdoDataType_CLOB:
+ {
+ Statement->BindClob(SqlParamNum,NULL,0);
+ }
+ break;
+
+ default:
+ return false;
+ break;
+ }
+
+ return true;
+}//end of c_FdoOra_API3::SetOracleStatementData
+
+bool c_FdoOra_API3::SetOracleStatementData(c_Oci_Statement* Statement,const \
wchar_t*SqlParamName,FdoDataValue* DataValue) +{
+
+ switch( DataValue->GetDataType() )
+ {
+ case FdoDataType_Boolean:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamName,NULL);
+ else
+ {
+ FdoBooleanValue * boolval = (FdoBooleanValue*)DataValue;
+ string val;
+ if( boolval->GetBoolean() )
+ Statement->BindStringValue(SqlParamName,L"1");
+ else
+ Statement->BindStringValue(SqlParamName,L"0");
+
+
+ }
+ }
+ break;
+
+ /// Represents unsigned 8-bit integers with values between 0 and 255.
+ case FdoDataType_Byte:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamName,NULL);
+ else
+ {
+ FdoByteValue * byteval = (FdoByteValue*)DataValue;
+ wchar_t chstr[2];
+ chstr[0] = byteval->GetByte();
+ chstr[1] = 0;
+
+ Statement->BindStringValue(SqlParamName,chstr);
+ }
+ }
+ break;
+
+ /// Represents a date and time value.
+ case FdoDataType_DateTime:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDate(SqlParamName,NULL);
+ else
+ {
+ FdoDateTimeValue * dateval = (FdoDateTimeValue*)DataValue;
+
+ FdoDateTime date = dateval->GetDateTime();
+ OCIDate val;
+ val.OCIDateYYYY = date.year;
+ val.OCIDateMM = date.month;
+ val.OCIDateDD = date.day;
+ val.OCIDateTime.OCITimeHH = date.hour;
+ val.OCIDateTime.OCITimeMI = date.minute;
+ val.OCIDateTime.OCITimeSS = (ub1)date.seconds;
+
+ Statement->BindDateValue(SqlParamName,val);
+ }
+ }
+ break;
+
+ /// Represents values ranging from 1.0 x 10^-28 to approximately 7.9 x 10^28
+ /// with 28-29 significant digits.
+ case FdoDataType_Decimal:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamName,NULL);
+ else
+ {
+ FdoDecimalValue * dval = (FdoDecimalValue*)DataValue;
+
+ Statement->BindDoubleValue(SqlParamName,dval->GetDecimal());
+ }
+ }
+ break;
+
+ /// Represents a floating point value ranging from approximately 5.0
+ /// x 10^-324 to 1.7 x 10^308 with a precision of 15-16 digits.
+ case FdoDataType_Double:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamName,NULL);
+ else
+ {
+ FdoDoubleValue * dval = (FdoDoubleValue*)DataValue;
+ Statement->BindDoubleValue(SqlParamName,dval->GetDouble());
+ }
+ }
+ break;
+
+ /// Represents signed 16-bit integers with values between -32768 and 32767.
+ case FdoDataType_Int16:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt(SqlParamName,NULL);
+ else
+ {
+ FdoInt16Value * dval = (FdoInt16Value*)DataValue;
+ Statement->BindIntValue(SqlParamName,dval->GetInt16());
+ }
+ }
+ break;
+
+ /// Represents signed 32-bit integers with values between -2147483648
+ /// and 2147483647.
+ case FdoDataType_Int32:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt(SqlParamName,NULL);
+ else
+ {
+ FdoInt32Value * dval = (FdoInt32Value*)DataValue;
+ Statement->BindIntValue(SqlParamName,dval->GetInt32());
+ }
+ }
+ break;
+
+ /// Represents signed 64-bit integers with values
+ /// between -9223372036854775808 and 9223372036854775807.
+ case FdoDataType_Int64:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindInt64(SqlParamName,NULL);
+ else
+ {
+ FdoInt64Value * dval = (FdoInt64Value*)DataValue;
+
+ //long dval
+
+ Statement->BindInt64Value(SqlParamName,dval->GetInt64());
+ }
+ }
+ break;
+
+ /// Represents floating point values ranging from approximately 1.5 x 10^-45
+ /// to 3.4 x 10^38, with a precision of 7 digits.
+ case FdoDataType_Single:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindDouble(SqlParamName,NULL);
+ else
+ {
+ FdoSingleValue * dval = (FdoSingleValue*)DataValue;
+ Statement->BindDoubleValue(SqlParamName,dval->GetSingle());
+ }
+ }
+ break;
+
+ /// Represents a Unicode character strings.
+ case FdoDataType_String:
+ {
+
+ if( DataValue->IsNull() )
+ Statement->BindString(SqlParamName,NULL);
+ else
+ {
+ FdoStringValue * dval = (FdoStringValue*)DataValue;
+
+ Statement->BindString(SqlParamName,dval->GetString());
+ }
+ }
+ break;
+
+ /// Represents a binary large object stored as a collection of bytes.
+ case FdoDataType_BLOB:
+ {
+ Statement->BindBlob(SqlParamName,NULL,0);
+ }
+ break;
+
+ /// Represents a character large object stored as a collection of
+ /// characters.
+ case FdoDataType_CLOB:
+ {
+ Statement->BindClob(SqlParamName,NULL,0);
+ }
+ break;
+
+ default:
+ return false;
+ break;
+ }
+
+ return true;
+}//end of c_FdoOra_API3::SetOracleStatementData
+
+bool c_FdoOra_API3::OraTypeToFdoDataType(const char* OraType,int Precision,int \
Scale,int Length,FdoDataType & FdoType) +{
+
+ bool isfdotype=false;
+
+ if( FdoCommonOSUtil::stricmp(OraType,"VARCHAR2") == 0 )
+ {
+ FdoType = FdoDataType_String;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"VARCHAR") == 0 )
+ {
+ FdoType = FdoDataType_String;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"NUMBER") == 0 )
+ {
+ if( Scale <= 0 && Precision>=1 )
+ {
+ if( Precision <= 4 )
+ {
+ FdoType = FdoDataType_Int16;
+ }
+ else
+ {
+ if( Precision <= 9 )
+ {
+ FdoType = FdoDataType_Int32;
+ }
+ else
+ {
+ if( Precision <= 19 ) // this is deliberately to be 19 so it stay as \
integer (not decimal) + // even 19 places can exceed int64
+ {
+ FdoType = FdoDataType_Int64;
+ }
+ else
+ {
+ FdoType = FdoDataType_Double;
+ }
+
+ }
+
+ }
+ }
+ else FdoType = FdoDataType_Double;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"CHAR") == 0 )
+ {
+ if( Length==1 ) FdoType = FdoDataType_Byte;
+ else FdoType = FdoDataType_String;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"BINARY_FLOAT") == 0 || \
(FdoCommonOSUtil::stricmp(OraType,"FLOAT") == 0) ) + {
+ FdoType = FdoDataType_Single;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"BINARY_DOUBLE") == 0 || \
(FdoCommonOSUtil::stricmp(OraType,"DOUBLE") == 0) ) + {
+ FdoType = FdoDataType_Double;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"DATE") == 0 )
+ {
+ FdoType = FdoDataType_DateTime;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"BLOB") == 0 )
+ {
+ FdoType = FdoDataType_BLOB;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::stricmp(OraType,"CLOB") == 0 )
+ {
+ FdoType = FdoDataType_CLOB;
+ isfdotype=true;
+ }
+
+ #ifdef _DEBUG
+ if( !isfdotype )
+ {
+ isfdotype =isfdotype;
+ }
+ #endif
+
+ return isfdotype;
+}//end of c_FdoOra_API3::OraTypeToFdoDataType
+
+bool c_FdoOra_API3::OraTypeToFdoDataType(const wchar_t* OraType,int Precision,int \
Scale,int Length,FdoDataType & FdoType) +{
+
+ bool isfdotype=false;
+
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"VARCHAR2") == 0 || \
FdoCommonOSUtil::wcsicmp(OraType,L"VARCHAR") == 0 || \
FdoCommonOSUtil::wcsicmp(OraType,L"NVARCHAR") == 0 || \
FdoCommonOSUtil::wcsicmp(OraType,L"NVARCHAR2") == 0) + {
+ FdoType = FdoDataType_String;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"NUMBER") == 0 || \
FdoCommonOSUtil::wcsicmp(OraType,L"DECIMAL") == 0 ) + {
+ if( Scale <= 0 && Precision>=1 )
+ {
+ if( Precision <= 4 )
+ {
+ FdoType = FdoDataType_Int16;
+ }
+ else
+ {
+ if( Precision <= 9 )
+ {
+ FdoType = FdoDataType_Int32;
+ }
+ else
+ {
+ if( Precision <= 19 ) // this is deliberately to be 19 so it stay as \
integer (not decimal) + // even 19 places can exceed int64
+ {
+ FdoType = FdoDataType_Int64;
+ }
+ else
+ {
+ FdoType = FdoDataType_Double;
+ }
+
+ }
+
+ }
+ }
+ else FdoType = FdoDataType_Double;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"CHAR") == 0 )
+ {
+ if( Length==1 ) FdoType = FdoDataType_Byte;
+ else FdoType = FdoDataType_String;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"INTEGER") == 0 )
+ {
+ FdoType = FdoDataType_Int64;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"BINARY_FLOAT") == 0 )
+ {
+ FdoType = FdoDataType_Single;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"BINARY_DOUBLE") == 0 || \
(FdoCommonOSUtil::wcsicmp(OraType,L"DOUBLE") == 0) || \
(FdoCommonOSUtil::wcsicmp(OraType,L"FLOAT") == 0) ) + {
+ FdoType = FdoDataType_Double;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"DATE") == 0 )
+ {
+ FdoType = FdoDataType_DateTime;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"BLOB") == 0 )
+ {
+ FdoType = FdoDataType_BLOB;
+ isfdotype=true;
+ } else
+ if( FdoCommonOSUtil::wcsicmp(OraType,L"CLOB") == 0 )
+ {
+ FdoType = FdoDataType_CLOB;
+ isfdotype=true;
+ }
+
+#ifdef _DEBUG
+ if( !isfdotype )
+ {
+ isfdotype =isfdotype;
+ }
+#endif
+
+ return isfdotype;
+}//end of c_FdoOra_API3::OraTypeToFdoDataType
+
+bool c_FdoOra_API3::DescribeTableProperties(c_Oci_Connection * OciConn,const \
wchar_t*SqlColumns,bool BindOwner,const wchar_t* OraOwner + \
,c_MapOraNameToFdoClass& MapOraToClass) +{
+
+ int numcols=0;
+
+ c_Oci_Statement *stm = OciConn->CreateStatement();
+
+
+ if( BindOwner )
+ {
+ stm->Prepare(SqlColumns);
+
+ stm->BindString(1,OraOwner);
+
+ }
+ else
+ {
+ stm->Prepare(SqlColumns);
+ }
+
+
+ c_MapOraNameToFdoClass::s_data * mapdata;
+ FdoClassDefinition* classdef;
+ //FdoKgOraClassDefinition* kgoraclassdef;
+
+ std::wstring strnullable;
+ stm->ExecuteSelectAndDefine();
+ //ResultSet * rs = stm->executeQuery();
+ while( stm->ReadNext() )
+ {
+ //L" select a.owner, a.table_name, b.column_name, b.data_type, b.data_length, \
b.data_precision, b.data_scale " + std::wstring oraowner;
+ if( !stm->IsColumnNull(1) )
+ oraowner = stm->GetString(1);
+ else
+ oraowner=OraOwner ? OraOwner : L"";
+
+
+ if( !oraowner.empty() && !stm->IsColumnNull(2) && !stm->IsColumnNull(5) )
+ {
+
+ std::wstring oratable = stm->GetString(2);
+ std::wstring orageom = stm->IsColumnNull(3) ? L"" : stm->GetString(3);
+ std::wstring fdoclassname = stm->IsColumnNull(4) ? L"" : stm->GetString(4);
+
+
+
+ mapdata = MapOraToClass.FindClassDef(oraowner,oratable,orageom,fdoclassname);
+ if( mapdata )
+ {
+ classdef = mapdata->fdoclass;
+ FdoPtr<FdoPropertyDefinitionCollection> propscoll = \
classdef->GetProperties(); +
+ if( !stm->IsColumnNull(5) )
+ {
+ std::wstring columnname = stm->GetString(5);
+
+ bool isfdotype=false;
+ FdoDataType fdotype;
+
+ FdoInt32 length=0,precision=0,scale=0;
+
+ // length
+ if( !stm->IsColumnNull(7) )
+ {
+ length = stm->GetInteger(7);
+ }
+ else length = 0;
+
+ // precision
+ if( !stm->IsColumnNull(8) )
+ {
+ precision = stm->GetInteger(8);
+ }
+ else precision = 0;
+
+ // scale
+ if( !stm->IsColumnNull(9) )
+ {
+ scale = stm->GetInteger(9);
+ }
+ else
+ {
+ scale = -1; // not null because if 0 then it wil become integer but \
should be decimal withundefined scale + }
+
+ // nullable
+ bool isnullable=true;
+ if( !stm->IsColumnNull(10) )
+ {
+ strnullable = stm->GetString(10);
+ if( !strnullable.empty() && strnullable.at(0)==L'N' )
+ isnullable=false;
+ }
+
+
+ // data type
+ if( !stm->IsColumnNull(6) )
+ {
+ wstring datatype = stm->GetString(6);
+
+
+ isfdotype = \
OraTypeToFdoDataType(datatype.c_str(),precision,scale,length,fdotype); +
+ if( isfdotype )
+ {
+ try
+ {
+
+ FdoPtr<FdoDataPropertyDefinition> dpd = \
FdoDataPropertyDefinition::Create(columnname.c_str(), L""); + \
dpd->SetDataType(fdotype); + dpd->SetLength(length);
+ dpd->SetPrecision(precision);
+ dpd->SetScale(scale);
+ dpd->SetNullable(isnullable);
+
+ propscoll->Add(dpd);
+ }
+ catch (FdoException* exp)
+ {
+ FdoStringP fstr = exp->GetExceptionMessage();
+ D_KGORA_ELOG_WRITE1("c_FdoOra_API3::DescribeSchemaSQL.Error : \
'%s'",(const char*)fstr); + exp->Release();
+ }
+ }
+ else
+ {
+ // perhaps it is geometry
+ if( wcscmp(datatype.c_str(),L"SDO_GEOMETRY") == 0 )
+ {
+ FdoPtr<FdoPropertyDefinition> f = \
propscoll->FindItem(columnname.c_str()); + if( !f.p )
+ {
+ try
+ {
+ FdoPtr<c_KgOraSpatialContext> spcontext;
+
+ std::wstring sowner,stable;
+ sowner = mapdata->spatial_owner;
+ if( sowner.empty() )
+ sowner = oraowner;
+ stable = mapdata->spatial_table;
+ if( stable.empty() )
+ stable = oratable;
+
+
+ bool isz,ism;
+ spcontext = \
CreateSpatialContext(OciConn,sowner.c_str(),stable.c_str(),columnname.c_str(),MapOraToClass.GetKgOraSpatialContextCollection(),isz,ism);
+ FdoPtr<FdoGeometricPropertyDefinition> geomprop = \
FdoGeometricPropertyDefinition::Create(columnname.c_str(),L""); + \
geomprop->SetHasElevation(isz); + geomprop->SetHasMeasure(ism);
+
+ if( spcontext.p )
+ {
+ geomprop->SetSpatialContextAssociation(spcontext->GetName());
+ }
+ propscoll->Add(geomprop);
+ }
+ catch (FdoException* exp)
+ {
+ exp->Release();
+ }
+ }
+
+
+ }
+ }
+ }
+ }
+ }
+ }
+ numcols++;
+ }
+
+ OciConn->TerminateStatement (stm);
+
+ return numcols;
+
+
+}//end of c_FdoOra_API3::DescribeTableProperties
+
+
+bool c_FdoOra_API3::DescribeTablePrimaryKey(c_Oci_Connection * OciConn,const \
wchar_t*SqlPkey,bool BindOwner,const wchar_t* OraOwner + \
,c_MapOraNameToFdoClass& MapOraToClass) +{
+
+ int numcols=0;
+
+
+// go read columns for primary key
+if( SqlPkey && *SqlPkey )
+{
+ c_Oci_Statement *stm = OciConn->CreateStatement();
+ if( BindOwner )
+ {
+ stm->Prepare(SqlPkey);
+
+ stm->BindString(1,OraOwner);
+
+ }
+ else
+ {
+ stm->Prepare(SqlPkey);
+ }
+
+ std::wstring fulltable;
+ FdoClassDefinition* classdef;
+ FdoKgOraClassDefinition* kgoraclassdef;
+
+ std::vector<std::wstring> primarycols;
+ std::wstring strnullable;
+ stm->ExecuteSelectAndDefine();
+ //ResultSet * rs = stm->executeQuery();
+ while( stm->ReadNext() )
+ {
+ std::wstring oraowner;
+ if( !stm->IsColumnNull(1) )
+ oraowner = stm->GetString(1);
+ else
+ oraowner=OraOwner ? OraOwner : L"";
+
+ //L" select a.owner, a.table_name, b.column_name, b.data_type, b.data_length, \
b.data_precision, b.data_scale " + if( !oraowner.empty() && \
!stm->IsColumnNull(2) && !stm->IsColumnNull(5) ) + {
+ std::wstring oratable = stm->GetString(2);
+ std::wstring orageom = stm->IsColumnNull(3) ? L"" : stm->GetString(3);
+ std::wstring fdoclassname = stm->IsColumnNull(4) ? L"" : stm->GetString(4);
+
+ fulltable = oraowner;
+ fulltable.append(L".");
+ fulltable.append(oratable);
+
+ std::wstring geomcolumn = stm->GetString(3);
+
+ std::wstring pkcolumn = stm->GetString(5);
+ c_MapOraNameToFdoClass::s_data *sdata = \
MapOraToClass.FindClassDef(oraowner,oratable,orageom,fdoclassname); + if( sdata \
) + {
+ sdata->primarycolumns.push_back(pkcolumn);
+ }
+ }
+ numcols++;
+ }
+
+ OciConn->TerminateStatement (stm);
+}
+
+ // now walk throu classes and applied found primary key collumns or ones which \
ahve been overried in KingFdoClass table + int cnt = MapOraToClass.GetCount();
+ for(int ind=0;ind<cnt;ind++)
+ {
+ c_MapOraNameToFdoClass::s_data* mapdata = MapOraToClass.Get(ind);
+
+ std::vector<std::wstring> *pkcols=NULL;
+ if( mapdata && mapdata->overprimary.size()>0 )
+ {
+ pkcols = &mapdata->overprimary;
+ }
+ else
+ {
+ if( mapdata && mapdata->primarycolumns.size()>0 )
+ {
+ pkcols = &mapdata->primarycolumns;
+ }
+ }
+
+ if( pkcols && pkcols->size() > 0 )
+ {
+ FdoPtr<FdoPropertyDefinitionCollection> fdoprops = \
mapdata->fdoclass->GetProperties(); + bool isidentity_int=true;
+ std::vector<std::wstring>::iterator iter = pkcols->begin();
+ for ( iter = pkcols->begin( ) ; iter != pkcols->end( ) ; iter++ )
+ {
+ FdoStringP gstr = iter->c_str();
+ FdoPtr<FdoDataPropertyDefinition> entid = \
dynamic_cast<FdoDataPropertyDefinition*>(fdoprops->FindItem(gstr)); + if( \
entid.p ) + {
+ entid->SetNullable(false);
+ FdoPtr<FdoDataPropertyDefinitionCollection> ic = \
mapdata->fdoclass->GetIdentityProperties(); + ic->Add( entid );
+
+ FdoDataType datatype = entid->GetDataType();
+ if( (datatype == FdoDataType_Int16) || (datatype == FdoDataType_Int32) || \
(datatype == FdoDataType_Int64) ) + {
+
+ }
+ else
+ {
+ isidentity_int = false;
+ }
+ }
+ }
+ }
+ }
+
+ return numcols;
+
+
+}//end of c_FdoOra_API3::DescribeTablePrimaryKey
+
+
+
+
+
+/*
+select a.srid, a.table_name as geomtablename, a.column_name as geomcolumnname,
+b.cs_name, b.wktext,
+c.sdo_dimname as dname, c.sdo_lb as dmin, c.sdo_ub as dmax, c.sdo_tolerance as dtol
+from ALL_SDO_GEOM_METADATA a, MDSYS.CS_SRS b, table(a.diminfo) c
+where a.srid = b.srid (+) and a.owner = :1 ;
+*/
+//FdoPtr<FdoFeatureSchemaCollection> g_FeatureSchemas(NULL);
+//FdoPtr<FdoKgOraPhysicalSchemaMapping> g_PhysicalSchemaMapping(NULL);
+
+c_KgOraSchemaDesc* c_FdoOra_API3::DescribeSchema(c_Oci_Connection* OciConn,const \
wchar_t* ConnectionOraSchema,const wchar_t* UseOraSchema + \
,const wchar_t* KingFdoViews,const wchar_t* SdeSchema) +{
+
+ FdoPtr<FdoFeatureSchemaCollection> fschema;
+ FdoPtr<FdoKgOraPhysicalSchemaMapping> phschema;
+ int alias_num=0;
+
+
+ bool isoracle9=false;
+ fschema = FdoFeatureSchemaCollection::Create(NULL);
+
+ phschema = FdoKgOraPhysicalSchemaMapping::Create();
+ long aliasnum=0;
+
+ FdoPtr<c_KgOraSpatialContextCollection> sc_collection = new \
c_KgOraSpatialContextCollection(); +
+
+
+// Create FDO classes from SDE tables
+{
+ if( SdeSchema && *SdeSchema )
+ {
+ FdoPtr<FdoFeatureSchema> schema;
+
+ schema = (FdoFeatureSchema*)fschema->FindItem(L"KingOra");
+ if( !schema.p)
+ {
+ schema = FdoFeatureSchema::Create(L"KingOra", L"");
+ fschema->Add(schema.p);
+ }
+ FdoPtr<FdoClassCollection> classes = schema->GetClasses();
+
+ FdoPtr<FdoKgOraClassCollection> phys_classes = phschema->GetClasses();
+
+ bool bind_owner = false;
+ c_FdoOra_API3::DescribeSchemaSDE(OciConn,UseOraSchema, \
classes,phys_classes,sc_collection,aliasnum); + }
+}
+
+// Create FDO classes from tables in SDO_GEOM_METADATA
+if( OciConn->IsSdoTypes() )
+{
+ FdoPtr<FdoFeatureSchema> schema;
+
+ schema = (FdoFeatureSchema*)fschema->FindItem(L"KingOra");
+ if( !schema.p)
+ {
+ schema = FdoFeatureSchema::Create(L"KingOra", L"");
+ fschema->Add(schema.p);
+ }
+
+ FdoPtr<FdoClassCollection> classes = schema->GetClasses();
+
+ FdoPtr<FdoKgOraClassCollection> phys_classes = phschema->GetClasses();
+
+ try
+ {
+
+
+ //occi_stm->setSQL("select owner, table_name,column_name,srid,diminfo from \
all_sdo_geom_metadata where owner=:1 order by owner,table_name"); + \
//occi_stm->setString(1,"OSE"); +
+ // this is for 10.2 only ( not for previous releases )
+ /*
+ occi_stm->setSQL(
+ " select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.COORD_REF_SYS_NAME, b.LEGACY_WKTEXT, c.index_name, d.SDO_ROOT_MBR" + " from \
all_sdo_geom_metadata a, SDO_COORD_REF_SYS b, ALL_SDO_INDEX_INFO c, \
ALL_SDO_INDEX_METADATA d" + " where a.srid = b.srid(+) and a.owner = \
c.table_owner " + " and a.table_name = c.table_name and c.sdo_index_owner = \
d.sdo_index_owner and c.index_name = d.sdo_index_name " + " order by a.owner, \
a.table_name " + );
+ */
+
+ std::wstring sqlquery,sqlquery_columns,sqlquery_pkey ;
+ int mainversion,subversion;
+ c_Ora_API2::GetOracleVersion(OciConn,mainversion,subversion);
+
+ bool bind_owner = false;
+
+ // this is for prior 10.2 version (works also with 10.2)
+ if( !UseOraSchema || (*UseOraSchema == 0) )
+ {
+ if( mainversion >= 10 )
+ {
+ /*
+ occi_stm->setSQL(
+ " select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, b.CS_NAME, \
b.WKTEXT , c.index_name, d.SDO_ROOT_MBR " + " from all_sdo_geom_metadata a, \
MDSYS.CS_SRS b, ALL_SDO_INDEX_INFO c, ALL_SDO_INDEX_METADATA d " + " where \
a.srid = b.srid(+) and a.owner = c.table_owner " + " and a.table_name = \
c.table_name and c.sdo_index_owner = d.sdo_index_owner and c.index_name = \
d.sdo_index_name " + " order by a.owner, a.table_name"
+ );
+ */
+
+ /*
+ sqlquery = \
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, d.SDO_ROOT_MBR \
" + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL o8 \
,NULL o9 ,NULL o10, NULL o111 ,NULL o12 " + L" from all_tab_columns t, \
all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid "
+ L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.owner = c.table_owner and \
a.table_name = c.table_name and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT \
JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + L" LEFT JOIN all_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + L" where t.owner = \
a.owner and t.table_name=a.table_name and t.column_name = a.column_name " + L" \
order by a.owner, a.table_name "; + */
+ sqlquery = \
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, d.SDO_ROOT_MBR \
" + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL o8 \
,NULL o9 ,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + L" from \
all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid "
+ L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.owner = c.table_owner and \
a.table_name = c.table_name and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT \
JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + L" LEFT JOIN all_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') ORDER BY a.owner, a.table_name "; + \
+ sqlquery_columns = \
+ L" select a.owner, a.table_name,a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN all_tab_cols b ON a.owner = \
b.owner and a.table_name = b.table_name WHERE b.hidden_column='NO'"; +
+
+
+ sqlquery_pkey = L"SELECT a.owner, a.table_name, a.column_name,NULL, \
cols.column_name" + L" FROM all_sdo_geom_metadata a,all_constraints cons, \
all_cons_columns cols" + L" WHERE cons.table_name = a.table_name and \
cons.owner = a.owner" + L" AND cons.constraint_type = 'P' AND \
cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner" + \
L" ORDER BY a.owner, a.table_name"; +
+
+ }
+ else
+ {
+ /*
+ occi_stm->setSQL(
+ " select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, b.CS_NAME, \
b.WKTEXT , c.index_name " + " from all_sdo_geom_metadata a, MDSYS.CS_SRS b, \
ALL_SDO_INDEX_INFO c, ALL_SDO_INDEX_METADATA d " + " where a.srid = b.srid(+) \
" // this line is different for oracle 10 nad 9 + " and a.table_name = \
c.table_name and c.sdo_index_owner = d.sdo_index_owner and c.index_name = \
d.sdo_index_name " + " order by a.owner, a.table_name"
+ );
+ */
+ /*
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, NULL \
SDO_ROOT_MBR " + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 \
,NULL o7 ,NULL o8 ,NULL o9 ,NULL o10, NULL o111 ,NULL o12 " + L" from \
all_tab_columns t, all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON \
a.srid = b.srid " + L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.table_name = \
c.table_name " + L" LEFT JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = \
d.sdo_index_owner and c.index_name = d.sdo_index_name " + L" LEFT JOIN \
all_sequences s on s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + L" \
where t.owner = a.owner and t.table_name=a.table_name and t.column_name = \
a.column_name " + L" order by a.owner, a.table_name ";
+ */
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, NULL \
SDO_ROOT_MBR " + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 \
,NULL o7 ,NULL o8 ,NULL o9 ,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = \
b.srid " + L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.table_name = c.table_name "
+ L" LEFT JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = \
d.sdo_index_owner and c.index_name = d.sdo_index_name " + L" LEFT JOIN \
all_sequences s on s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') order by a.owner, \
a.table_name"; +
+ sqlquery_columns = \
+ L" select a.owner, a.table_name,a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN all_tab_cols b ON a.owner = \
b.owner and a.table_name = b.table_name WHERE b.hidden_column='NO'"; +
+ sqlquery_pkey = L"SELECT a.owner, a.table_name,a.column_name,NULL, \
cols.column_name" + L" FROM all_sdo_geom_metadata a,all_constraints cons, \
all_cons_columns cols" + L" WHERE cons.table_name = a.table_name and \
cons.owner = a.owner" + L" AND cons.constraint_type = 'P' AND \
cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner" + \
L" ORDER BY a.owner, a.table_name"; +
+ isoracle9=true;
+ }
+
+ // SELECT SDO_AGGR_MBR(geom) FROM curvepolygon
+ }
+ else
+ {
+ if( mainversion >= 10 )
+ {
+ /*
+ occi_stm->setSQL(
+ " select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, b.CS_NAME, \
b.WKTEXT , c.index_name, d.SDO_ROOT_MBR " + " from all_sdo_geom_metadata a, \
MDSYS.CS_SRS b, ALL_SDO_INDEX_INFO c, ALL_SDO_INDEX_METADATA d " + " where \
a.owner = :1 and a.srid = b.srid(+) and a.owner = c.table_owner " + " and \
a.table_name = c.table_name and c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + " order by a.owner, a.table_name"
+ );
+ */
+
+ /*
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, d.SDO_ROOT_MBR \
" + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL o8 \
,NULL o9 ,NULL o10, NULL o111 ,NULL o12 " + L" from all_tab_columns t, \
all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid "
+ L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.owner = c.table_owner and \
a.table_name = c.table_name and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT \
JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + L" LEFT JOIN all_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + L" where t.owner = \
a.owner and t.table_name=a.table_name and t.column_name = a.column_name and t.owner = \
:1 " + L" order by a.owner, a.table_name ";
+ */
+ //if( _wcsicmp(ConnectionOraSchema,UseOraSchema) == 0 )
+ if( FdoCommonOSUtil::wcsicmp(ConnectionOraSchema, UseOraSchema)==0 )
+ {
+ sqlquery=\
+ L" select NULL, a.table_name, a.column_name, a.srid, a.diminfo, b.CS_NAME, \
b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, d.SDO_ROOT_MBR " + \
L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL o8 ,NULL o9 \
,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + L" from \
user_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid \
" + L" LEFT JOIN user_SDO_INDEX_INFO c ON a.table_name = c.table_name and \
a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT JOIN user_SDO_INDEX_METADATA d ON \
c.index_name = d.sdo_index_name " + L" LEFT JOIN user_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') order by a.table_name"; +
+ sqlquery_columns = \
+ L" select NULL, a.table_name, a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from user_sdo_geom_metadata a " + L" LEFT JOIN user_tab_cols b ON \
a.table_name = b.table_name WHERE b.hidden_column='NO'"; +
+ sqlquery_pkey = L"SELECT NULL, a.table_name, a.column_name,NULL, \
cols.column_name" + L" FROM user_sdo_geom_metadata a,user_constraints \
cons, user_cons_columns cols" + L" WHERE cons.table_name = a.table_name "
+ L" AND cons.constraint_type = 'P' AND cons.constraint_name = \
cols.constraint_name AND cons.owner = cols.owner" + L" ORDER BY \
a.table_name"; + }
+ else
+ {
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, d.SDO_ROOT_MBR \
" + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL \
o8 ,NULL o9 ,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + L" from \
all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid \
" + L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.owner = c.table_owner and \
a.table_name = c.table_name and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT \
JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + L" LEFT JOIN all_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + L" where a.owner = :1 \
order by a.owner, a.table_name"; +
+ sqlquery_columns = \
+ L" select a.owner, a.table_name,a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN all_tab_cols b ON a.owner \
= b.owner and a.table_name = b.table_name " + L" where a.owner = :1 AND \
b.hidden_column='NO'"; +
+ sqlquery_pkey = L"SELECT a.owner, a.table_name, a.column_name,NULL, \
cols.column_name" + L" FROM all_sdo_geom_metadata a,all_constraints cons, \
all_cons_columns cols" + L" WHERE a.owner=:1 and cons.table_name = \
a.table_name and cons.owner = a.owner" + L" AND cons.constraint_type = 'P' \
AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner" + \
L" ORDER BY a.owner, a.table_name"; +
+ bind_owner = true;
+ }
+
+
+ }
+ else
+ {
+ //----------------------------------------------------------
+ // For Oracle version before 10 and UseOraSchema is set
+ //----------------------------------------------------------
+ /*
+ occi_stm->setSQL(
+ " select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT , c.index_name " + " from all_sdo_geom_metadata a, \
MDSYS.CS_SRS b, ALL_SDO_INDEX_INFO c, ALL_SDO_INDEX_METADATA d " + " where \
a.owner = :1 and a.srid = b.srid(+) " // this line is different for oracle 10 nad 9 + \
" and a.table_name = c.table_name and c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + " order by a.owner, a.table_name"
+ );
+ */
+ /*
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, NULL \
SDO_ROOT_MBR " + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 \
,NULL o7 ,NULL o8 ,NULL o9 ,NULL o10, NULL o111 ,NULL o12 " + L" from \
all_tab_columns t, all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON \
a.srid = b.srid " + L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.table_name = \
c.table_name and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT JOIN \
ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and c.index_name = \
d.sdo_index_name " + L" LEFT JOIN all_sequences s on s.sequence_name = \
CONCAT(a.table_name,'_FDOSEQ') " + L" where t.owner = a.owner and \
t.table_name=a.table_name and t.column_name = a.column_name and t.owner = :1 " + \
L" order by a.owner, a.table_name "; + */
+
+ //if( wcscmp(ConnectionOraSchema,UseOraSchema) == 0 )
+ if( FdoCommonOSUtil::wcsicmp(ConnectionOraSchema, UseOraSchema)==0 )
+ {
+ sqlquery=\
+ L" select NULL, a.table_name, a.column_name, a.srid, a.diminfo, b.CS_NAME, \
b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, NULL SDO_ROOT_MBR " + \
L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 ,NULL o7 ,NULL o8 ,NULL o9 \
,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + L" from \
user_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid \
" + L" LEFT JOIN user_SDO_INDEX_INFO c ON a.table_name = c.table_name and \
a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT JOIN user_SDO_INDEX_METADATA d ON \
c.index_name = d.sdo_index_name " + L" LEFT JOIN user_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') "; // order by a.table_name"; + \
+ sqlquery_columns = \
+ L" select NULL, a.table_name,a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from user_sdo_geom_metadata a " + L" LEFT JOIN user_tab_cols b ON \
a.table_name = b.table_name WHERE b.hidden_column='NO' "; +
+ sqlquery_pkey = L"SELECT NULL, a.table_name,a.column_name,NULL, \
cols.column_name" + L" FROM user_sdo_geom_metadata a,user_constraints \
cons, user_cons_columns cols" + L" WHERE cons.table_name = a.table_name "
+ L" AND cons.constraint_type = 'P' AND cons.constraint_name = \
cols.constraint_name AND cons.owner = cols.owner"; + //L" ORDER BY \
a.table_name"; +
+ bind_owner = false;
+ }
+ else
+ {
+ sqlquery=\
+ L" select a.owner, a.table_name, a.column_name, a.srid, a.diminfo, \
b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, s.sequence_name, NULL \
SDO_ROOT_MBR " + L" ,NULL o1 ,NULL o2 ,NULL o3 ,NULL o4 ,NULL o5 ,NULL o6 \
,NULL o7 ,NULL o8 ,NULL o9 ,NULL o10, NULL o111 ,NULL o12, NULL o13, NULL o14 " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = \
b.srid " + L" LEFT JOIN ALL_SDO_INDEX_INFO c ON a.table_name = c.table_name \
and a.COLUMN_NAME = c.COLUMN_NAME " + L" LEFT JOIN ALL_SDO_INDEX_METADATA d \
ON c.sdo_index_owner = d.sdo_index_owner and c.index_name = d.sdo_index_name " + \
L" LEFT JOIN all_sequences s on s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + \
L" where a.owner = :1 order by a.owner, a.table_name"; +
+ sqlquery_columns = \
+ L" select a.owner, a.table_name,a.column_name,NULL, b.column_name, \
b.data_type, b.data_length, b.data_precision, b.data_scale, b.nullable " + \
L" from all_sdo_geom_metadata a " + L" LEFT JOIN all_tab_cols b ON a.owner \
= b.owner and a.table_name = b.table_name " + L" where a.owner = :1 AND \
b.hidden_column='NO'"; +
+ sqlquery_pkey = L"SELECT a.owner, a.table_name,a.column_name,NULL, \
cols.column_name" + L" FROM all_sdo_geom_metadata a,all_constraints cons, \
all_cons_columns cols" + L" WHERE a.owner=:1 and cons.table_name = \
a.table_name and cons.owner = a.owner" + L" AND cons.constraint_type = 'P' \
AND cons.constraint_name = cols.constraint_name AND cons.owner = cols.owner" + \
L" ORDER BY a.owner, a.table_name"; +
+ bind_owner = true;
+ }
+ isoracle9=true;
+ }
+
+
+ }
+
+
+ #ifdef D_TEST_SHEMASPEED
+ if(false)
+ #endif
+ {
+ c_FdoOra_API3::DescribeSchemaSQL(OciConn,sqlquery.c_str(),sqlquery_columns.c_st \
r(),sqlquery_pkey.c_str(),bind_owner,ConnectionOraSchema,UseOraSchema,classes,phys_classes,sc_collection,aliasnum,isoracle9);
+ }
+
+
+
+
+ }
+ /*
+ catch(FdoException* e)
+ {
+ FDO_SAFE_RELEASE(e);
+
+
+ }
+ */
+ catch(c_Oci_Exception* ea)
+ {
+ FdoStringP gstr = ea->GetErrorText();
+ delete ea;
+ throw FdoException::Create( gstr );
+ }
+
+}
+// Create FDO classes from tables in KingFDOViews table
+if( OciConn->IsSdoTypes() && KingFdoViews && *KingFdoViews )
+{
+ // FdoPtr<FdoFeatureSchema> schema = fschema->FindItem(L"KingFdoClass");
+ // If I set different schema than when selecting feature in MG, it will not select \
one feature + // but it will render all features blue. Workaround was to have one \
just one schema +
+ FdoPtr<FdoFeatureSchema> schema = fschema->FindItem(L"KingOra");
+
+ if( schema.p == NULL )
+ {
+ schema = FdoFeatureSchema::Create(L"KingOra", L"");
+ fschema->Add(schema.p);
+ }
+
+ FdoPtr<FdoClassCollection> classes = schema->GetClasses();
+
+ FdoPtr<FdoKgOraClassCollection> phys_classes = phschema->GetClasses();
+
+
+
+ try
+ {
+
+
+
+ int mainversion,subversion;
+ c_Ora_API2::GetOracleVersion(OciConn,mainversion,subversion);
+ std::wstring sqlstr,sqlstr_columns,sqlstr_pkey;
+
+ // For FDO classes created from FDO View Table (king metadata table)
+ // Oracle Schema connection parameter is irrelevant and not used
+ //if( !OraSchema || (*OraSchema == 0) )
+ {
+ if( mainversion >= 10 )
+ {
+ std::wstring sqlfrom,sqljoin;
+
+ sqlfrom = L" select k.fdo_ora_owner, k.fdo_ora_name, k.fdo_ora_geomcolumn, \
a.srid, a.diminfo, b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, \
s.sequence_name, d.SDO_ROOT_MBR " + L" ,k.fdo_class_name, k.fdo_srid, \
k.fdo_diminfo, k.fdo_cs_name, k.fdo_wktext, k.fdo_layer_gtype, k.fdo_sequence_name, \
k.fdo_identity, k.fdo_sdo_root_mbr " + L" ,k.fdo_point_x_column \
,k.fdo_point_y_column ,k.fdo_point_z_column ,k.FDO_SPATIALTABLE_OWNER \
,k.FDO_SPATIALTABLE_NAME "; +
+ FdoStringP fromtable = FdoStringP::Format(L" FROM %s k ", KingFdoViews);
+
+ sqlfrom = sqlfrom + (FdoString*)fromtable;
+
+ sqljoin = L" LEFT JOIN all_sdo_geom_metadata a ON \
UPPER(k.FDO_SPATIALTABLE_OWNER) = a.owner and UPPER(k.FDO_SPATIALTABLE_NAME) = \
a.table_name and UPPER(k.FDO_SPATIALTABLE_GEOMCOLUMN) = a.column_name " + \
L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid " + L" LEFT JOIN \
ALL_SDO_INDEX_INFO c ON a.owner = c.table_owner and a.table_name = c.table_name " + \
L" LEFT JOIN ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and \
c.index_name = d.sdo_index_name " + L" LEFT JOIN all_sequences s on \
s.sequence_name = CONCAT(a.table_name,'_FDOSEQ') " + L" order by \
k.fdo_ora_owner, k.fdo_ora_name "; +
+ sqlstr = sqlfrom + sqljoin;
+
+ // columns
+ sqlstr_columns = L" select k.fdo_ora_owner, \
k.fdo_ora_name,k.fdo_ora_geomcolumn, k.fdo_class_name, b.column_name, b.data_type, \
b.data_length, b.data_precision, b.data_scale, b.nullable "; + \
sqlstr_columns.append((FdoString*)fromtable); + \
sqlstr_columns.append(L" LEFT JOIN all_tab_cols b ON k.fdo_ora_owner = b.owner and \
k.fdo_ora_name = b.table_name AND b.hidden_column='NO' "); +
+
+ // pkey query
+ sqlstr_pkey.clear(); // pkeys are read from main table
+
+ }
+ else
+ {
+ std::wstring sqlfrom,sqljoin;
+
+ sqlfrom = L" select k.fdo_ora_owner, k.fdo_ora_name, k.fdo_ora_geomcolumn, \
a.srid, a.diminfo, b.CS_NAME, b.WKTEXT, c.index_name, d.sdo_layer_gtype, \
s.sequence_name, NULL SDO_ROOT_MBR " + L" ,k.fdo_class_name, k.fdo_srid, \
k.fdo_diminfo, k.fdo_cs_name, k.fdo_wktext, k.fdo_layer_gtype, k.fdo_sequence_name, \
k.fdo_identity, k.fdo_sdo_root_mbr " + L" ,k.fdo_point_x_column \
,k.fdo_point_y_column ,k.fdo_point_z_column ,k.FDO_SPATIALTABLE_OWNER \
,k.FDO_SPATIALTABLE_NAME "; +
+ FdoStringP fromtable = FdoStringP::Format(L" FROM %s k ", KingFdoViews);
+
+ sqlfrom = sqlfrom + (FdoString*)fromtable;
+
+ sqljoin = L" LEFT JOIN all_sdo_geom_metadata a ON \
UPPER(k.FDO_SPATIALTABLE_OWNER) = a.owner and UPPER(k.FDO_SPATIALTABLE_NAME) = \
a.table_name and UPPER(k.FDO_SPATIALTABLE_GEOMCOLUMN) = a.column_name " + \
L" LEFT JOIN MDSYS.CS_SRS b ON a.srid = b.srid " + L" LEFT JOIN \
ALL_SDO_INDEX_INFO c ON a.table_name = c.table_name " + L" LEFT JOIN \
ALL_SDO_INDEX_METADATA d ON c.sdo_index_owner = d.sdo_index_owner and c.index_name = \
d.sdo_index_name " + L" LEFT JOIN all_sequences s on s.sequence_name = \
CONCAT(a.table_name,'_FDOSEQ') " + L" order by k.fdo_ora_owner, \
k.fdo_ora_name "; +
+ sqlstr = sqlfrom + sqljoin;
+
+ // columns
+ sqlstr_columns = L" select k.fdo_ora_owner, k.fdo_ora_name, \
k.fdo_ora_geomcolumn,k.fdo_class_name, b.column_name, b.data_type, b.data_length, \
b.data_precision, b.data_scale, b.nullable "; + \
sqlstr_columns.append((FdoString*)fromtable); + \
sqlstr_columns.append(L" LEFT JOIN all_tab_cols b ON k.fdo_ora_owner = b.owner and \
k.fdo_ora_name = b.table_name AND b.hidden_column='NO'"); +
+
+ // pkey query
+ sqlstr_pkey.clear(); // pkeys are read from main table
+
+ }
+ }
+
+
+ c_FdoOra_API3::DescribeSchemaSQL(OciConn,sqlstr.c_str(),sqlstr_columns.c_str(),sqlstr_pkey.c_str(),false,ConnectionOraSchema,NULL, \
classes,phys_classes,sc_collection,aliasnum,isoracle9); +
+
+ }
+ catch(FdoException* e)
+ {
+ FDO_SAFE_RELEASE(e);
+
+ }
+ catch(c_Oci_Exception* ea)
+ {
+
+
+ // Just ignore any errors
+
+ FdoStringP gstr = ea->what();
+ //throw FdoException::Create( gstr );
+ }
+
+
+}
+
+ c_KgOraSchemaDesc* schemadata = c_KgOraSchemaDesc::Create();
+
+ schemadata->SetDesc(fschema,phschema,sc_collection);
+
+
+ return schemadata;
+}//end of c_KgOraConnection::DescribeSchema
+
+
+
+/*
+void c_FdoOra_API3::DescribeSchemaSQL(c_Oci_Connection * OciConn,const \
wchar_t*SqlString,FdoClassCollection* FdoClasses,FdoKgOraClassCollection* PhysClasses \
+ ,c_KgOraSpatialContextCollection* \
SC_Collection,long& AliasNum,bool IsOracle9) +{
+ clock_t elog_t1=clock();
+
+ // initialize stmthp
+ //OCIStmt *stmthp=NULL;
+ //OciConn->OciCheckError( OCIHandleAlloc((dvoid *)OciConn->m_OciHpEnvironment, \
(dvoid **)&stmthp, (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid **)0)); + c_Oci_Statement \
stm(OciConn); + // parse query
+
+ std::wstring sql( L"SELECT owner,table_name FROM ALL_SDO_GEOM_METADATA " );
+ OciConn->OciCheckError( OCIStmtPrepare(stm.m_OciHpStm, OciConn->m_OciHpError,
+ (text *)sql.c_str(), (ub4)wcslen(sql.c_str())*sizeof(wchar_t),
+ (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
+
+ // table name
+ wchar_t owner[128];
+ wchar_t table_name[128];
+ OCIDefine *defn1p;
+ OciConn->OciCheckError( OCIDefineByPos(stm.m_OciHpStm, &defn1p, \
OciConn->m_OciHpError, (ub4)1, + (dvoid *)&owner[0],
+ (sb4)sizeof(owner), SQLT_STR,
+ (dvoid *)0, (ub2 *)0, (ub2 *)0,
+ (ub4)OCI_DEFAULT));
+ OCIDefine *defn2p;
+ OciConn->OciCheckError( OCIDefineByPos(stm.m_OciHpStm, &defn2p, \
OciConn->m_OciHpError, (ub4)2, + (dvoid *)&table_name[0],
+ (sb4)sizeof(table_name), SQLT_STR,
+ (dvoid *)0, (ub2 *)0, (ub2 *)0,
+ (ub4)OCI_DEFAULT));
+
+ // execute
+ int status = OCIStmtExecute(OciConn->m_OciHpServiceContext, stm.m_OciHpStm, \
OciConn->m_OciHpError, (ub4)1, (ub4)0, + (OCISnapshot *)NULL, (OCISnapshot \
*)NULL, + (ub4)OCI_DEFAULT);
+
+ bool has_more_data;
+ int rows_fetched;
+ if (status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+ {
+ has_more_data = FALSE;
+ }
+ else
+ {
+ has_more_data = TRUE;
+ OciConn->OciCheckError( status);
+ }
+
+
+ OciConn->OciCheckError( OCIAttrGet((dvoid *)stm.m_OciHpStm, (ub4)OCI_HTYPE_STMT,
+ (dvoid *)&rows_fetched, (ub4 *)0,
+ (ub4)OCI_ATTR_ROW_COUNT, OciConn->m_OciHpError));
+
+
+ int tablenum = 0;
+ while( rows_fetched>0 )
+ {
+ tablenum++;
+
+ FdoPtr<FdoPropertyDefinitionCollection> col_propdef = \
FdoPropertyDefinitionCollection::Create(NULL); + \
DescribeTableProperties(OciConn,owner,table_name,col_propdef); + status = \
OCIStmtFetch2(stm.m_OciHpStm, OciConn->m_OciHpError, (ub4)1, + \
(ub2)OCI_FETCH_NEXT, 1,(ub4)OCI_DEFAULT); +
+ if( status == OCI_SUCCESS)
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)stm.m_OciHpStm, \
(ub4)OCI_HTYPE_STMT, + (dvoid *)&rows_fetched, (ub4 *)0,
+ (ub4)OCI_ATTR_ROW_COUNT, OciConn->m_OciHpError));
+ else
+ rows_fetched = 0;
+
+ }
+
+
+
+
+}
+*/
+
+
+/*
+ Creates FDO classes and adds them into FdoClassCollection.
+
+ Classes are created based on records returned by sql statement 'OcciStm'.
+ SQL statement is different in two cases (but returned columns are same):
+ 1. SQL statement which combines tables from SDO_GEOM_METADATA with dat from \
spatial indexes, primarykeys etc.. + 2. SQL statement which combines data from \
table 'FdoViews' with other data from spatial index or +
+
+ Meaning of coulmns and they order as should returnd by SQL statement (OcciStm):
+
+ 1. Oracle Owner (varchar2, not null ) - oracle owner ftom table/view which is \
used for querying fdo class data + 2. Oracle Name (varchar2, not null ) - oracle \
name of table/view used to query fdo class data + 3. Oracle Geometry Column ( \
varchar2, null ) - oracle name of column used to retrieve geometry for fdo class,can \
be NULLL. +
+ 4. SRID ( number, null ) - SRID coming from SDO_GEOM_METADATA or NULL
+ 5. Dimension list (SDO_DIM_INFO_ARRAY, null) - Dimension info coming from \
SDO_GEOM_METADATA or NULL +
+ 6. CS Name ( varchar2 , null ) - Coordinate system name coming from \
SDO_GEOM_METADATA or NULL + 7. CS WkText ( varchar2 , null ) - Coordinate system \
well known text coming from SDO_GEOM_METADATA or NULL +
+ 8. SpatialIndexName ( varchar2, null ) - name of spatial index created on table or \
null +
+ 9. LayerGType (varchar2, null ) - coming from spatial index metadata or null
+
+ 10. SequenceName ( varchar2, null ) - name of Oracle sequence is defined which is \
used for inserting new rows +
+ 11. MBR ( SDO_GEOMETRY, null ) - extent of geometry, comes from spatial index or \
null +
+ < From FDOVIEWS Table >
+
+ 12. Override FDO Class Name ( varchar2, null ) - name of the class which will be \
used as fdo class +
+ 13. Override SRID ( number, null ) - override srid
+
+ 14. Override Dimension list ( number, null ) - override srid
+
+ 15. Override CS Name ( varchar2 , null ) - Coordinate system name or NULL
+ 16. Override CS WkText ( varchar2 , null ) - Coordinate system or NULL
+
+ 17. Override LayerGType (varchar2, null ) - coming from spatial index metadata or \
null +
+ 18. Override SequenceName ( varchar2, null ) - name of Oracle sequence is defined \
which is used for inserting new rows +
+ 19. Override Identity Coolumns ( varchar2, null ) - list of columns to be used for \
as identiy for class +
+ 20. Override MBR ( SDO_GEOMETRY, null ) - extent of geometry or null
+
+ 21. FDO_POINT_X_COLUMN (varchar2, null ) this column defines names of column with \
values for point geometry where values are stored as numbers in columns + 22. \
FDO_POINT_Y_COLUMN (varchar2, null ) x,y must be define to be used and "3. Oracle \
Geometry Column" must be NULL + 23. FDO_POINT_Z_COLUMN (varchar2, null ) if 3d point \
then it is defined +
+*/
+
+
+ // Test for coordinate system if exists and
+c_KgOraSpatialContext* c_FdoOra_API3::CreateSpatialContext(c_Oci_Connection * \
OciConn,const wchar_t* Owner,const wchar_t* Table,const wchar_t* GeometryColumn + \
,c_KgOraSpatialContextCollection* SC_Collection + ,bool& IsZ,bool& IsM)
+{
+ std::wstring sqlstring;
+ c_Oci_Statement * stm=NULL;
+ FdoPtr<c_KgOraSpatialContext> spatial_context;
+try
+{
+ // select a.srid, a.diminfo, b.CS_NAME, b.WKTEXT from all_sdo_geom_metadata a \
left join mdsys.cs_srs b on a.srid=b.srid + // where owner='DEEODB4' and \
table_name='EOTR_TRAFOSTANICE' and column_name = 'GEOMETRY'; + \
sqlstring.append(L"select a.srid, a.diminfo, b.CS_NAME, b.WKTEXT from \
all_sdo_geom_metadata a left join mdsys.cs_srs b on a.srid=b.srid where owner=:1 and \
table_name=:2 and column_name=:3 "); + stm = OciConn->CreateStatement();
+ stm->Prepare(sqlstring.c_str());
+
+ stm->BindString(1,Owner);
+ stm->BindString(2,Table);
+ stm->BindString(3,GeometryColumn);
+
+ stm->ExecuteSelectAndDefine();
+
+ IsZ=IsM=false;
+
+ if( !stm->ReadNext() )
+ {
+ spatial_context = SC_Collection->GetDefaultSpatialContext();
+ }
+ else
+ {
+
+ std::wstring ora_coord_sys_name,ora_coord_sys_wktext;
+
+ bool ora_srid_isnull;
+ int ora_srid;
+ ora_srid_isnull = stm->IsColumnNull(1);
+ if( !ora_srid_isnull ) ora_srid = stm->GetInteger(1);
+ else ora_srid = 0;
+
+ //std::vector< SDO_DIM_ELEMENT* > ora_dimlist;
+ c_SDO_DIM_ARRAY ora_dimlist;
+ if( !stm->IsColumnNull(2) )
+ {
+ ora_dimlist = stm->GetSdoDimArray(2);
+ //oracle::occi::getVector(occi_rs,5,ora_dimlist);
+ // set if Class has Z or M coordinate values
+ if( ora_dimlist.GetSize() >2 )
+ {
+ if( ora_dimlist.GetSize() == 3 )
+ {
+ c_SDO_DIM_ELEMENT dimelem = ora_dimlist.GetDimElement(2);
+ std::wstring dimname;
+ if( !dimelem.IsNullDimName() && \
(FdoCommonOSUtil::wcsicmp(dimelem.GetDimName(),L"M") == 0) ) + IsM = true;
+ else
+ IsZ = true;
+ }
+ else
+ {
+ IsZ = true;
+ IsM = true;
+ }
+ }
+ }
+
+ ora_coord_sys_name = stm->IsColumnNull(3) ? L"" : stm->GetString(3);
+ ora_coord_sys_wktext = stm->IsColumnNull(4) ? L"" : stm->GetString(4);
+
+
+ if( (long)ora_srid >= 0 )
+ {
+ FdoStringP cname = FdoStringP::Format(L"OracleSrid%ld",(long)ora_srid);
+ spatial_context = SC_Collection->FindItem(cname);
+ if( !spatial_context )
+ {
+ spatial_context = new c_KgOraSpatialContext();
+ spatial_context->SetName(cname);
+
+ FdoStringP csname = ora_coord_sys_name.c_str();
+ spatial_context->SetCoordSysName(csname);
+
+ FdoStringP cswkt = ora_coord_sys_wktext.c_str();
+ spatial_context->SetCoordinateSystemWkt(cswkt);
+
+
+ c_KgOraSridDesc orasriddesc;
+ orasriddesc.m_OraSrid = (long)ora_srid;
+ orasriddesc.m_IsGeodetic = \
c_Ora_API2::IsGeodeticCoordSystem(ora_coord_sys_wktext.c_str()); + \
spatial_context->SetOraSridDesc(orasriddesc); +
+ long dimcount = ora_dimlist.GetSize();
+ for(long ind=0;ind<dimcount;ind++)
+ {
+ c_SDO_DIM_ELEMENT dimelem = ora_dimlist.GetDimElement(ind);
+
+ std::wstring dimname;
+ if( !dimelem.IsNullDimName() )
+ dimname = dimelem.GetDimName();
+
+ double tol = dimelem.GetTolerance();
+ double lb = (double)dimelem.GetLB();
+ double ub = (double)dimelem.GetUB();
+ }
+
+ SC_Collection->Insert(0,spatial_context);
+ }
+ }
+ else
+ {
+ spatial_context = SC_Collection->GetDefaultSpatialContext();
+ }
+ }
+}
+catch(c_Oci_Exception* ex)
+{
+ FdoStringP gstr = ex->GetErrorText();
+#ifdef _KGORA_EXTENDED_LOG
+ D_KGORA_ELOG_WRITE1("c_FdoOra_API3::DescribeSchemaSQL.Error : '%s'",(const \
char*)gstr); +#endif
+ delete ex;
+ if( stm )
+ {
+ OciConn->TerminateStatement(stm);
+
+ }
+
+ throw FdoException::Create( gstr );
+}
+
+ OciConn->TerminateStatement(stm);
+ return FDO_SAFE_ADDREF(spatial_context.p);
+}// end of c_FdoOra_API3::CreateSpatialContext
+
+
+void c_FdoOra_API3::DescribeSchemaSQL(c_Oci_Connection * OciConn
+ ,const wchar_t* SqlTable,const wchar_t* SqlColumns,const wchar_t* \
SqlPkey + ,bool BindOwner
+ ,const wchar_t* ConnectionOraSchema,const wchar_t* Owner
+ ,FdoClassCollection* FdoClasses,FdoKgOraClassCollection* PhysClasses
+ ,c_KgOraSpatialContextCollection* SC_Collection,long& AliasNum,bool \
IsOracle9 ) +{
+ c_Oci_Statement * stm=NULL;
+ double time_total_columns=0.0,time_total_pkeys=0.0;
+ int class_count=0;
+ int rec_count=0;
+ c_MapOraNameToFdoClass maporatoclass;
+ maporatoclass.SetKgOraSpatialContextCollection(SC_Collection);
+
+ try
+ {
+ // Query Oracle for geometry tables
+
+ stm = OciConn->CreateStatement();
+ stm->Prepare(SqlTable);
+ if( BindOwner && Owner )
+ {
+ stm->BindString(1,Owner);
+ }
+ stm->ExecuteSelectAndDefine();
+
+ bool ora_srid_isnull;
+ std::wstring ora_tablename,ora_geom_colname,ora_tableowner,ora_fdo_classname,ora_index_name;
+ long ora_srid;
+ c_SDO_GEOMETRY *ora_mbr=NULL;
+ std::wstring ora_coord_sys_name,ora_coord_sys_wktext,ora_layer_gtype;
+ std::wstring ora_fullname,ora_sequence_name;
+
+ // override's
+ std::wstring override_fdo_classname;
+ bool override_srid_isnull;
+ long override_srid;
+ SDO_GEOMETRY_TYPE *override_mbr;
+ std::wstring override_identity,override_sequence_name;
+ std::wstring override_coord_sys_name,override_coord_sys_wktext,override_layer_gtype;
+ std::wstring override_point_x_col,override_point_y_col,override_point_z_col;
+
+ std::wstring override_spatial_owner,override_spatial_table;
+
+#ifdef _WIN32
+#ifdef _DEBUG
+ c_Timer time_full;
+ time_full.Start();
+#endif
+#endif
+
+
+ while( stm->ReadNext() )
+ {
+ rec_count++;
+ if( stm->IsColumnNull(1) )
+ {
+ if( Owner )
+ ora_tableowner = Owner;
+ else
+ ora_tableowner = L"";
+ }
+ else
+ {
+ ora_tableowner = stm->GetString(1);
+ }
+
+ ora_tablename = stm->IsColumnNull(2) ? L"" : stm->GetString(2);
+ ora_geom_colname = stm->IsColumnNull(3) ? L"" : stm->GetString(3);
+
+
+ // check if dot is in table or column name
+ // in this version of provider skip those tables because fdo doesn't allow \
dots in names + // TODO: change table name or column name so it doen't have dots
+ if( (ora_tablename.find(L".") != std::wstring::npos) || \
(ora_geom_colname.find(L".") != std::wstring::npos) ) + {
+ continue;
+ }
+
+ std::wstring nonver_tablename;
+ if( CheckIfVersionedTableName(OciConn,ora_tableowner,ora_tablename,nonver_tablename) \
) + {
+ ora_tablename = nonver_tablename;
+ }
+
+
+ ora_srid_isnull = stm->IsColumnNull(4);
+ if( !ora_srid_isnull ) ora_srid = stm->GetInteger(4);
+ else ora_srid = 0;
+
+ //std::vector< SDO_DIM_ELEMENT* > ora_dimlist;
+ c_SDO_DIM_ARRAY ora_dimlist;
+ if( !stm->IsColumnNull(5) )
+ {
+ ora_dimlist = stm->GetSdoDimArray(5);
+ //oracle::occi::getVector(occi_rs,5,ora_dimlist);
+ }
+
+ ora_coord_sys_name = stm->IsColumnNull(6) ? L"" : stm->GetString(6);
+ ora_coord_sys_wktext = stm->IsColumnNull(7) ? L"" : stm->GetString(7);
+
+ ora_index_name = stm->IsColumnNull(8) ? L"" : stm->GetString(8);
+
+ ora_layer_gtype = stm->IsColumnNull(9) ? L"" : stm->GetString(9);
+
+ ora_sequence_name = stm->IsColumnNull(10) ? L"" : stm->GetString(10);
+
+ if( !stm->IsColumnNull(11) )
+ ora_mbr = stm->GetSdoGeom(11);
+ else
+ ora_mbr = NULL;
+ if(ora_mbr )
+ {
+ }
+
+ override_fdo_classname = stm->IsColumnNull(12) ? L"" : stm->GetString(12); // \
12. Override FDO Class Name ( varchar2, null ) - name of the class which will be used \
as fdo class +
+ override_srid_isnull = stm->IsColumnNull(13); // 13. Override SRID ( number, \
null ) - override srid + if( !override_srid_isnull ) override_srid = \
stm->GetInteger(13); + else override_srid = 0;
+
+ //OCCI_STD_NAMESPACE::vector< SDO_DIM_ELEMENT* > override_dimlist;
+ c_SDO_DIM_ARRAY override_dimlist;
+ if( !stm->IsColumnNull(14) )
+ {
+ //oracle::occi::getVector(occi_rs,14,override_dimlist); // 14. Override \
Dimension list ( number, null ) - override srid + override_dimlist = \
stm->GetSdoDimArray(14); + }
+
+ override_coord_sys_name = stm->IsColumnNull(15) ? L"" : stm->GetString(15); // \
15. Override CS Name ( varchar2 , null ) - Coordinate system name or NULL + \
override_coord_sys_wktext = stm->IsColumnNull(16) ? L"" : stm->GetString(16); // 16. \
Override CS WkText ( varchar2 , null ) - Coordinate system or NULL +
+ override_layer_gtype = stm->IsColumnNull(17) ? L"" : stm->GetString(17); // \
17. Override LayerGType (varchar2, null ) - coming from spatial index metadata or \
null +
+ override_sequence_name = stm->IsColumnNull(18) ? L"" : stm->GetString(18); // \
18. Override SequenceName ( varchar2, null ) - name of Oracle sequence is defined \
which is used for inserting new rows +
+ override_identity = stm->IsColumnNull(19) ? L"" : stm->GetString(19); // 19. \
Override Identity Coolumns ( varchar2, null ) - list of columns to be used for as \
identiy for class +
+ if( !stm->IsColumnNull(20) ) // 20. Override MBR ( SDO_GEOMETRY, null ) - \
extent of geometry or null + override_mbr = \
(SDO_GEOMETRY_TYPE*)stm->GetSdoGeom(20); + else
+ override_mbr = NULL;
+
+ override_point_x_col = stm->IsColumnNull(21) ? L"" : stm->GetString(21); //21. \
FDO_POINT_X_COLUMN (varchar2, null ) this column defines names of column with values \
for point geometry where values are stored as numbers in columns + \
override_point_y_col = stm->IsColumnNull(22) ? L"" : stm->GetString(22); //22. \
FDO_POINT_Y_COLUMN (varchar2, null ) x,y must be define to be used and "3. Oracle \
Geometry Column" must be NULL + override_point_z_col = stm->IsColumnNull(23) ? \
L"" : stm->GetString(23); //23. FDO_POINT_Z_COLUMN (varchar2, null ) if 3d point then \
it is defined +
+
+ // fdo class from MYFDOCLASS can be based on view (on top of spatial table) \
and then i need spatial table owner and name to be able to + // read spatial \
metada (user/all_sdo_geom_metadata) info for additional geometry fields in table + \
override_spatial_owner = stm->IsColumnNull(24) ? L"" : stm->GetString(24); + \
override_spatial_table = stm->IsColumnNull(25) ? L"" : stm->GetString(25); +
+
+ c_KgOraSridDesc orasriddesc;
+
+ if( !override_srid_isnull )
+ {
+ ora_srid = override_srid;
+ }
+ if( override_coord_sys_wktext.length() > 0 )
+ {
+ ora_coord_sys_wktext = override_coord_sys_wktext;
+ }
+ if( override_coord_sys_name.length() > 0 )
+ {
+ ora_coord_sys_name = override_coord_sys_name;
+ }
+
+ orasriddesc.m_OraSrid = (long)ora_srid;
+ orasriddesc.m_IsGeodetic = \
c_Ora_API2::IsGeodeticCoordSystem(ora_coord_sys_wktext.c_str()); +
+
+ // Test for coordinate system if exists and
+ FdoPtr<c_KgOraSpatialContext> spatial_context;
+ if( (long)ora_srid >= 0 )
+ {
+ FdoStringP cname = FdoStringP::Format(L"OracleSrid%ld",(long)ora_srid);
+ spatial_context = SC_Collection->FindItem(cname);
+ if( !spatial_context )
+ {
+ spatial_context = new c_KgOraSpatialContext();
+ spatial_context->SetName(cname);
+
+ FdoStringP csname = ora_coord_sys_name.c_str();
+ spatial_context->SetCoordSysName(csname);
+
+ FdoStringP cswkt = ora_coord_sys_wktext.c_str();
+ spatial_context->SetCoordinateSystemWkt(cswkt);
+
+ spatial_context->SetOraSridDesc(orasriddesc);
+
+ long dimcount = ora_dimlist.GetSize();
+ for(long ind=0;ind<dimcount;ind++)
+ {
+ c_SDO_DIM_ELEMENT dimelem = ora_dimlist.GetDimElement(ind);
+
+ std::wstring dimname;
+ if( !dimelem.IsNullDimName() )
+ dimname = dimelem.GetDimName();
+
+ double tol = dimelem.GetTolerance();
+ double lb = (double)dimelem.GetLB();
+ double ub = (double)dimelem.GetUB();
+ }
+
+ SC_Collection->Insert(0,spatial_context);
+ }
+
+ }
+ else
+ {
+ // this is no coordinate system
+ // then I use DEFAULT spatial context
+ if( ora_mbr )
+ {
+ spatial_context = SC_Collection->GetDefaultSpatialContext();
+ }
+ }
+
+ // Now set extents for spatial context
+ double minx,miny,maxx,maxy;
+ bool isminmax = false;
+ if( c_Ora_API2::IsGeodeticCoordSystem(ora_coord_sys_wktext.c_str())
+ ||
+ (ora_mbr == NULL)
+ //(KgOraConn->GetOracleMainVersion() < 10)
+ )
+ {
+ // read extents from user_sdo_geom_metada
+ if( ora_dimlist.GetSize() >= 2 )
+ {
+ c_SDO_DIM_ELEMENT dimelem;
+ dimelem = ora_dimlist.GetDimElement(0);
+
+ minx = dimelem.GetLB();
+ maxx = dimelem.GetUB();
+
+ dimelem = ora_dimlist.GetDimElement(1);
+ miny = dimelem.GetLB();
+ maxy = dimelem.GetUB();
+
+ isminmax = true;
+ }
+ }
+ else
+ {
+ // this is
+ if( ora_mbr )
+ {
+ // extend
+ // ora_geom should be of type 2003 elem_info_array (1,1003,3)
+ // and 4 ordinates for lower/upper bounds
+
+ if( ( (long)ora_mbr->GetSdoGtype() == 2003) && \
((long)ora_mbr->GetSdoElemInfo(1) == 1003) ) + {
+ minx = (double)ora_mbr->GetSdoOrdinate(0);
+ miny = (double)ora_mbr->GetSdoOrdinate(1);
+ maxx = (double)ora_mbr->GetSdoOrdinate(2);
+ maxy = (double)ora_mbr->GetSdoOrdinate(3);
+
+ isminmax = true;
+ }
+ else
+ {
+ if( ( (long)ora_mbr->GetSdoGtype() == 3003) && \
((long)ora_mbr->GetSdoElemInfo(1) == 1003) ) + {
+ minx = (double)ora_mbr->GetSdoOrdinate(0);
+ miny = (double)ora_mbr->GetSdoOrdinate(1);
+ maxx = (double)ora_mbr->GetSdoOrdinate(3);
+ maxy = (double)ora_mbr->GetSdoOrdinate(4);
+
+ isminmax = true;
+ }
+ }
+ }
+ }
+
+ // Apply new extent
+ if( spatial_context.p && isminmax )
+ {
+ FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+ FdoPtr<FdoIEnvelope> env = gf->CreateEnvelopeXY(minx, miny, maxx, maxy);
+
+ spatial_context->ExpandExtent( env );
+ }
+
+
+ if( ora_tableowner.length() > 0 )
+ ora_fullname = ora_tableowner + L"." + ora_tablename;
+ else
+ ora_fullname = ora_tablename;
+
+ ora_fdo_classname = ora_tableowner + D_CLASSNAME_DELIMITER + ora_tablename + \
D_CLASSNAME_DELIMITER + ora_geom_colname; +
+ FdoStringP w_fdo_classname = ora_fdo_classname.c_str();
+
+ if( override_fdo_classname.length() > 0 )
+ {
+ w_fdo_classname = override_fdo_classname.c_str();
+ }
+
+
+ // check if class already exist
+ // the previous sql can return multiple rows for same table.column because of \
multiple indexes on same column + // so I need to check not to duplicate classes
+ if( !FdoClasses->FindItem( w_fdo_classname ) )
+ {
+
+ FdoPtr<FdoFeatureClass> fc_geom;
+ FdoPtr<FdoClass> fc_nogeom;
+ FdoClassDefinition* fc;
+
+ if( (ora_geom_colname.length() > 0)
+ || ( (override_point_x_col.length() > 0) && \
(override_point_y_col.length() > 0) ) + )
+ {
+ fc_geom = FdoFeatureClass::Create(w_fdo_classname, L"");
+ fc = fc_geom.p;
+ }
+ else
+ {
+ fc_nogeom = FdoClass::Create(w_fdo_classname, L"");
+ fc = fc_nogeom.p;
+ }
+
+
+ // set class capabilities
+ // sde class is read-only and no locking
+ FdoPtr<FdoClassCapabilities> capab = FdoClassCapabilities::Create(*fc);
+ capab->SetSupportsWrite(true);
+ capab->SetSupportsLocking(false);
+ capab->SetSupportsLongTransactions(false);
+ fc->SetCapabilities(capab);
+
+ FdoPtr<FdoKgOraClassDefinition> phys_class = \
FdoKgOraClassDefinition::Create(); +
+
+ if( ora_mbr )
+ {
+ if( orasriddesc.m_IsGeodetic )
+ {
+ // for now I am setting spatial extent for geodetic layer maximum big
+ // beacuse SDO_ROOT_MBR has some special values for geodetic layers
+ // this will be changed when i know how to calculate it
+ phys_class->SetSdoRootMBR(L"MDSYS.SDO_GEOMETRY(2003,null,null,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(-180,-90,180,90))");
+ }
+ else
+ {
+ wchar_t* buff = c_Ora_API2::SdoGeomToStringW(ora_mbr);
+ phys_class->SetSdoRootMBR(buff);
+ delete []buff;
+ }
+ }
+ phys_class->SetName( w_fdo_classname );
+ phys_class->SetOracleFullTableName( FdoStringP(ora_fullname.c_str()) );
+ AliasNum++;
+ phys_class->SetOraTableAliasNum( AliasNum );
+
+ FdoPtr<FdoPropertyDefinitionCollection> pdc = fc->GetProperties();
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Create Geometry Property
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+ //
+ // Define Layer Geometry Type
+ //
+ FdoInt32 fdo_geom_type = \
FdoGeometricType_Point|FdoGeometricType_Curve|FdoGeometricType_Surface; +
+ // check if layer type has been override
+ std::wstring comb_layer_gtype;
+ comb_layer_gtype = ora_layer_gtype;
+ if( override_layer_gtype.length() > 0 ) comb_layer_gtype = \
override_layer_gtype; +
+ if( (comb_layer_gtype.compare(L"POINT")==0) || \
(comb_layer_gtype.compare(L"MULTIPOINT")==0) ) + {
+ fdo_geom_type = FdoGeometricType_Point;
+ }
+ else
+ {
+ if( (comb_layer_gtype.compare(L"LINE")==0) || \
(comb_layer_gtype.compare(L"MULTILINE")==0) + || \
(comb_layer_gtype.compare(L"CURVE")==0) || \
(comb_layer_gtype.compare(L"MULTICURVE")==0) + )
+ {
+ fdo_geom_type = FdoGeometricType_Curve;
+ }
+ else
+ {
+ if( (comb_layer_gtype.compare(L"POLYGON")==0) || \
(comb_layer_gtype.compare(L"MULTIPOLYGON")==0) ) + {
+ fdo_geom_type = FdoGeometricType_Surface;
+ }
+ }
+ }
+ if( ora_geom_colname.length() > 0 )
+ {
+ FdoPtr<FdoGeometricPropertyDefinition> gpd = \
FdoGeometricPropertyDefinition::Create(FdoStringP(ora_geom_colname.c_str()), L""); \
+
+ // set if Class has Z or M coordinate values
+ if( ora_dimlist.GetSize() >2 )
+ {
+ if( ora_dimlist.GetSize() == 3 )
+ {
+ c_SDO_DIM_ELEMENT dimelem = ora_dimlist.GetDimElement(2);
+ std::wstring dimname;
+ if( !dimelem.IsNullDimName() && \
(FdoCommonOSUtil::wcsicmp(dimelem.GetDimName(),L"M") == 0) ) + \
gpd->SetHasMeasure(true); + else
+ gpd->SetHasElevation(true);
+ }
+ else
+ {
+ gpd->SetHasElevation(true);
+ gpd->SetHasMeasure(true);
+ }
+ }
+ gpd->SetGeometryTypes(fdo_geom_type);
+
+ if( spatial_context )
+ {
+ gpd->SetSpatialContextAssociation( spatial_context->GetName() );
+ }
+
+ pdc->Add(gpd);
+
+ if( fc_geom.p ) fc_geom->SetGeometryProperty(gpd);
+ }
+ else
+ {
+ // Geometry property is not defined - check if x,y columns are
+ if( (override_point_x_col.length() > 0) && (override_point_y_col.length() \
> 0) ) + {
+ FdoStringP pointproperty = L"KING_FDO_POINT";
+ FdoPtr<FdoGeometricPropertyDefinition> gpd = \
FdoGeometricPropertyDefinition::Create(pointproperty, L""); + \
+ fdo_geom_type = FdoGeometricType_Point;
+ gpd->SetGeometryTypes(fdo_geom_type);
+
+ if( spatial_context )
+ {
+ gpd->SetSpatialContextAssociation( spatial_context->GetName() );
+ }
+
+ pdc->Add(gpd);
+
+ if( fc_geom.p ) fc_geom->SetGeometryProperty(gpd);
+
+ FdoStringP xcol = override_point_x_col.c_str();
+ FdoStringP ycol = override_point_y_col.c_str();
+ FdoStringP zcol = override_point_z_col.c_str();
+ phys_class->SetPointGeometry(pointproperty,xcol,ycol,zcol);
+ }
+ else
+ {
+ // it is non-feature class
+ }
+ }
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Add other non-geometry attributes from table
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+
+ // Because there could be table names in sdo_geom_metadata which doesn't \
exists as tables or views + // catch erro returned
+ bool table_exists=false;
+
+
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Set Oracle Sequence
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+ // If primary ky is one int column and if there is sequence \
TableName_FDOSEQ + // then this sequence will be use to populate identity id \
during inserts + std::wstring comb_sequence_name;
+ comb_sequence_name = ora_sequence_name;
+ if( override_sequence_name.length() > 0 ) comb_sequence_name = \
override_sequence_name; +
+ if( (comb_sequence_name.length()>0) )
+ {
+ FdoStringP fdostr = comb_sequence_name.c_str();
+ phys_class->SetUseSequenceForIdentity(fdostr);
+ }
+
+ /*else
+ {
+
+ FdoPtr<FdoDataPropertyDefinition> entid = \
dynamic_cast<FdoDataPropertyDefinition*>(pdc->FindItem(L"ENTITYID")); + if( \
entid.p ) + {
+ FdoPtr<FdoDataPropertyDefinitionCollection> ic = \
fc->GetIdentityProperties(); + ic->Add( entid );
+ }
+ }*/
+
+ FdoClasses->Add(fc);
+ PhysClasses->Add( phys_class );
+
+ std::vector<std::wstring> override_primarycolumns;
+ if( override_identity.length() > 0 )
+ {
+ // transfering from string to FdoStrinCollection and then back to string
+ // this was written in a hurry - could be better
+ FdoPtr<FdoStringCollection> strcol = \
FdoStringCollection::Create(override_identity.c_str(),L","); + long cnt = \
strcol->GetCount(); + for(long ind=0;ind<cnt;ind++)
+ {
+ std::wstring ss = strcol->GetString(ind);
+ override_primarycolumns.push_back(ss);
+ }
+ }
+
+ // map oracle owner.table.geomcolumn (fdo_overriden_class_name ) to \
generated geometry + \
maporatoclass.Add(ora_tableowner,ora_tablename,ora_geom_colname,override_fdo_classname
+ \
,fc,phys_class,override_primarycolumns,override_spatial_owner,override_spatial_table);
+ }
+
+ if(ora_mbr )
+ delete ora_mbr;
+
+ }
+
+
+#ifdef _WIN32
+#ifdef _DEBUG
+
+ time_full.Stop();
+ printf(" Describe: %.4lf (cols: %.4lf , pkeys: %.2lf) \
",time_full.GetElapsedTime(),time_total_columns,time_total_pkeys); +
+#endif
+#endif
+
+ class_count = FdoClasses->GetCount();
+
+
+
+ // table describe
+ {
+#ifdef _WIN32
+#ifdef _DEBUG
+
+ c_Timer time_columns;
+ time_columns.Start();
+
+#endif
+#endif
+
+ DescribeTableProperties(OciConn,SqlColumns, BindOwner,Owner \
,maporatoclass); +
+#ifdef _WIN32
+#ifdef _DEBUG
+
+ time_total_columns += time_columns.Stop();
+
+#endif
+#endif
+ }
+ // primary key describe
+ {
+
+ std::vector<std::wstring> pcols;
+
+#ifdef _WIN32
+#ifdef _DEBUG
+
+ c_Timer time_pkeys;
+ time_pkeys.Start();
+
+#endif
+#endif
+
+ DescribeTablePrimaryKey(OciConn,SqlPkey,BindOwner,Owner,maporatoclass);
+
+#ifdef _WIN32
+#ifdef _DEBUG
+
+ time_total_pkeys += time_pkeys.Stop();
+
+#endif
+#endif
+
+ }
+
+ OciConn->TerminateStatement(stm);
+ }
+ catch(c_Oci_Exception* ex)
+ {
+ FdoStringP gstr = ex->GetErrorText();
+ #ifdef _KGORA_EXTENDED_LOG
+ D_KGORA_ELOG_WRITE1("c_FdoOra_API3::DescribeSchemaSQL.Error : '%s'",(const \
char*)gstr); + #endif
+ delete ex;
+ if( stm )
+ {
+ OciConn->TerminateStatement(stm);
+
+ }
+
+ throw FdoException::Create( gstr );
+ }
+}//end of c_FdoOra_API3::DescribeSchemaSQL
+
+void c_FdoOra_API3::DescribeSchemaSDE(c_Oci_Connection * OciConn,const wchar_t* \
Owner + ,FdoClassCollection* \
FdoClasses,FdoKgOraClassCollection* PhysClasses + \
,c_KgOraSpatialContextCollection* SC_Collection,long& AliasNum ) +{
+ c_Oci_Statement * stm=NULL;
+ try
+ {
+ // Run Query for layers fdo SDE.layers table
+ std::wstring sqlquery = \
+ L"SELECT l.layer_id, l.owner, l.table_name, l.spatial_column"
+ L" ,g.g_table_schema,g.g_table_name,g.geometry_type,g.coord_dimension"
+ L" ,r.srid,r.srtext,r.falsex,r.falsey,r.xyunits,r.falsez,r.zunits,r.falsem,r.munits" \
+ // 1SPATIAL START
+ L" ,l.gsize1, l.gsize2"
+ // 1SPATIAL END
+ L" FROM sde.layers l INNER JOIN (sde.geometry_columns g INNER JOIN \
sde.spatial_references r ON g.srid = r.srid)" + L" ON l.table_name = \
g.f_table_name and l.owner = g.f_table_schema"; +
+ if( Owner && *Owner )
+ {
+ sqlquery = sqlquery + L" where l.owner='";
+ sqlquery = sqlquery + Owner;
+ sqlquery = sqlquery + L"'";
+ //stm->BindString(1,Owner);
+ }
+
+ stm = OciConn->CreateStatement();
+ stm->Prepare(sqlquery.c_str());
+
+
+ // 1SPATIAL START
+ #ifdef _KGORA_EXTENDED_LOG
+ FdoStringP szSQLQuery = sqlquery.c_str();
+ D_KGORA_ELOG_WRITE1("c_FdoOra_API3::DescribeSchemaSDE.Execute SQL: '%s'",(const \
char*)szSQLQuery); + #endif
+ // 1SPATIAL END
+
+
+ stm->ExecuteSelectAndDefine();
+
+ std::wstring ora_tablename,ora_geom_colname,ora_tableowner,ora_fdo_classname,ora_index_name;
+ long sde_srid;
+ c_SDO_GEOMETRY *ora_mbr=NULL;
+ std::wstring sde_coord_sys_name,sde_coord_sys_wktext;
+ double sde_falsex,sde_falsey,sde_falsez,sde_falsem;
+ double sde_xyunits,sde_zunits,sde_munits;
+ std::wstring ora_fullname,ora_sequence_name;
+
+
+
+ long sde_layer_id;
+ std::wstring sde_geom_owner,sde_geom_table,sde_featurekey_colname;
+ std::wstring sde_full_geometry_table_name,sde_full_index_table_name;
+ long sde_geom_type,sde_geom_coord_dim;
+
+ int duplicate_rec=0;
+ int rec_count=0;
+ while( stm->ReadNext() )
+ {
+ rec_count++;
+
+ if( stm->IsColumnNull(1) )
+ {
+ continue;
+ }
+ else
+ {
+ sde_layer_id = stm->GetInteger(1);
+ }
+
+ if( stm->IsColumnNull(2) )
+ {
+ if( Owner )
+ ora_tableowner = Owner;
+ else
+ ora_tableowner = L"";
+ }
+ else
+ {
+ ora_tableowner = stm->GetString(2);
+ }
+
+ ora_tablename = stm->IsColumnNull(3) ? L"" : stm->GetString(3);
+ sde_featurekey_colname = stm->IsColumnNull(4) ? L"" : stm->GetString(4);
+ ora_geom_colname = L"FdoGeom";
+
+ if( ora_tablename.empty() || ora_geom_colname.empty() ) continue;
+
+ // check if dot is in table or column name
+ // in this version of provider skip those tables because fdo doesn't allow \
dots in names + // TODO: change table name or column name so it doen't have dots
+ if( (ora_tablename.find(L".") != std::wstring::npos) || \
(ora_geom_colname.find(L".") != std::wstring::npos) ) + {
+ continue;
+ }
+
+
+ sde_geom_owner = stm->IsColumnNull(5) ? L"" : stm->GetString(5);
+ sde_geom_table = stm->IsColumnNull(6) ? L"" : stm->GetString(6);
+
+ sde_geom_type = stm->IsColumnNull(7) ? 0 : stm->GetInteger(7);
+ sde_geom_coord_dim = stm->IsColumnNull(8) ? 0 : stm->GetInteger(8);
+
+ sde_full_geometry_table_name = sde_geom_owner + L"." + sde_geom_table;
+ FdoStringP temp2 = \
FdoStringP::Format(L"%s.S%ld",sde_geom_owner.c_str(),sde_layer_id); + \
sde_full_index_table_name = temp2; + //sde_full_index_table_name = \
sde_geom_owner + sde_full_index_table_name; +
+ sde_srid = stm->IsColumnNull(9) ? 0 : stm->GetInteger(9);
+ sde_coord_sys_wktext = stm->IsColumnNull(10) ? L"" : stm->GetString(10);
+
+ FdoStringP temp = FdoStringP::Format(L"SDE_SRID_%ld",sde_srid);
+ sde_coord_sys_name = temp;
+
+ sde_falsex = stm->IsColumnNull(11) ? 0 : stm->GetDouble(11);
+ sde_falsey = stm->IsColumnNull(12) ? 0 : stm->GetDouble(12);
+ sde_xyunits = stm->IsColumnNull(13) ? 1 : stm->GetDouble(13);
+
+ sde_falsez = stm->IsColumnNull(14) ? 0 : stm->GetDouble(14);
+ sde_zunits = stm->IsColumnNull(15) ? 1 : stm->GetDouble(15);
+
+ sde_falsem = stm->IsColumnNull(16) ? 0 : stm->GetDouble(16);
+
+ // 1SPATIAL START
+ //sde_munits = stm->IsColumnNull(17) ? 1 : stm->GetDouble(16);
+ sde_munits = stm->IsColumnNull(17) ? 1 : stm->GetDouble(17);
+ double gsize1 = stm->IsColumnNull(18) ? 1 : stm->GetDouble(18);
+ double gsize2 = stm->IsColumnNull(19) ? 1 : stm->GetDouble(19);
+ // 1SPATIAL END
+
+
+
+ ora_sequence_name = FdoStringP::Format(L"I%ld",sde_srid);
+
+
+
+ c_KgOraSridDesc orasriddesc;
+
+
+
+ orasriddesc.m_OraSrid = (long)sde_srid;
+ orasriddesc.m_IsGeodetic = \
c_Ora_API2::IsGeodeticCoordSystem(sde_coord_sys_wktext.c_str()); + \
orasriddesc.m_SDE_FalseX = sde_falsex; + orasriddesc.m_SDE_FalseY = sde_falsey;
+ orasriddesc.m_SDE_XYUnit = sde_xyunits;
+ orasriddesc.m_SDE_FalseZ = sde_falsez;
+ orasriddesc.m_SDE_ZUnit = sde_zunits;
+ orasriddesc.m_SDE_FalseM = sde_falsem;
+ orasriddesc.m_SDE_MUnit = sde_munits;
+
+ // Test for coordinate system if exists and
+ FdoPtr<c_KgOraSpatialContext> spatial_context;
+ if( (long)sde_srid >= 0 )
+ {
+ FdoStringP cname = FdoStringP::Format(L"SdeSrid%ld",(long)sde_srid);
+ spatial_context = SC_Collection->FindItem(cname);
+ if( !spatial_context )
+ {
+ spatial_context = new c_KgOraSpatialContext();
+ spatial_context->SetName(cname);
+
+ FdoStringP csname = sde_coord_sys_name.c_str();
+ spatial_context->SetCoordSysName(csname);
+
+ FdoStringP cswkt = sde_coord_sys_wktext.c_str();
+ spatial_context->SetCoordinateSystemWkt(cswkt);
+
+ spatial_context->SetOraSridDesc(orasriddesc);
+
+
+ SC_Collection->Insert(0,spatial_context);
+ }
+
+ }
+ else
+ {
+ // this is no coordinate system
+ // then I use DEFAULT spatial context
+ if( ora_mbr )
+ {
+ spatial_context = SC_Collection->GetDefaultSpatialContext();
+ }
+ }
+
+ // Now set extents for spatial context
+ double minx=D_SPATIALCONTEXT_DEFAULT_MINX,miny=D_SPATIALCONTEXT_DEFAULT_MINY;
+ double maxx=D_SPATIALCONTEXT_DEFAULT_MAXX,maxy=D_SPATIALCONTEXT_DEFAULT_MAXY;
+
+ bool isminmax = false;
+
+
+ // Apply new extent
+ if( spatial_context.p && isminmax )
+ {
+ FdoPtr<FdoFgfGeometryFactory> gf = FdoFgfGeometryFactory::GetInstance();
+ FdoPtr<FdoIEnvelope> env = gf->CreateEnvelopeXY(minx, miny, maxx, maxy);
+
+ spatial_context->ExpandExtent( env );
+ }
+
+
+ // Delete ora objects as there are not needed any more
+
+
+
+ if( ora_tableowner.length() > 0 )
+ ora_fullname = ora_tableowner + L"." + ora_tablename;
+ else
+ ora_fullname = ora_tablename;
+
+ ora_fdo_classname = ora_tableowner + D_CLASSNAME_DELIMITER + ora_tablename + \
D_CLASSNAME_DELIMITER + ora_geom_colname; +
+ FdoStringP w_fdo_classname = ora_fdo_classname.c_str();
+
+
+
+ // check if class already exist
+ // the previous sql can return multiple rows for same table.column because of \
multiple indexes on same column + // so I need to check not to duplicate classes
+ if( !FdoClasses->FindItem( w_fdo_classname ) )
+ {
+
+ FdoPtr<FdoFeatureClass> fc = FdoFeatureClass::Create(w_fdo_classname, L""); \
+ // set class capabillities
+ // sde class is read-only and no locking
+ FdoPtr<FdoClassCapabilities> capab = FdoClassCapabilities::Create(*fc);
+ capab->SetSupportsWrite(false);
+ capab->SetSupportsLocking(false);
+ capab->SetSupportsLongTransactions(false);
+ fc->SetCapabilities(capab);
+
+ FdoPtr<FdoKgOraClassDefinition> phys_class = \
FdoKgOraClassDefinition::Create(); +
+
+ if( ora_mbr )
+ {
+ if( orasriddesc.m_IsGeodetic )
+ {
+ // for now I am setting spatial extent for geodetic layer maximum big
+ // beacuse SDO_ROOT_MBR has some special values for geodetic layers
+ // this will be changed when i know how to calculate it
+ phys_class->SetSdoRootMBR(L"MDSYS.SDO_GEOMETRY(2003,null,null,MDSYS.SDO_ELEM_INFO_ARRAY(1,1003,3),MDSYS.SDO_ORDINATE_ARRAY(-180,-90,180,90))");
+ }
+ else
+ {
+ wchar_t* buff = c_Ora_API2::SdoGeomToStringW(ora_mbr);
+ phys_class->SetSdoRootMBR(buff);
+ delete []buff;
+ }
+ }
+ phys_class->SetName( w_fdo_classname );
+ phys_class->SetOracleFullTableName( FdoStringP(ora_fullname.c_str()) );
+ AliasNum++;
+ phys_class->SetOraTableAliasNum( AliasNum );
+
+ // 1SPATIAL START
+ //phys_class->SetSdeClass(true,sde_featurekey_colname.c_str(),sde_full_geometry_table_name.c_str(),sde_geom_type,sde_full_index_table_name.c_str());
+ phys_class->SetSdeClass(true,sde_featurekey_colname.c_str(),sde_full_geometry_table_name.c_str(),sde_geom_type,sde_full_index_table_name.c_str(), \
gsize1,gsize2); + // 1SPATIAL END
+
+ FdoPtr<FdoPropertyDefinitionCollection> pdc = fc->GetProperties();
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Create Geometry Property
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+ //
+ // Define Layer Geometry Type
+ //
+ FdoInt32 fdo_geom_type = \
FdoGeometricType_Point|FdoGeometricType_Curve|FdoGeometricType_Surface; + \
switch(sde_geom_type) + {
+ case 0: // 0 = Geometry
+ case 6: // 6 = collection
+ fdo_geom_type = \
FdoGeometricType_Point|FdoGeometricType_Curve|FdoGeometricType_Surface; + \
break; + case 1: // 1 = point
+ case 7: // 7 = multipoint
+ fdo_geom_type = FdoGeometricType_Point;
+ break;
+ case 2: // 2 = curve
+ case 3: // 3 = linestring
+ case 8: // 8 = multicurve
+ case 9: // 9 = multilinestring
+ fdo_geom_type = FdoGeometricType_Curve;
+ break;
+
+ case 4: // 4 = surface
+ case 5: // 5 = polygon
+ case 10: // 10 = multisurface
+ case 11: // 11 = multipolygon
+ fdo_geom_type = FdoGeometricType_Surface;
+ break;
+ }
+
+
+
+ if( ora_geom_colname.length() > 0 )
+ {
+ //FdoPtr<FdoGeometricPropertyDefinition> gpd = \
FdoGeometricPropertyDefinition::Create(FdoStringP(ora_geom_colname.c_str()), L""); + \
FdoPtr<FdoGeometricPropertyDefinition> gpd = \
FdoGeometricPropertyDefinition::Create(ora_geom_colname.c_str(), L""); \
+
+ gpd->SetGeometryTypes(fdo_geom_type);
+
+ if( spatial_context )
+ {
+ gpd->SetSpatialContextAssociation( spatial_context->GetName() );
+ }
+
+ pdc->Add(gpd);
+
+ fc->SetGeometryProperty(gpd);
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Add other non-geometry sttributes from table
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+
+ // Because there could be table names in sdo_geom_metadata which doesn't \
exists as tables or views + // catch erro returned
+ bool table_exists=false;
+
+ table_exists = \
DescribeTableProperties(OciConn,ora_tableowner.c_str(),ora_tablename.c_str(),pdc,SC_Collection);
+
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Check for primary keys
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+ /*
+ std::vector<std::wstring> pcols;
+
+ if( BindOwner )
+ c_OCI_API::GetTablePkeyColumns(OciConn,ora_tableowner.c_str(),ora_tablename.c_str(),pcols);
+ else
+ c_OCI_API::GetTablePkeyColumns(OciConn,NULL,ora_tablename.c_str(),pcols);
+
+ if( pcols.size() > 0 )
+ */
+ {
+ bool isidentity_int=true;
+
+ FdoPtr<FdoDataPropertyDefinition> entid = \
dynamic_cast<FdoDataPropertyDefinition*>(pdc->FindItem(sde_featurekey_colname.c_str()));
+ if( entid.p )
+ {
+ FdoPtr<FdoDataPropertyDefinitionCollection> ic = \
fc->GetIdentityProperties(); + ic->Add( entid );
+ }
+
+
+
+ ////////////////////////////////////////////////////////////////////////////////////////////
+ // Set Oracle Sequence
+ //////////////////////////////////////////////////////////////////////////////////////////// \
+ // If primary ky is one int column and if there is sequence \
TableName_FDOSEQ + // then this sequence will be use to populate identity id \
during inserts + std::wstring comb_sequence_name;
+ comb_sequence_name = ora_sequence_name;
+ /*
+ if( (pcols.size() == 1) && (isidentity_int = true) && \
(comb_sequence_name.length()>0) ) + {
+ FdoStringP fdostr = comb_sequence_name.c_str();
+ phys_class->SetUseSequenceForIdentity(fdostr);
+ }
+ */
+ }
+
+
+ FdoClasses->Add(fc);
+ PhysClasses->Add( phys_class );
+ }
+ else
+ {
+ duplicate_rec++;
+
+ }
+
+ if(ora_mbr )
+ delete ora_mbr;
+
+ }
+
+ //g_FeatureSchemas = FDO_SAFE_ADDREF(m_FeatureSchemas.p);
+ //g_PhysicalSchemaMapping = FDO_SAFE_ADDREF(m_PhysicalSchemaMapping.p);
+
+ int class_count = FdoClasses->GetCount();
+
+ OciConn->TerminateStatement(stm);
+
+ }
+ catch(c_Oci_Exception* ex)
+ {
+ FdoStringP gstr = ex->GetErrorText();
+#ifdef _KGORA_EXTENDED_LOG
+ D_KGORA_ELOG_WRITE1("c_FdoOra_API3::DescribeSchemaSQL.Error : '%s'",(const \
char*)gstr); +#endif
+ delete ex;
+ if( stm )
+ {
+ OciConn->TerminateStatement(stm);
+
+ }
+
+ throw FdoException::Create( gstr );
+ }
+}//end of c_FdoOra_API3::DescribeSchemaSDE
+
+
+bool c_FdoOra_API3::FdoPropertyToOraDataType(FdoPropertyDefinition* \
Property,FdoStringP& OraType) +{
+ switch( Property->GetPropertyType() )
+ {
+ case FdoPropertyType_GeometricProperty:
+ {
+ OraType = L"MDSYS.SDO_GEOMETRY";
+ }
+ break;
+ case FdoPropertyType_DataProperty:
+ {
+ FdoDataPropertyDefinition * propdata = (FdoDataPropertyDefinition *)Property;
+ switch( propdata->GetDataType() )
+ {
+ case FdoDataType_String:
+ {
+ FdoInt32 len = propdata->GetLength();
+ if( len <= 0 ) len = 4000;
+ OraType = FdoStringP::Format(L"%s(%ld)",L"VARCHAR2",len);
+ }
+ break;
+ case FdoDataType_Decimal:
+ {
+ FdoInt32 prec = propdata->GetPrecision();
+ FdoInt32 scale = propdata->GetScale();
+ // ORACLE:
+ //If you specify a negative scale, then Oracle rounds the actual data to
+ //the specified number of places to the left of the decimal point. For
+ //example, specifying (7,-2) means Oracle rounds to the nearest
+ //hundredths.
+ //
+ //,456,123.89
+ //NUMBER(7,-2)
+ //7456100
+
+ if( (prec>=1) && (prec<=38) )
+ {
+ if( (scale>=0) && (scale<=127) ) // Oracle supposrt from -84 but I thing \
that in FDO -1 means not defined + {
+ OraType = FdoStringP::Format(L"%s(%ld,%ld)",L"NUMBER",prec,scale);
+ }
+ else
+ {
+ OraType = FdoStringP::Format(L"%s(%ld,*)",L"NUMBER",prec);
+ }
+ }
+ else
+ {
+ if( (scale>=0) && (scale<=127) )
+ {
+ OraType = FdoStringP::Format(L"%s(*,%ld)",L"NUMBER",scale);
+ }
+ else
+ {
+ OraType = FdoStringP::Format(L"%s",L"NUMBER");
+ }
+ }
+ }
+ break;
+ case FdoDataType_Byte:
+ OraType = L"CHAR(1)";
+ break;
+ case FdoDataType_Single:
+ OraType = L"BINARY_FLOAT";
+ break;
+ case FdoDataType_Double:
+ OraType = L"BINARY_DOUBLE";
+ break;
+ case FdoDataType_DateTime:
+ OraType = L"DATE";
+ break;
+
+ case FdoDataType_Boolean:
+ OraType = L"VARCHAR(5)";
+ break;
+
+ case FdoDataType_Int16:
+ OraType = L"NUMBER(5,0)";
+ break;
+
+ case FdoDataType_Int32:
+ OraType = L"NUMBER(10,0)";
+ break;
+
+ case FdoDataType_Int64:
+ OraType = L"NUMBER(19,0)";
+ break;
+
+ case FdoDataType_BLOB:
+ OraType = L"BLOB";
+ break;
+
+ case FdoDataType_CLOB:
+ OraType = L"CLOB";
+ break;
+
+ default:
+ return false;
+ break;
+ }
+ }
+ break;
+ default:
+ return false;
+ break;
+ }
+
+
+
+ return true;
+}//end of c_FdoOra_API3::FdoPropertyToOraDataType
+
+
+bool c_FdoOra_API3::CheckIfVersionedTableName(c_Oci_Connection * OciConn,const \
std::wstring& Owner,const std::wstring& ora_tablename,std::wstring& orig_tablename) \
+{ + orig_tablename = ora_tablename;
+
+ int length = ora_tablename.length();
+ if( length > 3 )
+ {
+ //if( ora_tablename.rfind(L"_LT") != std::wstring::npos )
+ if( ora_tablename[length-1]==L'T' && ora_tablename[length-2]==L'L' && \
ora_tablename[length-3]==L'_' ) + {
+ orig_tablename = ora_tablename.substr(0,length-3);
+
+ std::wstring PhysicalTable;
+ if( c_Ora_API2::IsTableVersioned(OciConn,Owner.c_str(),orig_tablename.c_str(),PhysicalTable) \
) + {
+ return true;
+ }
+ }
+ }
+ return false;
+}//end of
+
+/*
+ Utility function to create property definitions from table columns
+*/
+bool c_FdoOra_API3::DescribeTableProperties(c_Oci_Connection * OciConn,const \
wchar_t*Schema,const wchar_t*TableName,FdoPropertyDefinitionCollection* \
PropCollection,c_KgOraSpatialContextCollection* SC_Collection) +{
+ OCIParam *parmh = (OCIParam *) 0; /* parameter handle */
+ OCIParam *collsthd = (OCIParam *) 0; /* handle to list of columns */
+ OCIParam *colhd = (OCIParam *) 0; /* column handle */
+ OCIDescribe *dschp = (OCIDescribe *)0; /* describe handle */
+
+try
+{
+
+ OCIHandleAlloc((dvoid *)OciConn->m_OciHpEnvironment, (dvoid **)&dschp,
+ (ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0);
+
+ /* get the describe handle for the table */
+ std::wstring fullname(Schema);
+ fullname.append(L".");
+ fullname.append(TableName);
+ //int namelen = strlen(fullname.c_str());
+
+ int status = OCIDescribeAny(OciConn->m_OciHpServiceContext, OciConn->m_OciHpError, \
(dvoid *)fullname.c_str(), wcslen(fullname.c_str())*sizeof(wchar_t), OCI_OTYPE_NAME, \
0, + OCI_PTYPE_TABLE, dschp);
+
+ if( status != OCI_SUCCESS )
+ {
+ int status = OCIDescribeAny(OciConn->m_OciHpServiceContext, \
OciConn->m_OciHpError, (dvoid *)fullname.c_str(), \
wcslen(fullname.c_str())*sizeof(wchar_t), OCI_OTYPE_NAME, 0, + OCI_PTYPE_VIEW, \
dschp); +
+ if( status != OCI_SUCCESS )
+ {
+ return false;
+ }
+ }
+
+
+ /* get the parameter handle */
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)dschp, OCI_HTYPE_DESCRIBE, (dvoid \
*)&parmh, (ub4 *)0, + OCI_ATTR_PARAM, OciConn->m_OciHpError));
+
+
+ /* The type information of the object, in this case, OCI_PTYPE_TABLE,
+ is obtained from the parameter descriptor returned by the OCIAttrGet(). */
+ /* get the number of columns in the table */
+ int numcols = 0;
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)parmh, OCI_DTYPE_PARAM, (dvoid \
*)&numcols, (ub4 *)0, + OCI_ATTR_NUM_COLS, OciConn->m_OciHpError));
+
+
+ /* get the handle to the column list of the table */
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)parmh, OCI_DTYPE_PARAM, (dvoid \
*)&collsthd, (ub4 *)0, + OCI_ATTR_LIST_COLUMNS, \
OciConn->m_OciHpError)==OCI_NO_DATA); +
+
+ /* go through the column list and retrieve the data-type of each column,
+ and then recursively describe column types. */
+
+ for (int i = 1; i <= numcols; i++)
+ {
+ /* get parameter for column i */
+ OciConn->OciCheckError(OCIParamGet((dvoid *)collsthd, OCI_DTYPE_PARAM, \
OciConn->m_OciHpError, (dvoid **)&colhd, (ub4)i)); +
+
+ ub2 col_type;
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)colhd, OCI_DTYPE_PARAM, (dvoid \
*)&col_type, (ub4 *)0, + OCI_ATTR_DATA_TYPE, OciConn->m_OciHpError));
+
+ /* for example, get datatype for ith column */
+ wchar_t *col_name=NULL;
+ int col_name_len=0;
+ OciConn->OciCheckError(OCIAttrGet((dvoid *)colhd, OCI_DTYPE_PARAM, (dvoid \
*)&col_name, (ub4 *)&col_name_len, + OCI_ATTR_NAME, OciConn->m_OciHpError));
+
+ // Retrieve the column type name attribute
+ wchar_t* col_type_name=NULL;
+ int col_type_name_len = 0;
+ OciConn->OciCheckError(OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid**) &col_type_name, (ub4 *) &col_type_name_len, (ub4) \
OCI_ATTR_TYPE_NAME, + (OCIError *) OciConn->m_OciHpError ));
+
+ /* Retrieve the length semantics for the column */
+ ub4 char_semantics = 0;
+ OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid*) &char_semantics,(ub4 *) 0, (ub4) OCI_ATTR_CHAR_USED,
+ (OCIError *) OciConn->m_OciHpError);
+
+ ub4 col_width = 0;
+ if (char_semantics)
+ /* Retrieve the column width in characters */
+ OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid*) &col_width, (ub4 *) 0, (ub4) OCI_ATTR_CHAR_SIZE,
+ (OCIError *) OciConn->m_OciHpError);
+ else
+ /* Retrieve the column width in bytes */
+ OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid*) &col_width,(ub4 *) 0, (ub4) OCI_ATTR_DATA_SIZE,
+ (OCIError *) OciConn->m_OciHpError);
+
+ // Retrieve the column precision
+ ub1 col_precision=0;
+ OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid*) &col_precision,(ub4 *) 0, (ub4) OCI_ATTR_PRECISION,
+ (OCIError *) OciConn->m_OciHpError);
+
+ // Retrieve the column size
+ ub1 col_scale=0;
+ OCIAttrGet((dvoid*) colhd, (ub4) OCI_DTYPE_PARAM,
+ (dvoid*) &col_scale,(ub4 *) 0, (ub4) OCI_ATTR_SCALE,
+ (OCIError *) OciConn->m_OciHpError);
+
+ FdoDataType fdotype;
+ bool isfdotype = \
c_FdoOra_API3::OraTypeToFdoDataType(col_type,col_precision,col_scale,col_width,fdotype);
+
+ if( isfdotype )
+ {
+
+ FdoPtr<FdoDataPropertyDefinition> dpd = \
FdoDataPropertyDefinition::Create(col_name, L""); + dpd->SetDataType(fdotype);
+ dpd->SetLength(col_width);
+ dpd->SetPrecision(col_precision);
+ dpd->SetScale(col_scale);
+
+ PropCollection->Add(dpd);
+ }
+ else
+ {
+ // perhaps it is geometry
+ if( col_type_name && wcscmp(col_type_name,L"SDO_GEOMETRY") == 0 )
+ {
+ FdoPtr<FdoPropertyDefinition> f = PropCollection->FindItem(col_name);
+ if( !f.p )
+ {
+ bool isz,ism;
+ FdoPtr<c_KgOraSpatialContext> spcontext = \
CreateSpatialContext(OciConn,Schema,TableName,col_name,SC_Collection,isz,ism); + \
FdoPtr<FdoGeometricPropertyDefinition> geomprop = \
FdoGeometricPropertyDefinition::Create(col_name,L""); + \
geomprop->SetHasElevation(isz); + geomprop->SetHasMeasure(ism);
+ if( spcontext.p )
+ {
+ geomprop->SetSpatialContextAssociation(spcontext->GetName());
+ }
+ PropCollection->Add(geomprop);
+ }
+
+
+ }
+
+ }
+ }
+
+ if (dschp)
+ OCIHandleFree((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
+
+
+
+}
+catch(c_Oci_Exception* exc)
+{
+ if (dschp)
+ OCIHandleFree((dvoid *) dschp, OCI_HTYPE_DESCRIBE);
+ FdoStringP gstr = exc->GetErrorText();
+ delete exc;
+ throw FdoException::Create( gstr );
+}
+ return true;
+}//end of c_FdoOra_API3::DescribeTableProperties
+
Added: branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.h
===================================================================
--- branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.h \
(rev 0)
+++ branches/3.9/Providers/KingOracle/src/Provider/c_FdoOra_API3.h 2014-04-10 \
23:05:42 UTC (rev 7070) @@ -0,0 +1,67 @@
+/*
+* Copyright (C) 2008 SL-King d.o.o
+*
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of version 2.1 of the GNU Lesser
+* General Public License as published by the Free Software Foundation.
+*
+* This library is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+* Lesser General Public License for more details.
+*
+* You should have received a copy of the GNU Lesser General Public
+* License along with this library; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+*/
+
+#ifndef _c_FdoOra_API3_h
+#define _c_FdoOra_API3_h
+
+#include "KingOracle/FdoKgOraOverrides.h"
+#include "c_KgOraSridDesc.h"
+#include "c_KgOraSpatialContext.h"
+#include "c_KgOraSchemaDesc.h"
+
+class c_MapOraNameToFdoClass;
+
+class FDOKGORA_API c_FdoOra_API3
+{
+public:
+ c_FdoOra_API3(void);
+public:
+ ~c_FdoOra_API3(void);
+
+ //static c_KgOraSchemaDesc* c_FdoOra_API3::DescribeSchema(c_Oci_Connection* \
OciConn,const char* OraSchema,const char* KingFdoViews); +
+ static c_KgOraSchemaDesc* DescribeSchema(c_Oci_Connection* OciConn,const wchar_t* \
ConnectionOraSchema,const wchar_t* UseOraSchema,const wchar_t* KingFdoViews,const \
wchar_t* SdeSchema); +
+ static bool OraTypeToFdoDataType(const char* OraType,int Precision,int Scale,int \
Length,FdoDataType & FdoType); +
+ static bool OraTypeToFdoDataType(ub2 OCiDataType,int Precision,int Scale,int \
Length,FdoDataType & FdoType); + static bool OraTypeToFdoDataType(const wchar_t* \
OraType,int Precision,int Scale,int Length,FdoDataType & FdoType); + static bool \
FdoPropertyToOraDataType(FdoPropertyDefinition* Property,FdoStringP& OraType); + \
//static bool FdoDataTypeToOraDataType(FdoDataType DataTape,oracle::occi::Type& \
OraType); +
+ static bool SetOracleStatementData(c_Oci_Statement* Statement,int \
SqlParamNum,FdoDataValue* DataValue); + static bool \
SetOracleStatementData(c_Oci_Statement* Statement,const \
wchar_t*SqlParamName,FdoDataValue* DataValue); +
+protected:
+/*
+ static void c_FdoOra_API3::DescribeSchemaSQL(oracle::occi::Connection * \
OraConn,oracle::occi::Statement* OraStm + \
,FdoClassCollection* FdoClasses,FdoKgOraClassCollection* \
PhysClasses,c_KgOraSpatialContextCollection* SC_Collection,long& AliasNum,bool \
IsOracle9=false); +*/
+ static bool DescribeTableProperties(c_Oci_Connection * OciConn,const \
wchar_t*Schema,const wchar_t*TableName,FdoPropertyDefinitionCollection* \
PropCollection,c_KgOraSpatialContextCollection* SC_Collection); + static bool \
DescribeTableProperties(c_Oci_Connection * OciConn,const wchar_t*SqlColumns,bool \
BindOwner,const wchar_t* OraOwner ,c_MapOraNameToFdoClass& MapOraToClass); + static \
bool DescribeTablePrimaryKey(c_Oci_Connection * OciConn,const wchar_t*SqlPkey,bool \
BindOwner,const wchar_t* OraOwner ,c_MapOraNameToFdoClass& MapOraToClass); + \
//static void DescribeSchemaSQL(c_Oci_Connection * OciConn,FdoClassCollection* \
FdoClasses,FdoKgOraClassCollection* PhysClasses ,c_KgOraSpatialContextCollection* \
SC_Collection,long& AliasNum,bool IsOracle9 ); + static void \
DescribeSchemaSQL(c_Oci_Connection * OciConn,const wchar_t* SqlStringTables, const \
wchar_t* SqlStringColumns,const wchar_t* SqlStringPkey + ,bool \
BindOwner,const wchar_t* ConnectionOraSchema,const wchar_t* Owner,FdoClassCollection* \
FdoClasses,FdoKgOraClassCollection* PhysClasses ,c_KgOraSpatialContextCollection* \
SC_Collection,long& AliasNum,bool IsOracle9 ); + static void \
DescribeSchemaSDE(c_Oci_Connection * OciConn,const wchar_t* Owner \
,FdoClassCollection* FdoClasses,FdoKgOraClassCollection* PhysClasses \
,c_KgOraSpatialContextCollection* SC_Collection,long& AliasNum ); + static bool \
CheckIfVersionedTableName(c_Oci_Connection * OciConn,const std::wstring& Owner,const \
std::wstring& ora_tablename,std::wstring& orig_tablename); + static \
c_KgOraSpatialContext* CreateSpatialContext(c_Oci_Connection * OciConn,const wchar_t* \
Owner,const wchar_t* Table,const wchar_t* GeometryColumn + \
,c_KgOraSpatialContextCollection* SC_Collection,bool& IsZ,bool& IsM); +
+};
+
+#endif
Added: branches/3.9/Providers/KingOracle/src/UnitTest/copy_debug_unittest.bat
===================================================================
--- branches/3.9/Providers/KingOracle/src/UnitTest/copy_debug_unittest.bat \
(rev 0)
+++ branches/3.9/Providers/KingOracle/src/UnitTest/copy_debug_unittest.bat 2014-04-10 \
23:05:42 UTC (rev 7070) @@ -0,0 +1,20 @@
+REM SET DESTDIR=%1
+SET DESTDIR=%~dp0\x64\Debug
+
+
+SET KINGORA_SOURCEDIR=%~dp0\..\..\bin\Win64\Debug
+
+
+ xcopy "%KINGORA_SOURCEDIR%\*.dll" %DESTDIR% /D /Y
+ if %errorlevel% neq 0 goto exit_on_copyerror
+ xcopy "%KINGORA_SOURCEDIR%\*.pdb" %DESTDIR% /D /Y
+ if %errorlevel% neq 0 goto exit_on_copyerror
+ echo King.Oracle files to %DESTDIR%
+
+exit /B %errorlevel%
+
+
+:exit_on_copyerror
+echo Error copy DEEO files to %DESTDIR%
+pause
+exit /B %errorlevel%
\ No newline at end of file
_______________________________________________
fdo-commits mailing list
fdo-commits@lists.osgeo.org
http://lists.osgeo.org/mailman/listinfo/fdo-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic