File: SQLManageDataSources.c

package info (click to toggle)
unixodbc 2.2.11-16
  • links: PTS
  • area: main
  • in suites: lenny
  • size: 17,332 kB
  • ctags: 12,399
  • sloc: ansic: 116,624; cpp: 29,333; sh: 25,024; makefile: 3,002; lex: 241; yacc: 182; perl: 142; sed: 16; sql: 1
file content (152 lines) | stat: -rw-r--r-- 4,564 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/**************************************************
 * SQLManageDataSources
 *
 **************************************************
 * This code was created by Peter Harvey @ CodeByDesign.
 * Released under LGPL 28.JAN.99
 *
 * Contributions from...
 * -----------------------------------------------
 * Peter Harvey		- pharvey@codebydesign.com
 **************************************************/
#include <odbcinstext.h>

BOOL SQLManageDataSources( HWND hWnd )
{
	BOOL	nReturn;
	char    szGUILibFile[FILENAME_MAX];
	void 	*hDLL;
	BOOL	(*pSQLManageDataSources)( HWND	);
    HODBCINSTWND    hODBCINSTWnd;

    /*
     * SANITY CHECKS
     *
     */
	if ( !hWnd )
	{
        inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_HWND, "No hWnd" );
		return FALSE;
	}
    hODBCINSTWnd = (HODBCINSTWND)hWnd;
	if ( !hODBCINSTWnd->hWnd )
	{
        inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_INVALID_HWND, "No hODBCINSTWnd->hWnd" );
		return FALSE;
	}

    /*
     * 
     *
     */
    if ( lt_dlinit() )
    {
        inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, "lt_dlinit() failed" );
		return FALSE;
    }

    /*
     * DETERMINE PATH FOR GUI PLUGIN
     *
     */
    if ( strncasecmp( hODBCINSTWnd->szGUI, "QT", 2 ) == 0 )
    {
        char *p;
/* 
 * This works and extension 'la' is probably more portable but we lose 
 * control of which version of the lib we load (it hard coded in the *.la)
 *
 *        sprintf( szGUILibFile, "%s/libodbcinstQ.la", DEFLIB_PATH );
 *
 * Bring up libodbcinstQ.la in a text editor and you will see the name we 
 * are supposed to use to dlopen the lib, worse than the above option
 *
 *        sprintf( szGUILibFile, "%s/libodbcinstQ.so.1", DEFLIB_PATH );
 *
 * This is less portable because of 'so' extension but we can let the file 
 * symlinks work for us
 *
 *        sprintf( szGUILibFile, "%s/libodbcinstQ.so", DEFLIB_PATH );
 */

        /*
         * first look in the environment
         */

        p  = getenv( "ODBCINSTQ" );
        if ( p )
        {
            strcpy( szGUILibFile, p );
        }
        else
        {
            SQLGetPrivateProfileString( "ODBC", "ODBCINSTQ", "", szGUILibFile, sizeof( szGUILibFile ), "odbcinst.ini" );

            if ( strlen( szGUILibFile ) == 0 )
            {
                /*
                 * we need to find the extension to use as well
                 */

#ifdef SHLIBEXT
                if ( strlen( SHLIBEXT ) > 0 )
                    sprintf( szGUILibFile, "libodbcinstQ%s.1", SHLIBEXT );
                else
                    sprintf( szGUILibFile, "libodbcinstQ.so.1" );
#else
                sprintf( szGUILibFile, "libodbcinstQ.so.1" );
#endif        

                if ( lt_dladdsearchdir( DEFLIB_PATH ) )
                {
                    inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, 
                            ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() );
                }
            }
        }
    }
    else
    {
        inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, 
                ODBC_ERROR_INVALID_HWND, "Unsupported hODBCINSTWnd->szGUI" );
		return FALSE;
    }

    /*
     * USE libtool TO LOAD PLUGIN AND CALL FUNCTION
     *
     */
    nReturn = FALSE;
    hDLL = lt_dlopen( szGUILibFile );
	if ( hDLL )
	{
        /* change the name, as it avoids it finding it in the calling lib */
		pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "QTSQLManageDataSources" );
		if ( pSQLManageDataSources )
			nReturn = pSQLManageDataSources( (HWND)hODBCINSTWnd->hWnd );
		else
			inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() );
	}
	else
    {
        /*
         * try adding szGUILibFile
         */

        sprintf( szGUILibFile, "%s/libodbcinstQ%s.1", DEFLIB_PATH, SHLIBEXT );
        hDLL = lt_dlopen( szGUILibFile );
        if ( hDLL )
        {
            /* change the name, as it avoids it finding it in the calling lib */
            pSQLManageDataSources = (BOOL (*)(HWND))lt_dlsym( hDLL, "QTSQLManageDataSources" );
            if ( pSQLManageDataSources )
                nReturn = pSQLManageDataSources( (HWND)hODBCINSTWnd->hWnd );
            else
                inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() );
        }

		inst_logPushMsg( __FILE__, __FILE__, __LINE__, LOG_CRITICAL, ODBC_ERROR_GENERAL_ERR, (char*)lt_dlerror() );
    }

	return nReturn;
}