API与FDO Provider的能力


发布日期 : 2016-10-27 09:49:38 UTC

访问量: 189 次浏览

通过能力(Capabilities)API可以得到每个Provider支持功能,根据不同Provider的不同的能力来控制代码的运行。FDO Provider的能力可做如下分类:连接(Connection);模式(Schema);命令(Command);表达式(Expression);过滤器(Filter);几何(Geometry);光栅(Raster);拓扑(Topology).

通过FdoIConnection对象的方法可以得到Provider的能力,我们通过建立某个Provider的连接,可以查询该Provider的能力。 说明:在下面的示例代码中,假定已经包含了“fdo.h”头文件,并且声明了connection。 <pre class="brush:py"> #include <fdo.h> FdoIConnection * connection; </pre>

1.1.1 连接能力

获取Provider的连接能力的类FdoIConnectionCapabilities。

<pre class="brush:py">

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();} 

</pre> 对类FdoThreadCapability的解释,因为MapGuide的FDO连接池机制依赖于这个类所表示的能力。Provider的线程模型由类FdoThreadCapability表示,FDO支持如下的线程模型。 FdoThreadCapability_SingleThreaded;FdoThreadCapability_PerConnectionThreaded ;FdoThreadCapability_PerCommandThreaded ;FdoThreadCapability_MultiThreaded 。

1.1.2 模式能力

获取Provider的模式能力的类FdoISchemaCapabilities。 <pre class="brush:py">

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

</pre>

1.1.3 命令能力

获取Provider的命令能力的类FdoICommandCapabilities。 <pre class="brush:py">

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

</pre>

1.1.4表达式能力

获取Provider的表达式能力的类FdoIExpressionCapabilitie。 <pre class="brush:py">

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(); } } 

</pre>

1.1.5 过滤器能力

获取Provider的过滤器能力的类FdoIFilterCapabilities。 <pre class="brush:py">

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

</pre>

1.1.6 几何能力

获取Provider的过滤器能力的类FdoIGeometryCapabilities。 <pre class="brush:py">

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) { ...... } 

</pre>

1.1.7栅格能力

获取Provider的过滤器能力的类FdoIRasterCapabilities。 <pre class="brush:py">

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); } 

</pre>