Changes between Version 32 and Version 33 of FDORfc34

Show
Ignore:
Timestamp:
08/26/09 18:51:40 (4 years ago)
Author:
klain
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • FDORfc34

    v32 v33  
    6464== Requirements == 
    6565 
    66 The following FDO reader interfaces will be updated to allow for indexed access. Providers will be required to implement these method.  
     66The following FDO reader interfaces will be updated to allow for indexed access. Providers will be required to implement these methods. 
    6767 
    6868=== Interface IReader === 
     
    281281{ 
    282282public: 
    283     /// \brief 
    284     /// Gets the number of properties in the result set. 
    285     ///  
    286     /// \return 
    287     /// Returns the number of columns. 
    288     ///  
    289     FDO_API virtual FdoInt32 GetPropertyCount() = 0; 
    290  
     283... 
     284... 
     285... 
    291286    /// \brief 
    292287    /// Gets the name of the property at the given ordinal position. 
     
    299294    ///  
    300295    FDO_API virtual FdoString* GetPropertyName(FdoInt32 index) = 0; 
    301  
    302     /// \brief 
    303     /// Gets the index of the property with the given name. 
    304     ///  
    305     /// \param index  
    306     /// Input the name of the property. 
    307     ///  
    308     /// \return 
    309     /// Returns the property index 
    310     ///  
    311     FDO_API virtual FdoInt32 GetPropertyIndex(FdoString* propertyName) = 0; 
    312  
    313     /// \brief 
    314     /// Gets the type of the property at the given ordinal position. 
    315     ///  
    316     /// \param index  
    317     /// Input the position of the property. 
    318     ///  
    319     /// \return 
    320     /// Returns the type of the property. 
    321     ///  
    322     FDO_API virtual FdoPropertyType GetPropertyType(FdoInt32 index) = 0; 
    323  
    324     /// \brief 
    325     /// Gets the type of the property with the given name. 
    326     ///  
    327     /// \param index  
    328     /// Input the name of the property. 
    329     ///  
    330     /// \return 
    331     /// Returns the type of the property. 
    332     ///  
    333     FDO_API virtual FdoPropertyType GetPropertyType(FdoString* propertyName) = 0; 
    334  
    335     /// \brief 
    336     /// Gets the data type of the property at the specified ordinal position. 
    337     ///  
    338     /// \param index  
    339     /// Input the index of the property. 
    340     ///  
    341     /// \return 
    342     /// Returns the data type of the property. 
    343     ///  
    344     FDO_API virtual FdoDataType GetDataType(FdoInt32 index) = 0; 
    345  
    346     /// \brief 
    347     /// Gets the data type of the property with the specified name. 
    348     ///  
    349     /// \param index  
    350     /// Input the name of the property. 
    351     ///  
    352     /// \return 
    353     /// Returns the data type of the property. 
    354     ///  
    355     FDO_API virtual FdoDataType GetDataType(FdoInt32 index) = 0; 
    356  
    357     /// \brief 
    358     /// Gets the definition of the object currently being read. If the user 
    359     /// has requested only a subset of the class properties, the class  
    360     /// definition reflects what the user has asked, rather than the full class  
    361     /// definition. 
    362     ///  
    363     /// \return 
    364     /// Returns the class definition object. 
    365     ///  
    366     FDO_API virtual FdoClassDefinition* GetClassDefinition() = 0; 
    367  
    368     /// \brief 
    369     /// Gets a value indicating the depth of nesting for the current reader. 
    370     /// The depth value increases each time GetFeatureObject is called and a new  
    371     /// reader is returned. The outermost reader has a depth of 0. 
    372     ///  
    373     /// \return 
    374     /// Returns the depth 
    375     ///  
    376     FDO_API virtual FdoInt32 GetDepth() = 0; 
    377  
    378     /// \brief 
    379     /// Gets the geometry value of the specified property as a byte array in  
    380     /// FGF format. Because no conversion is performed, the property must be 
    381     /// of Geometric type; otherwise, an exception is thrown.  
    382     /// This method is a language-specific performance optimization that returns a 
    383     /// pointer to the array data, rather than to an object that encapsulates 
    384     /// the array.  The array's memory area is only guaranteed to be valid 
    385     /// until a call to ReadNext() or Close(), or the disposal of this reader 
    386     /// object. 
    387     ///  
    388     /// \param propertyName  
    389     /// Input the property name. 
    390     /// \param count  
    391     /// Output the number of bytes in the array. 
    392     ///  
    393     /// \return 
    394     /// Returns a pointer to the byte array in FGF format. 
    395     ///  
    396     FDO_API virtual const FdoByte * GetGeometry(FdoString* propertyName, FdoInt32* count) = 0; 
    397296 
    398297    /// \brief 
     
    415314    ///  
    416315    FDO_API virtual const FdoByte * GetGeometry(FdoInt32 index, FdoInt32* count) = 0; 
    417  
    418     /// \brief 
    419     /// Gets a reference to an FdoIFeatureReader to read the data contained in 
    420     /// the object or object collection property. If the property is not an 
    421     /// object property, an exception is thrown. 
    422     ///  
    423     /// \param propertyName  
    424     /// Input the property name. 
    425     ///  
    426     /// \return 
    427     /// Returns the nested feature reader 
    428     ///  
    429     FDO_API virtual FdoIFeatureReader* GetFeatureObject(FdoString* propertyName) = 0; 
     316     
     317        /// \brief 
     318    /// Gets the geometry value of the specified index as a byte array in  
     319    /// FGF format. Because no conversion is performed, the property must be 
     320    /// of Geometric type; otherwise, an exception is thrown. 
     321    ///  
     322    /// \param index  
     323    /// Input the index of the property. 
     324    ///  
     325    /// \return 
     326    /// Returns the byte array in FGF format. 
     327    ///  
     328    FDO_API virtual FdoByteArray* GetGeometry(FdoInt32* index) = 0; 
    430329 
    431330    /// \brief 
     
    484383    FDO_API virtual FdoPropertyType GetPropertyType(FdoInt32 index) = 0; 
    485384}; 
     385 
    486386}}} 
    487387 
     
    514414 
    515415    /// \brief 
    516     /// Gets the index of the column with the given name. 
    517     ///  
    518     /// \param index  
    519     /// Input the name of the property. 
    520     ///  
    521     /// \return 
    522     /// Returns the property index 
    523     ///  
    524     FDO_API virtual FdoInt32 GetColumnIndex(FdoString* propertyName) 
    525  
    526     /// \brief 
    527416    /// Gets the data type of the column at the specified index. 
    528417    ///  
     
    708597}}} 
    709598 
     599=== Default implementation === 
     600 
     601A high level class diagram of existing reader related interfaces in FDO is as illustrated below.  
     602  
     603Both FdoISqlReader and FdoIDataReader have the function to get the column name or property name according to the index. With this capability, it should be pretty easy to provide default implementation for all indexed access functions. Take FdoIDataReader as an example: 
     604 
     605class FdoIDataReader: public FdoIReader 
     606{ 
     607public: 
     608    virtual FdoInt32 GetInt32(FdoInt32 index); 
     609} 
     610 
     611An implementation file (IDataReader.cpp) needs to be added: 
     612 
     613FdoInt32 FdoIDataReader::GetInt32(FdoInt32 index) 
     614{ 
     615    FdoStringP propName = GetPropertyName(index); 
     616    return GetInt32(propName); 
     617} 
     618 
     619Note here, FdoIDataReader is overriding the GetInt32(FdoInt32 index) derived from FdoIReader. So providers can inherit the default implementation automatically without changing any codes. It only needs a recompile. Off course, providers can choose to override the default implementation by theirs if they like.  
     620 
     621In order to make it work in all cases, FdoIFeatureReader also needs to expose a function of FdoString* GetPropertyName(FdoInt32 index) and each provider needs to override it. It has been illustrated in above updated FdoIFeatureReader interface. This work is avoidless that each provider has to know how to map between property name and index for the default implementation.  
     622 
    710623=== Managed FDO API === 
    711624 
     
    714627== Provider Implementation == 
    715628 
    716 Providers will be required to implement the above functionality.  
    717  
    718 It is expected that resourcing will be supplied to modify all the existing FDO Open Source providers. 
     629Providers will be required to implement the above functionality. Instead of each provider to implement all of newly added pure virtual functions, three utility abstract classes are added to provide the default implementation as mentioned above under Fdo/Utilities/Common: FdoIFeatureReaderDefault, FdoIDataReaderDefault, FdoISqlReaderDefault. Then the provider specific implementation will simply derive from the new classes. That involves changing one line in header file for each provider (some providers may not link FdoCommon and need to add that dependancy). Take FdoIDataReaderDefault as an example: 
     630 
     631{{{ 
     632class FdoIFeatureReaderDefault: public FdoIFeatureReader 
     633{ 
     634public: 
     635    FDO_API virtual FdoBoolean IsNull(FdoInt32 index); 
     636    FDO_API virtual FdoBoolean GetBoolean(FdoInt32 index); 
     637    FDO_API virtual FdoByte GetByte(FdoInt32 index); 
     638    FDO_API virtual FdoDateTime GetDateTime(FdoInt32 index); 
     639    FDO_API virtual FdoDouble GetDouble(FdoInt32 index); 
     640    FDO_API virtual FdoInt16 GetInt16(FdoInt32 index); 
     641    FDO_API virtual FdoInt32 GetInt32(FdoInt32 index); 
     642    FDO_API virtual FdoInt64 GetInt64(FdoInt32 index); 
     643    FDO_API virtual FdoFloat GetSingle(FdoInt32 index); 
     644    FDO_API virtual FdoString* GetString(FdoInt32 index);  
     645    FDO_API virtual FdoLOBValue* GetLOB(FdoInt32 index); 
     646    FDO_API virtual FdoIStreamReader* GetLOBStreamReader(FdoInt32 index); 
     647    FDO_API virtual FdoByteArray* GetGeometry(FdoInt32 index); 
     648    FDO_API virtual FdoIRaster* GetRaster(FdoInt32 index);  
     649    FDO_API virtual FdoString* GetPropertyName(FdoInt32 index); 
     650    FDO_API virtual const FdoByte * GetGeometry(FdoInt32 index, FdoInt32* count); 
     651    FDO_API virtual FdoByteArray* GetGeometry(FdoInt32* index); 
     652    FDO_API virtual FdoIFeatureReader* GetFeatureObject(FdoInt32 index); 
     653}; 
     654}}} 
     655All pure virtual functions for access by index are overrided with the default implementation in a similar way. e.g.  
     656{{{ 
     657FdoBoolean FdoIFeatureReaderByIndex ::IsNull(FdoInt32 index) 
     658{ 
     659    FdoStringP propName = GetPropertyName(index); 
     660    Return IsNull(propName); 
     661} 
     662 
     663}}} 
     664Changes to provider specific implementation: 
     665{{{ 
     666Class XYZFeatureReader: public FdoIFeatureReaderDefault 
     667{ 
     668    // no other changes  
     669} 
     670}}} 
     671It is expected that resourcing will be supplied to modify all the existing FDO Open Source providers. Unless there are noticeable performance complaints, all of the open source providers will use the default implementation for this release.  
    719672 
    720673== Test Plan ==