深入FDO----能力API

通过能力(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;

1.1.1 连接能力

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做一些额外的解释,因为MapGuideFDO连接池机制依赖于这个类所表示的能力,关于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是线程安全的,并发线程访问任何对象都是安全的。

1.1.2 模式能力

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;

}

// 对于StringBLOBCLOB数据类型,返回数据的最大长度

// 对于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();

// 是否支持类、要素类之间的继承关系

分享到:
评论
javahigh1
  • 浏览: 276082 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

你可能感兴趣的:(sql,活动,J#)