⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 icolumnsrowsetimpl.h

📁 GIS系统支持库Geospatial Data Abstraction Library代码.GDAL is a translator library for raster geospatial dat
💻 H
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************** * $Id: IColumnsRowsetImpl.h,v 1.1 2002/08/09 21:36:17 warmerda Exp $ * * Project:  OpenGIS Simple Features Reference Implementation * Purpose:  IColumnsRowsetImpl template class. * Author:   Len Holgate, len.holgate@jetbyte.com * * This code was cribbed from web articles by Len.  More information can * be found at:  http://www.jetbyte.com/Source/COM/OLEDB/oledb.htm * ****************************************************************************** * Copyright (c) 2001, JetByte Limited (www.jetbyte.com) * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. ****************************************************************************** * * $Log: IColumnsRowsetImpl.h,v $ * Revision 1.1  2002/08/09 21:36:17  warmerda * New * * Revision 1.4  2001/10/15 15:21:07  warmerda * pass raw data points to GetRCDBStatus * * Revision 1.3  2001/05/31 02:55:30  warmerda * return NULL values for OGC IColumnRowset fields on non-spatial fields * * Revision 1.2  2001/05/30 20:27:51  warmerda * strip LFs * * Revision 1.1  2001/05/28 19:34:13  warmerda * New * */#ifndef __I_COLUMNS_ROWSET_IMPL__INCLUDED__#define __I_COLUMNS_ROWSET_IMPL__INCLUDED__#include <atlcom.h>#include <atldb.h>#include "ICRRowsetImpl.h"#define PROVIDER_COLUMN_ENTRY_DBID(name, dbid, ordinal, member) \{ \	(LPOLESTR)OLESTR(name), \	(ITypeInfo*)NULL, \	(ULONG)ordinal, \	DBCOLUMNFLAGS_ISFIXEDLENGTH, \   (ULONG)sizeof(((_Class*)0)->member), \	_GetOleDBType(((_Class*)0)->member), \	(BYTE)0, \	(BYTE)0, \	{ \		EXPANDGUID(dbid.uGuid.guid), \		(DWORD)dbid.eKind, \      (LPOLESTR)dbid.uName.ulPropid\	}, \   offsetof(_Class, member) \},class CColumnsRowsetRow{  public:    WCHAR    m_DBCOLUMN_IDNAME[129];    GUID     m_DBCOLUMN_GUID;    ULONG    m_DBCOLUMN_PROPID;    WCHAR    m_DBCOLUMN_NAME[129];    ULONG    m_DBCOLUMN_NUMBER;    USHORT   m_DBCOLUMN_TYPE;    IUnknown *m_DBCOLUMN_TYPEINFO;    ULONG    m_DBCOLUMN_COLUMNSIZE;    USHORT   m_DBCOLUMN_PRECISION;    USHORT   m_DBCOLUMN_SCALE;    ULONG    m_DBCOLUMN_FLAGS;    WCHAR    m_DBCOLUMN_BASECOLUMNNAME[129];    WCHAR    m_DBCOLUMN_BASETABLENAME[129];       BOOL     m_DBCOLUMN_KEYCOLUMN;    // special to our provider.    unsigned int m_nGeomType;    int	    m_nSpatialRefId;    WCHAR    m_pszSpatialRefSystem[10240];       CColumnsRowsetRow()	{            ClearMembers();	}    void ClearMembers()	{            m_DBCOLUMN_IDNAME[0] = NULL;            m_DBCOLUMN_GUID = GUID_NULL;            m_DBCOLUMN_PROPID = 0;            m_DBCOLUMN_NAME[0] = 0;            m_DBCOLUMN_NUMBER = 0;            m_DBCOLUMN_TYPE = 0;            m_DBCOLUMN_TYPEINFO = 0;            m_DBCOLUMN_COLUMNSIZE = 0;            m_DBCOLUMN_PRECISION = 0;            m_DBCOLUMN_SCALE = 0;            m_DBCOLUMN_FLAGS = 0;            m_DBCOLUMN_BASECOLUMNNAME[0] = NULL;            m_DBCOLUMN_BASETABLENAME[0] = NULL;            m_DBCOLUMN_KEYCOLUMN = FALSE;            m_nGeomType = 0;            m_nSpatialRefId = 0;            lstrcpyW(m_pszSpatialRefSystem,L"" );        }    BEGIN_PROVIDER_COLUMN_MAP(CColumnsRowsetRow)	PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_IDNAME", DBCOLUMN_IDNAME, 1, m_DBCOLUMN_IDNAME)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_GUID", DBCOLUMN_GUID, 2, m_DBCOLUMN_GUID)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_PROPID", DBCOLUMN_PROPID, 3, m_DBCOLUMN_PROPID)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_NAME", DBCOLUMN_NAME, 4, m_DBCOLUMN_NAME)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_NUMBER", DBCOLUMN_NUMBER, 5, m_DBCOLUMN_NUMBER)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_TYPE", DBCOLUMN_TYPE, 6, m_DBCOLUMN_TYPE)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_TYPEINFO", DBCOLUMN_TYPEINFO, 7, m_DBCOLUMN_TYPEINFO)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_COLUMNSIZE", DBCOLUMN_COLUMNSIZE, 8, m_DBCOLUMN_COLUMNSIZE)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_PRECISION", DBCOLUMN_PRECISION, 9, m_DBCOLUMN_PRECISION)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_SCALE", DBCOLUMN_SCALE, 10, m_DBCOLUMN_SCALE)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_FLAGS", DBCOLUMN_FLAGS, 11, m_DBCOLUMN_FLAGS)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_BASECOLUMNNAME", DBCOLUMN_BASECOLUMNNAME, 12, m_DBCOLUMN_BASECOLUMNNAME)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_BASETABLENAME", DBCOLUMN_BASETABLENAME, 13, m_DBCOLUMN_BASETABLENAME)        PROVIDER_COLUMN_ENTRY_DBID("DBCOLUMN_KEYCOLUMN", DBCOLUMN_KEYCOLUMN, 14, m_DBCOLUMN_KEYCOLUMN)        PROVIDER_COLUMN_ENTRY("GEOM_TYPE",15,m_nGeomType)        PROVIDER_COLUMN_ENTRY("SPATIAL_REF_SYSTEM_ID",16,m_nSpatialRefId)        PROVIDER_COLUMN_ENTRY("SPATIAL_REF_SYSTEM_WKT",17,m_pszSpatialRefSystem)        END_PROVIDER_COLUMN_MAP()        };template <class T, class CreatorClass>class ATL_NO_VTABLE IColumnsRowsetImpl : public IColumnsRowset{  public:    class CColumnsRowsetRowset :         public CRowsetImpl< CColumnsRowsetRowset , CColumnsRowsetRow, CreatorClass, CSimpleArray<CColumnsRowsetRow>, CSimpleRow, ICRRowsetImpl< CColumnsRowsetRowset,IRowset > >        {          public:            DBSTATUS GetRCDBStatus(CSimpleRow* poRC,                                   ATLCOLUMNINFO*poColInfo,                                   void *)            {                T* pT = (T*) this;                ULONG      row_id = poRC->m_iRowset;                CColumnsRowsetRow *psRow;                if( lstrcmpW(poColInfo->pwszName,L"GEOM_TYPE") != 0                    && lstrcmpW(poColInfo->pwszName,                                L"SPATIAL_REF_SYSTEM_ID") != 0                    && lstrcmpW(poColInfo->pwszName,                                L"SPATIAL_REF_SYSTEM_WKT") != 0 )                    return DBSTATUS_S_OK;                psRow = &(m_rgRowData[row_id]);                if( lstrcmpW(psRow->m_DBCOLUMN_NAME,L"OGIS_GEOMETRY") == 0 )                    return DBSTATUS_S_OK;                                return DBSTATUS_S_ISNULL;            }            HRESULT PopulateRowset(ULONG numCols, DBCOLUMNINFO *pColInfo,                                   OGRDataSource *poDS, int iLayer )                {                    OGRLayer      *poLayer = poDS->GetLayer(iLayer);                    USES_CONVERSION;                                        for (ULONG i = 0 ; i < numCols; i++)                    {                        // copy data out of the pColInfo struct and into the                         // rowset array                         CColumnsRowsetRow data;                        // Should select the name correctly, rather than just assuming we'll use the name and                        // not the guid and propid..                        lstrcpynW(data.m_DBCOLUMN_IDNAME, pColInfo[i].pwszName , sizeof(data.m_DBCOLUMN_IDNAME));                        data.m_DBCOLUMN_GUID = GUID_NULL;                        data.m_DBCOLUMN_PROPID = 0;                                          lstrcpynW(data.m_DBCOLUMN_NAME, pColInfo[i].pwszName , sizeof(data.m_DBCOLUMN_NAME));                        data.m_DBCOLUMN_NUMBER = pColInfo[i].iOrdinal;                        data.m_DBCOLUMN_TYPE = pColInfo[i].wType;                        data.m_DBCOLUMN_TYPEINFO = pColInfo[i].pTypeInfo;                        data.m_DBCOLUMN_COLUMNSIZE = pColInfo[i].ulColumnSize;                        data.m_DBCOLUMN_PRECISION = pColInfo[i].bPrecision;                        data.m_DBCOLUMN_SCALE = pColInfo[i].bScale;                        data.m_DBCOLUMN_FLAGS = pColInfo[i].dwFlags;                        lstrcpynW(data.m_DBCOLUMN_BASECOLUMNNAME, pColInfo[i].pwszName, sizeof(data.m_DBCOLUMN_BASECOLUMNNAME));                        lstrcpynW(data.m_DBCOLUMN_BASETABLENAME, L"Table", sizeof(data.m_DBCOLUMN_BASETABLENAME));                        data.m_DBCOLUMN_KEYCOLUMN = (pColInfo[i].iOrdinal == 0) || (pColInfo[i].dwFlags & DBCOLUMNFLAGS_ISROWID);                        // Base the keycolumn decision on the flags too?                        // Keycolumn is only used if the column has been displayed :( Pity as this renders the bookmarks                        // useless..                        // Set the OGIS related information, if this is the                        // spatial column.                        if( lstrcmpW(pColInfo[i].pwszName,L"OGIS_GEOMETRY") == 0)                        {                            data.m_nGeomType =                                SFWkbGeomTypeToDBGEOM(poLayer->GetLayerDefn()->GetGeomType());                            OGRSpatialReference *poSpatRef;                            char      *pszSpatRef = NULL;                            poSpatRef = poLayer->GetSpatialRef();                                                        if( poSpatRef != NULL                                && poSpatRef->exportToWkt(&pszSpatRef)                                                              == OGRERR_NONE )                            {                                 data.m_nSpatialRefId = iLayer;                                 lstrcpyW(data.m_pszSpatialRefSystem,                                           A2OLE(pszSpatRef));                                 OGRFree( pszSpatRef );                            }                            else                            {                                 data.m_nSpatialRefId = poDS->GetLayerCount()+1;                                 lstrcpyW(data.m_pszSpatialRefSystem,L"" );                            }                        }                        else                        {                            data.m_nGeomType = 0;                            data.m_nSpatialRefId = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -