通过能力(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做一些额外的解释,因为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是线程安全的,并发线程访问任何对象都是安全的。
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; } // 对于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(); // 是否支持类、要素类之间的继承关系 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();
// 获取支持的条件类型,即比较、Like、In、空间、距离等条件 FdoInt32 numConditionTypes = 0; FdoConditionType* conditionTypes = filterCapabilities->GetConditionTypes(numConditionTypes); // 遍历支持的条件类型 ......
//获取支持的距离操作符,目前FDO共有Beyond和Within两种操作符 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,这意味着X,Y值是不可或缺的 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); } |