深入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();

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

bool supportsInheritance = schemaCapabilities->SupportsInheritance();

// 是否支持多个模式

bool supportsMultipleSchemas = schemaCapabilities->SupportsMultipleSchemas();

// 是否支持网络拓扑模型,目前所有的FDO Provider都不支持网络拓扑模型

bool supportsNetworkModel = schemaCapabilities->SupportsNetworkModel();

// 是否支持NULL约束,即属性值可以为NULL

bool supportsNullValueConstraints = schemaCapabilities->SupportsNullValueConstraints();

// 是否支持对象属性

bool supportsObjectProperties = schemaCapabilities->SupportsObjectProperties();

// 是否支持修改模式

bool supportsSchemaModification = schemaCapabilities->SupportsSchemaModification();

// 是否支持模式覆盖

bool supportsSchemaOverrides = schemaCapabilities->SupportsSchemaOverrides();

// 是否支持唯一约束,即属性值必须唯一

bool supportsUniqueValueConstraints =

schemaCapabilities-> SupportsUniqueValueConstraints();

// 是否支持域约束,即属性值必须为预定义值中的某个值

bool supportsValueConstraintsList = schemaCapabilities->SupportsValueConstraintsList();

1.1.3        命令能力

FdoICommandCapabilities用于获取Provider的命令能力。

FdoPtr<FdoICommandCapabilities> commandCapabilities =

connection->GetCommandCapabilities();

 

// 获取支持的FDO命令

FdoInt32 numCommandTypes = 0;

FdoInt32 *commandTypes = commandCapabilities->GetCommands(numCommandTypes);

// 遍历支持的FDO命令

bool supportSelectCommand = false;

bool supportInsertCommand = false;

bool supportDeleteCommand = false;

bool supportUpdateCommand = false;

bool supportDescribeSchemaCommand = false;

bool supportDescribeSchemaMappingCommand = false;

bool supportApplySchemaCommand = false;

bool supportDestroySchemaCommand = false;

......

for (int i = 0; i < numCommandTypes; ++i) {

    switch (commandTypes[i]) {

case FdoCommandType_Select:

supportSelectCommand = true;

    break;

case FdoCommandType_Insert:

    supportInsertCommand = true;

break;

case FdoCommandType_Delete:

supportDeleteCommand = true;

    break;

case FdoCommandType_Update:

supportUpdateCommand = true;

    break;

case FdoCommandType_DescribeSchema:

supportDescribeSchemaCommand = true;

    break;

case FdoCommandType_DescribeSchemaMapping:

supportDescribeSchemaMappingCommand = true;

    break;

case FdoCommandType_ApplySchema:

supportApplySchemaCommand = true;

    break;

case FdoCommandType_DestroySchema:

supportDestroySchemaCommand = true;

    break;

......

}

}

 

// 是否支持命令参数绑定

bool supportsParameters = commandCapabilities->SupportsParameters();

// 是否支持命令执行超时

bool supportsTimeout = commandCapabilities->SupportsTimeout();

// 是否支持在查询和聚集查询命令中使用表达式

bool supportsSelectExpressions = commandCapabilities->SupportsSelectExpressions();

// 是否支持在查询和聚集查询命令中使用表达式

bool supportsSelectFunctions = commandCapabilities->SupportsSelectFunctions();

// 是否支持在聚集查询命令中使用Distinct操作

bool supportsSelectDistinct = commandCapabilities->SupportsSelectDistinct();

// 是否支持在聚集查询命令中使用排序操作

bool supportsSelectOrdering = commandCapabilities->SupportsSelectOrdering();

// 是否支持在聚集查询命令中使用分组操作

bool supportsSelectGrouping = commandCapabilities->SupportsSelectGrouping();

1.1.4        表达式能力

FdoIExpressionCapabilities用于获取Provider的表达式能力。

FdoPtr<FdoIExpressionCapabilities> expressionCapabilities =

connection->GetExpressionCapabilities();

 

// 获取支持的表达式

FdoInt32 numExpressionTypes = 0;

FdoExpressionType* expressionTypes =

expressionCapabilities->GetExpressionTypes(numExpressionTypes);

// 遍历支持的表达式

bool supportExpressionTypeBasic = false;

bool supportExpressionTypeFunction = false;

bool supportExpressionTypeParameter = false;

for (int i = 0; i < numExpressionTypes; ++i) {

    switch (numExpressionTypes[i]) {

case FdoExpressionType_Basic:

    // 是否支持基本表达式

    supportExpressionTypeBasic = true;

break;

case FdoExpressionType_Function:

    // 是否支持在表达式中使用函数

supportExpressionTypeFunction = true;

break;

case FdoExpressionType_Parameter:

    // 是否支持参数替换

supportExpressionTypeParameter = true;

break;

}

}

 

// 获取在表达式中可以使用的函数

FdoPtr<FdoFunctionDefinitionCollection> functions =

expressionCapabilities->GetFunctions();

FdoInt32 numFunctionDefinitions = functions->GetCount();

for (int i = 0; i < numFunctionDefinitions; i++) {

FdoPtr<FdoFunctionDefinition> functionDefinition = functions->GetItem(i);

FdoString* functionName = functionDefinition->GetName();

FdoString* functionDescription = functionDefinition->GetDescription();

FdoPtr< FdoReadOnlyArgumentDefinitionCollection > arguments =

functionDefinition->GetArguments();

FdoInt32 numArgumentDefinitions = arguments->GetCount();

for ( int j = 0; j < numArgumentDefinitions; j++) {

FdoPtr<FdoArgumentDefinition> argumentDefinition = arguments->GetItem(j);

FdoString* argumentName = argumentDefinition->GetName();

FdoString* argumentDescription = argumentDefinition->GetDescription();

FdoDataType argumentType = argumentDefinition->GetDataType();

}

}

1.1.5        过滤器能力

FdoIFilterCapabilities用于获取Provider的过滤器能力。

FdoPtr<FdoIFilterCapabilities> filterCapabilities = connection->GetFilterCapabilities();

 

// 获取支持的条件类型,即比较、LikeIn、空间、距离等条件

FdoInt32 numConditionTypes = 0;

FdoConditionType* conditionTypes =

filterCapabilities->GetConditionTypes(numConditionTypes);

// 遍历支持的条件类型

......

 

//获取支持的距离操作符,目前FDO共有BeyondWithin两种操作符

FdoInt32 numSpatialOperations = 0;

FdoDistanceOperations* distanceOperations =

filterCapabilities->GetDistanceOperations(numSpatialOperations);

// 遍历支持的距离操作符

......

 

// 获取支持的空间操作符

FdoInt32 numSpatialOperations = 0;

FdoSpatialOperations* spatialOperations =

filterCapabilities->GetSpatialOperations(numSpatialOperations);

// 遍历支持的空间操作符

......

 

// 是否支持测地距(Geodesic Distance)测量

bool supportsGeodesicDistance = filterCapabilities->SupportsGeodesicDistance();

bool supportsNonLiteralGeometricOperations =

filterCapabilities->SupportsNonLiteralGeometricOperations();

1.1.6        几何能力

FdoIGeometryCapabilities用于获取Provider的过滤器能力。

FdoPtr<FdoIGeometryCapabilities> geometryCapabilities =

connection->GetGeometryCapabilities();

 

// 获取支持的几何类型

FdoInt32 numGeometryTypes = 0;

FdoGeometryType *geometryTypes =

geometryCapabilities->GetGeometryTypes(numGeometryTypes);

// 遍历支持的几何类型

......

 

// 获取支持的几何组件类型

FdoInt32 numGeometryComponnentTypes = 0;

FdoGeometryComponentType* geometryComponentTypes =

geometryCapabilities->GetGeometryComponentTypes(numGeometryComponentTypes);

// 遍历支持的几何组件类型

......

 

FdoInt32 dimensionalities = geometryCapabilities->GetDimensionalities();

// FdoDimensinality_XY的值是0,这意味着XY值是不可或缺的

if (dimensionalities & FdoDimensionality_Z) {

......

}

if (dimensionalities & FdoDimensionality_M) {

......

}

1.1.7        栅格能力

FdoIRasterCapabilities用于获取Provider的过滤器能力。

FdoPtr<FdoIRasterCapabilities> rasterCapabilities = connection->GetRasterCapabilities();

bool supportsRaster = rasterCapabilities->SupportsRaster();

if (supportsRaster) {

bool supportsStitching = rasterCapabilities->SupportsStitching();

bool supportsSubsampling = rasterCapabilities->SupportsSubsampling();

FdoPtr<FdoRasterDataModel> rgbRasterDataModel = FdoRasterDataModel::Create();

rgbRasterDataModel->SetDataModelType(FdoRasterDataModelType_RGB);

rgbRasterDataModel->SetBitsPerPixel(64);

rgbRasterDataModel->SetOrganization(FdoRasterDataOrganization_Image);

rgbRasterDataModel->SetTileSizeX(64);

rgbRasterDataModel->SetTileSizeY(128);

bool supportsDataModel = rasterCapabilities->SupportsDataModel(rgbRasterDataModel);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值