API与FDO Provider的能力

2016-10-27 作者: 黄馨宁 浏览: 198 次

摘要: 通过能力(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&lt;FdoIConnectionCapabilities&gt; connectionCapabilities =
connection-&gt;GetConnectionCapabilities();
// Provider的线程模型
FdoThreadCapability  threadCapability = connectionCapabilities-&gt;GetThreadCapability();

FdoInt32 numSpatialContexts = 0;
FdoSpatialContextExtentType* spatialContextExtentTypes =
connectionCapabilities-&gt;GetSpatialContextTypes(numSpatialContexts);

// 是否支持锁定
bool supportsLocking = connectionCapabilities-&gt;SupportsLocking();
if (supportsLocking) {
// 获得支持的锁类型
FdoInt32 numLockTypes;
FdoLockType *lockTypes = connectionCapabilities-&gt;GetLockTypes(numLockTypes);
// 遍历支持的锁类型
......
}

// 是否支持设置Configuration,即方法FdoIConnection::SetConfiguration(...)
bool supportsConfiguration = connectionCapabilities-&gt;SupportsConfiguration();
// 是否支持通过一个名称或ID指定坐标系名称,而无需指定WKT格式坐标系
bool supportsCSysWKTFromCSysName =
connectionCapabilities-&gt;SupportsCSysWKTFromCSysName();
// 是否支持Flush功能,即方法FdoIConnection::Flush().
// Flush主要用于将缓存中的数据写回数据源
bool supportsFlush = connectionCapabilities-&gt;SupportsFlush();
// 是否支持长事务
bool supportsLongTransactions = connectionCapabilities-&gt;SupportsLongTransactions();
// 是否支持多个空间上下文
bool supportsMultipleSpatialContexts =
connectionCapabilities-&gt;SupportsMultipleSpatialContexts();
// 是否支持多个用户同时修改Data Store
bool supportsMultiUserWrite = connectionCapabilities-&gt;SupportsMultiUserWrite();
//是否支持SQL命令,即FdoISQLCommand
bool supportsSQL = connectionCapabilities-&gt;SupportsSQL();
// 是否支持连接超时,即方法FdoIConnection::SetTimeout(...)
bool supportsTimeout = connectionCapabilities-&gt;SupportsTimeout();
// 是否支持事务
bool supportsTransactions = connectionCapabilities-&gt;SupportsTransactions();
// 是否支持修改Data Store中的数据
bool supportsWrite = connectionCapabilities-&gt;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&lt; FdoISchemaCapabilities&gt; schemaCapabilities =
connection-&gt;GetSchemaCapabilities();

// 获取支持的类类型
bool supportClass = false;
bool supportFeatureClass = false;
FdoInt32 numClassTypes = 0;
FdoClassType* classTypes = schemaCapabilities-&gt;GetClassTypes(numClassTypes);
for (int i = 0; i &lt; numClassTypes; ++i) {
switch (classTypes[i]) {
case FdoClassType_Class:
// 是否支持类
supportClass = true;
break;
case FdoClassType_FeatureClass:
// 是否支持要素类
supportFeatureClass = true;
break;
}
}

// 获取支持的数据类型
FdoInt32 numDataTypes = 0;
FdoDataType* dataTypes = schemaCapabilities-&gt;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 &lt; 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-&gt;GetMaximumDecimalScale();
// 获取Decimal数据类型的最大Precision
maxDecimalPrecision = schemaCapabilities-&gt;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-&gt;GetMaximumDataValueLength((FdoDataType)numDataTypes[j]);
}

// 获取在命名模式元素时不可以使用的字符
FdoInt32 numReservedCharactersForName = 0;
FdoString* reservedCharactersForName =
schemaCapabilities-&gt;GetReservedCharactersForName(numReservedCharactersForName);
// 遍历在命名模式元素时不可以使用的字符
......

// 获取支持自动生成值的数据类型
FdoInt32 num autoGeneratedTypes = 0;
FdoDataTypes* autoGeneratedTypes =
schemaCapabilities-&gt;GetSupportedAutoGeneratedTypes(autoGeneratedTypes);
// 遍历支持自动生成值的数据类型
......

// 获取可以充当主键属性的数据类型
FdoInt32 num IdentityPropertyTypes = 0;
FdoDataTypes* identityPropertyTypes =
schemaCapabilities-&gt;GetSupportedIdentityPropertyTypes(IdentityPropertyTypes);
// 遍历可以充当主键属性的数据类型
......

// 是否支持关联属性
bool supportsAssociationProperties = schemaCapabilities-&gt;SupportsAssociationProperties();
// 是否支持自动生成ID值
bool supportsAutoIdGeneration = schemaCapabilities-&gt;SupportsAutoIdGeneration();
// 是否支持复合主键属性,即由多个属性组成类的主键属性
bool supportsCompositeId = schemaCapabilities-&gt;SupportsCompositeId();
// 是否支持复合唯一性约束,即由多个属性值组成的值的唯一性约束
bool supportsCompositeId =
schemaCapabilities-&gt;SupportsCompositeUniqueValueConstraints();
// 是否支持生成整个Data Store范围内全局唯一的ID
bool supportsDataStoreScopeUniqueIdGeneration =
schemaCapabilities-&gt;SupportsDataStoreScopeUniqueIdGeneration();
// 是否支持为属性指定一个默认值
bool supportsDefaultValue = schemaCapabilities-&gt;SupportsDefaultValue();
// 是否支持类、要素类之间的继承关系
bool supportsInheritance = schemaCapabilities-&gt;SupportsInheritance();
// 是否支持多个模式
bool supportsMultipleSchemas = schemaCapabilities-&gt;SupportsMultipleSchemas();
// 是否支持网络拓扑模型,目前所有的FDO Provider都不支持网络拓扑模型
bool supportsNetworkModel = schemaCapabilities-&gt;SupportsNetworkModel();
// 是否支持NULL约束,即属性值可以为NULL
bool supportsNullValueConstraints = schemaCapabilities-&gt;SupportsNullValueConstraints();
// 是否支持对象属性
bool supportsObjectProperties = schemaCapabilities-&gt;SupportsObjectProperties();
// 是否支持修改模式
bool supportsSchemaModification = schemaCapabilities-&gt;SupportsSchemaModification();
// 是否支持模式覆盖
bool supportsSchemaOverrides = schemaCapabilities-&gt;SupportsSchemaOverrides();
// 是否支持唯一约束,即属性值必须唯一
bool supportsUniqueValueConstraints =
schemaCapabilities-&gt; SupportsUniqueValueConstraints();
// 是否支持域约束,即属性值必须为预定义值中的某个值
bool supportsValueConstraintsList = schemaCapabilities-&gt;SupportsValueConstraintsList();

</pre>

1.1.3 命令能力

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

FdoPtr&lt;FdoICommandCapabilities&gt; commandCapabilities =
connection-&gt;GetCommandCapabilities();

// 获取支持的FDO命令
FdoInt32 numCommandTypes = 0;
FdoInt32 *commandTypes = commandCapabilities-&gt;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 &lt; 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-&gt;SupportsParameters();
// 是否支持命令执行超时
bool supportsTimeout = commandCapabilities-&gt;SupportsTimeout();
// 是否支持在查询和聚集查询命令中使用表达式
bool supportsSelectExpressions = commandCapabilities-&gt;SupportsSelectExpressions();
// 是否支持在查询和聚集查询命令中使用表达式
bool supportsSelectFunctions = commandCapabilities-&gt;SupportsSelectFunctions();
// 是否支持在聚集查询命令中使用Distinct操作
bool supportsSelectDistinct = commandCapabilities-&gt;SupportsSelectDistinct();
// 是否支持在聚集查询命令中使用排序操作
bool supportsSelectOrdering = commandCapabilities-&gt;SupportsSelectOrdering();
// 是否支持在聚集查询命令中使用分组操作
bool supportsSelectGrouping = commandCapabilities-&gt;SupportsSelectGrouping();

</pre>

1.1.4表达式能力

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

FdoPtr&lt;FdoIExpressionCapabilities&gt; expressionCapabilities =
connection-&gt;GetExpressionCapabilities();

// 获取支持的表达式
FdoInt32 numExpressionTypes = 0;
FdoExpressionType* expressionTypes =
expressionCapabilities-&gt;GetExpressionTypes(numExpressionTypes);
// 遍历支持的表达式
bool supportExpressionTypeBasic = false;
bool supportExpressionTypeFunction = false;
bool supportExpressionTypeParameter = false;
for (int i = 0; i &lt; numExpressionTypes; ++i) {
switch (numExpressionTypes[i]) {
case FdoExpressionType_Basic:
// 是否支持基本表达式
supportExpressionTypeBasic = true;
break;
case FdoExpressionType_Function:
// 是否支持在表达式中使用函数
supportExpressionTypeFunction = true;
break;
case FdoExpressionType_Parameter:
// 是否支持参数替换
supportExpressionTypeParameter = true;
break;
}
}

// 获取在表达式中可以使用的函数
FdoPtr&lt;FdoFunctionDefinitionCollection&gt; functions =
expressionCapabilities-&gt;GetFunctions();
FdoInt32 numFunctionDefinitions = functions-&gt;GetCount();
for (int i = 0; i &lt; numFunctionDefinitions; i++) {
FdoPtr&lt;FdoFunctionDefinition&gt; functionDefinition = functions-&gt;GetItem(i);
FdoString* functionName = functionDefinition-&gt;GetName();
FdoString* functionDescription = functionDefinition-&gt;GetDescription();
FdoPtr&lt; FdoReadOnlyArgumentDefinitionCollection &gt; arguments =
functionDefinition-&gt;GetArguments();
FdoInt32 numArgumentDefinitions = arguments-&gt;GetCount();
for ( int j = 0; j &lt; numArgumentDefinitions; j++) {
FdoPtr&lt;FdoArgumentDefinition&gt; argumentDefinition = arguments-&gt;GetItem(j);
FdoString* argumentName = argumentDefinition-&gt;GetName();
FdoString* argumentDescription = argumentDefinition-&gt;GetDescription();
FdoDataType argumentType = argumentDefinition-&gt;GetDataType();
}
}

</pre>

1.1.5 过滤器能力

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

FdoPtr&lt;FdoIFilterCapabilities&gt; filterCapabilities = connection-&gt;GetFilterCapabilities();

// 获取支持的条件类型,即比较、Like、In、空间、距离等条件
FdoInt32 numConditionTypes = 0;
FdoConditionType* conditionTypes =
filterCapabilities-&gt;GetConditionTypes(numConditionTypes);
// 遍历支持的条件类型
......

//获取支持的距离操作符,目前FDO共有Beyond和Within两种操作符
FdoInt32 numSpatialOperations = 0;
FdoDistanceOperations* distanceOperations =
filterCapabilities-&gt;GetDistanceOperations(numSpatialOperations);
// 遍历支持的距离操作符
......

// 获取支持的空间操作符
FdoInt32 numSpatialOperations = 0;
FdoSpatialOperations* spatialOperations =
filterCapabilities-&gt;GetSpatialOperations(numSpatialOperations);
// 遍历支持的空间操作符
......

// 是否支持测地距(Geodesic Distance)测量
bool supportsGeodesicDistance = filterCapabilities-&gt;SupportsGeodesicDistance();
bool supportsNonLiteralGeometricOperations =
filterCapabilities-&gt;SupportsNonLiteralGeometricOperations();

</pre>

1.1.6 几何能力

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

FdoPtr&lt;FdoIGeometryCapabilities&gt; geometryCapabilities =
connection-&gt;GetGeometryCapabilities();

// 获取支持的几何类型
FdoInt32 numGeometryTypes = 0;
FdoGeometryType *geometryTypes =
geometryCapabilities-&gt;GetGeometryTypes(numGeometryTypes);
// 遍历支持的几何类型
......

// 获取支持的几何组件类型
FdoInt32 numGeometryComponnentTypes = 0;
FdoGeometryComponentType* geometryComponentTypes =
geometryCapabilities-&gt;GetGeometryComponentTypes(numGeometryComponentTypes);
// 遍历支持的几何组件类型
......

FdoInt32 dimensionalities = geometryCapabilities-&gt;GetDimensionalities();
// FdoDimensinality_XY的值是0,这意味着X,Y值是不可或缺的
if (dimensionalities &amp; FdoDimensionality_Z) {
......
}
if (dimensionalities &amp; FdoDimensionality_M) {
......
}

</pre>

1.1.7栅格能力

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

FdoPtr&lt;FdoIRasterCapabilities&gt; rasterCapabilities = connection-&gt;GetRasterCapabilities();
bool supportsRaster = rasterCapabilities-&gt;SupportsRaster();
if (supportsRaster) {
bool supportsStitching = rasterCapabilities-&gt;SupportsStitching();
bool supportsSubsampling = rasterCapabilities-&gt;SupportsSubsampling();
FdoPtr&lt;FdoRasterDataModel&gt; rgbRasterDataModel = FdoRasterDataModel::Create();
rgbRasterDataModel-&gt;SetDataModelType(FdoRasterDataModelType_RGB);
rgbRasterDataModel-&gt;SetBitsPerPixel(64);
rgbRasterDataModel-&gt;SetOrganization(FdoRasterDataOrganization_Image);
rgbRasterDataModel-&gt;SetTileSizeX(64);
rgbRasterDataModel-&gt;SetTileSizeY(128);
bool supportsDataModel = rasterCapabilities-&gt;SupportsDataModel(rgbRasterDataModel);
}

</pre>

随机推荐

Copyright © 2014-2019 OSGeo中国中心 吉ICP备05002032号

Powered by TorCMS