通过能力(Capabilities)API可以得到每个Provider支持哪些功能,从而根据不同Provider的不同的能力来控制代码的运行。FDO Provider的能力可做如下分类:
l 连接(Connection)
l 模式(Schema)
l 命令(Command)
l 表达式(Expression)
l 过滤器(Filter)
l 几何(Geometry)
l 光栅(Raster)
l 拓扑(Topology)
Provider的能力可以通过FdoIConnection对象的方法得到,一旦建立了某个Provider的连接,我们就可以查询该Provider的能力了。需要注意的是,虽然能力API中包含了分类“拓扑”,但是FDO并不支持拓扑,仅仅是因为历史的原因“拓扑”能力相关的API保留至今。
在下面的示例代码中,我们假定已经包含了“fdo.h”头文件,并且声明了connection。
#include <fdo.h>
FdoIConnection * connection;
类FdoIConnectionCapabilities用于获取Provider的连接能力。
FdoPtr<FdoIConnectionCapabilities> connectionCapabilities = connection->GetConnectionCapabilities(); // Provider的线程模型 FdoThreadCapability threadCapability = connectionCapabilities->GetThreadCapability();
FdoInt32 numSpatialContexts = 0; FdoSpatialContextExtentType* spatialContextExtentTypes = connectionCapabilities->GetSpatialContextTypes(numSpatialContexts);
// 是否支持锁定 bool supportsLocking = connectionCapabilities->SupportsLocking(); if (supportsLocking) { // 获得支持的锁类型 FdoInt32 numLockTypes; FdoLockType *lockTypes = connectionCapabilities->GetLockTypes(numLockTypes); // 遍历支持的锁类型 ...... }
// 是否支持设置Configuration,即方法FdoIConnection::SetConfiguration(...) bool supportsConfiguration = connectionCapabilities->SupportsConfiguration(); // 是否支持通过一个名称或ID指定坐标系名称,而无需指定WKT格式坐标系 bool supportsCSysWKTFromCSysName = connectionCapabilities->SupportsCSysWKTFromCSysName(); // 是否支持Flush功能,即方法FdoIConnection::Flush(). // Flush主要用于将缓存中的数据写回数据源 bool supportsFlush = connectionCapabilities->SupportsFlush(); // 是否支持长事务 bool supportsLongTransactions = connectionCapabilities->SupportsLongTransactions(); // 是否支持多个空间上下文 bool supportsMultipleSpatialContexts = connectionCapabilities->SupportsMultipleSpatialContexts(); // 是否支持多个用户同时修改Data Store bool supportsMultiUserWrite = connectionCapabilities->SupportsMultiUserWrite(); //是否支持SQL命令,即FdoISQLCommand bool supportsSQL = connectionCapabilities->SupportsSQL(); // 是否支持连接超时,即方法FdoIConnection::SetTimeout(...) bool supportsTimeout = connectionCapabilities->SupportsTimeout(); // 是否支持事务 bool supportsTransactions = connectionCapabilities->SupportsTransactions(); // 是否支持修改Data Store中的数据 bool supportsWrite = connectionCapabilities->SupportsWrite(); |
对于上面的代码,我们对类FdoThreadCapability做一些额外的解释,因为MapGuide的FDO连接池机制依赖于这个类所表示的能力,关于FDO连接池的内容请参考10.4.1。类FdoThreadCapability用于表示Provider的线程模型,FDO支持如下的线程模型。
l FdoThreadCapability_SingleThreaded:
Provider不是线程安全的,即不可以在多个并发线程中创建或使用FDO连接实例。
l FdoThreadCapability_PerConnectionThreaded
Provider支持在不同并发的线程中创建和使用不同的FDO连接实例,只要每个FDO连接对象在独立的线程中使用,那么可以在不同的线程中同时拥有多个活动的FDO连接对象。但是,多个并发线程不可以同时访问相同的FDO连接对象,一个命令对象只能在创建此命令的FDO连接中执行。
l FdoThreadCapability_PerCommandThreaded
Provider支持在不同的并发线程中使用相同的FDO连接创建和使用不同的FDO命令对象,但是不同的并发线程不可以使用相同的FDO命令对象。
l FdoThreadCapability_MultiThreaded
Provider是线程安全的,并发线程访问任何对象都是安全的。
类FdoISchemaCapabilities用于获取Provider的模式能力。
FdoPtr< FdoISchemaCapabilities> schemaCapabilities = connection->GetSchemaCapabilities();
// 获取支持的类类型 bool supportClass = false; bool supportFeatureClass = false; FdoInt32 numClassTypes = 0; FdoClassType* classTypes = schemaCapabilities->GetClassTypes(numClassTypes); for (int i = 0; i < numClassTypes; ++i) { switch (classTypes[i]) { case FdoClassType_Class: // 是否支持类 supportClass = true; break; case FdoClassType_FeatureClass: // 是否支持要素类 supportFeatureClass = true; break; } }
// 获取支持的数据类型 FdoInt32 numDataTypes = 0; FdoDataType* dataTypes = schemaCapabilities->GetDataTypes(numDataTypes); // 遍历支持的数据类型 bool supportBooleanDataType = false; bool supportByteDataType = false; bool supportDateTimeDataType = false; bool supportDecimalDataType = false; bool supportDoubleDataType = false; bool supportInt16DataType = false; bool supportInt32DataType = false; bool supportInt64DataType = false; bool supportSingleDataType = false; bool supportStringDataType = false; bool supportBLOBDataType = false; bool supportCLOBDataType = false; FdoInt32 maxDecimalScale = 0; FdoInt32 maxDecimalPrecision = 0; for (int j = 0; j < numDataTypes; ++j) { switch (numDataTypes[j]) { case FdoDataType_Boolean: // 是否支持Boolean数据类型 supportBooleanDataType = true; break; case FdoDataType_Byte: // 是否支持Byte数据类型 supportByteDataType = true; break; case FdoDataType_DateTime: // 是否支持DateTime数据类型 supportDateTimeDataType = true; break; case FdoDataType_Decimal: // 是否支持Decimal数据类型 supportDemicalDataType = true; // 获取Decimal数据类型的最大Scale maxDecimalScale = schemaCapabilities->GetMaximumDecimalScale(); // 获取Decimal数据类型的最大Precision maxDecimalPrecision = schemaCapabilities->GetMaximumDecimalPrecision(); break; case FdoDataType_Double: // 是否支持Double数据类型 supportDoubleDataType = true; break; case FdoDataType_Int16: // 是否支持Int16数据类型 supportInt16DataType = true; break; case FdoDataType_Int32: // 是否支持Int32数据类型 supportInt32DataType = true; break; case FdoDataType_Int64: // 是否支持Int64数据类型 supportInt64DataType = true; break; case FdoDataType_Single: // 是否支持Single数据类型 supportSingleDataType = true; break; case FdoDataType_String: // 是否支持String数据类型 supportStringDataType = true; break; case FdoDataType_BLOB: // 是否支持BLOB数据类型 supportBLOBDataType = true; break; case FdoDataType_CLOB: // 是否支持CLOB数据类型 supportCLOBDataType = true; break; } // 对于String、BLOB、CLOB数据类型,返回数据的最大长度 // 对于Decimal数据类型,返回scale加上precision的总长度 // 对于其他数据类型,返回数据占用的字节数 FdoInt64 maxLength = schemaCapabilities->GetMaximumDataValueLength((FdoDataType)numDataTypes[j]); }
// 获取在命名模式元素时不可以使用的字符 FdoInt32 numReservedCharactersForName = 0; FdoString* reservedCharactersForName = schemaCapabilities->GetReservedCharactersForName(numReservedCharactersForName); // 遍历在命名模式元素时不可以使用的字符 ......
// 获取支持自动生成值的数据类型 FdoInt32 num autoGeneratedTypes = 0; FdoDataTypes* autoGeneratedTypes = schemaCapabilities->GetSupportedAutoGeneratedTypes(autoGeneratedTypes); // 遍历支持自动生成值的数据类型 ......
// 获取可以充当主键属性的数据类型 FdoInt32 num IdentityPropertyTypes = 0; FdoDataTypes* identityPropertyTypes = schemaCapabilities->GetSupportedIdentityPropertyTypes(IdentityPropertyTypes); // 遍历可以充当主键属性的数据类型 ......
// 是否支持关联属性 bool supportsAssociationProperties = schemaCapabilities->SupportsAssociationProperties(); // 是否支持自动生成ID值 bool supportsAutoIdGeneration = schemaCapabilities->SupportsAutoIdGeneration(); // 是否支持复合主键属性,即由多个属性组成类的主键属性 bool supportsCompositeId = schemaCapabilities->SupportsCompositeId(); // 是否支持复合唯一性约束,即由多个属性值组成的值的唯一性约束 bool supportsCompositeId = schemaCapabilities->SupportsCompositeUniqueValueConstraints(); // 是否支持生成整个Data Store范围内全局唯一的ID bool supportsDataStoreScopeUniqueIdGeneration = schemaCapabilities->SupportsDataStoreScopeUniqueIdGeneration(); // 是否支持为属性指定一个默认值 bool supportsDefaultValue = schemaCapabilities->SupportsDefaultValue(); // 是否支持类、要素类之间的继承关系
发表评论
最新评论
|
评论