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; |
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; |
| 599 | === Default implementation === |
| 600 | |
| 601 | A high level class diagram of existing reader related interfaces in FDO is as illustrated below. |
| 602 | |
| 603 | Both 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 | |
| 605 | class FdoIDataReader: public FdoIReader |
| 606 | { |
| 607 | public: |
| 608 | virtual FdoInt32 GetInt32(FdoInt32 index); |
| 609 | } |
| 610 | |
| 611 | An implementation file (IDataReader.cpp) needs to be added: |
| 612 | |
| 613 | FdoInt32 FdoIDataReader::GetInt32(FdoInt32 index) |
| 614 | { |
| 615 | FdoStringP propName = GetPropertyName(index); |
| 616 | return GetInt32(propName); |
| 617 | } |
| 618 | |
| 619 | Note 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 | |
| 621 | In 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 | |
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. |
| 629 | Providers 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 | {{{ |
| 632 | class FdoIFeatureReaderDefault: public FdoIFeatureReader |
| 633 | { |
| 634 | public: |
| 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 | }}} |
| 655 | All pure virtual functions for access by index are overrided with the default implementation in a similar way. e.g. |
| 656 | {{{ |
| 657 | FdoBoolean FdoIFeatureReaderByIndex ::IsNull(FdoInt32 index) |
| 658 | { |
| 659 | FdoStringP propName = GetPropertyName(index); |
| 660 | Return IsNull(propName); |
| 661 | } |
| 662 | |
| 663 | }}} |
| 664 | Changes to provider specific implementation: |
| 665 | {{{ |
| 666 | Class XYZFeatureReader: public FdoIFeatureReaderDefault |
| 667 | { |
| 668 | // no other changes |
| 669 | } |
| 670 | }}} |
| 671 | It 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. |