摘要: 通过能力(Capabilities)API可以得到每个Provider支持功能,根据不同Provider的不同的能力来控制代码的运行。FDO Provider的能力可做如下分类:连接(Connection);模式(Schema);命令(Command);表达式...
通过能力(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;
}
// 对于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();
</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>