Menu
Simba Technologies
Simba Technologies

SimbaEngine X SDK 10.1.3
Developing Drivers for Data Stores Without SQL

Solving Common Problems

This section contains information on debugging and troubleshooting your driver.

Process Can't Locate the DLL

A common cause of failure to connect to the data store is an ODBC driver or a server process that cannot find the ICU DLL or shared object and refuses to start. This can be frustrating to diagnose, so watch out for it. It is the general case of the driver not being able to find all of its dependencies.

On Windows, this manifests itself as a “-1 Error”. One way to approach this problem is with the Dependency Walker program. This free program identifies the items on which an executable depends. For more information on dependency walker, see the MSDN article at http://msdn.microsoft.com/en-us/magazine/bb985842.aspx. The application can be installed from this location: http://dependencywalker.com/.

Driver Cannot Find the Data Store

Another cause of failure is the server or ODBC driver being unable to find your data store. This is usually a case of configuring the driver or server incorrectly. Make sure to include the right checks in your DSI implementation code to detect this condition, and to return clear error messages to the user. This is a frustrating problem to diagnose because the cause is often buried at the very bottom of the data access stack.

AETree Log File Too Large

AETree logging is not considered part of the regular logging functionality in the SimbaEngine X SDK. Therefore, the LogFileSize parameter doesn't affect the size of the AETree.log file.

You can enable and disable AETree logging by using the DSIEXT_DATAENGINE_LOG_AETREES property as explained in Enable Logging in the Data Engine.

Incomplete Types Compiler Warning

In order to prevent the possibility of memory leaks when using class templates such as AutoPtr, AutoArrayPtr or AutoValueMap, a compiler warning will be generated when they are instantiated on an incomplete type. If you encounter a compiler warning about an incomplete type (the actual warning varies between compilers), simply include the header file of the pre-declared class, and remove the pre-declaration. This allows the compiler to have full access to the underlying class destructor of in the class template AutoXXX destructor.

Example: Code That Causes an Incomplete Type Warning

namespace MyDriver

{

class MyClass1; // Pre-declaration of MyClass1

class MyClass2

{

public:

MyClass2 {}

~MyClass2 {}

private:

// when this is cleaned up, the destructor of MyClass1 will not be called :-(

Simba::Support::AutoPtr<MyClass1> m_obj;

}

}

Example: Resolving an Incomplete Type Warning

//To resolve the issue, include the header file for

// MyClass1 and remove the forward declaration:

#include MyClass1.h

namespace MyDriver

{

class MyClass2

{

public:

MyClass2 {}

~MyClass2 {}

private:

// when this is cleaned up, the destructor of MyClass1 will be called :-)

Simba::Support::AutoPtr<MyClass1> m_obj;

}

}

Background on the Use of Incomplete Types

In C++, it is possible to pre-declare a class, then define pointer or reference to it. This results in a pointer to an incomplete type. This is fine as long as the code does not need to access any methods or attributes of the pre-defined class, including the destructor. The C++ specification also allows you to delete the pointer to an incomplete type. This may cause a problem, because the compiler does not know the type of the referenced object, or how to call its destructor (it might not even have a destructor). The compiler frees the memory of the object but cannot call its destructor first. This could lead to memory leaks or other issues, such as a file remaining open.

The SimbaEngine X SDK provides class templates such as AutoPtr, AutoArrayPtr or AutoValueMap to help manage your dynamically created objects. These classes will clean up an object when their instances are destroyed. However, if these class templates are instantiated on an incomplete type, the compiler does not have access to the underlying class’s destructor. Therefore, it cannot add a call to the destructor of the underlying object when compiling the destructor of these class templates.s

Incorrect version of libc Library

When deploying a driver on AIX platforms, a supported version of the system library libc must be available on the machine. We recommend having the following version of this library for each supported version of AIX:

AIX version  
AIX 7.1 bos.rte.libc.7.2.0.2
AIX 6.1 bos.rte.libc.6.1.9.30

To download this library, see http://www-01.ibm.com/support/docview.wss?uid=isg1fileset-870201775.

If this library does not exist on the deployment machine, the following errors may be encountered:

  • [unixODBC][Driver Manager]Can't initiate unicode conversion
  • [unixODBC][Driver Manager]Can't open lib <path to driver library>: file not found
  • [ISQL]ERROR: Could not SQLConnect