tdbc::odbc

Check-in [51215942e0]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Remove experimental lib loader.
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256:51215942e0109f19dae986950b7a7b03454a9a40fcd1a54f2a488d2c63faabdc
User & Date: stu 2018-07-04 10:16:39
Context
2018-07-11
20:39
CONST -> const check-in: ed7550027c user: jan.nijtmans tags: trunk
2018-07-04
10:16
Remove experimental lib loader. check-in: 51215942e0 user: stu tags: trunk
2018-07-01
05:19
Don't try to dist install nonexistent files. check-in: 25210d9554 user: stu tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to configure.

2606
2607
2608
2609
2610
2611
2612



2613
2614
2615
2616
2617
2618
2619
....
2632
2633
2634
2635
2636
2637
2638
2639
2640

2641
2642
2643
2644
2645
2646
2647
....
3743
3744
3745
3746
3747
3748
3749

3750
3751
3752
3753
3754
3755
3756
....
5590
5591
5592
5593
5594
5595
5596
5597
5598
5599
5600
5601
5602
5603
5604
5605
5606
5607
5608
5609
5610
5611
5612
5613

	    # on Darwin, check in Framework installation locations
	    if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then
		for i in `ls -d ~/Library/Frameworks 2>/dev/null` \
			`ls -d /Library/Frameworks 2>/dev/null` \
			`ls -d /Network/Library/Frameworks 2>/dev/null` \
			`ls -d /System/Library/Frameworks 2>/dev/null` \



			; do
		    if test -f "$i/Tcl.framework/tclConfig.sh" ; then
			ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`"
			break
		    fi
		done
	    fi
................................................................................
	    fi

	    # check in a few common install locations
	    if test x"${ac_cv_c_tclconfig}" = x ; then
		for i in `ls -d ${libdir} 2>/dev/null` \
			`ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d ${prefix}/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` \

			`ls -d /usr/pkg/lib 2>/dev/null` \
			`ls -d /usr/lib 2>/dev/null` \
			`ls -d /usr/lib64 2>/dev/null` \
			`ls -d /usr/lib/tcl8.6 2>/dev/null` \
			`ls -d /usr/lib/tcl8.5 2>/dev/null` \
			`ls -d /usr/local/lib/tcl8.6 2>/dev/null` \
			`ls -d /usr/local/lib/tcl8.5 2>/dev/null` \
................................................................................
	    # check in a few common install locations
	    if test x"${ac_cv_c_tdbcconfig}" = x ; then
		for i in `ls -d ${libdir} 2>/dev/null` \
			`ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d ${prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \

			`ls -d /usr/lib 2>/dev/null` \
			`ls -d /usr/lib64 2>/dev/null` \
			; do
		    if test -f "$i/tdbcConfig.sh" ; then
			ac_cv_c_tdbcconfig=`(cd $i; pwd)`
			break
		    fi
................................................................................
	if test ! -f "${srcdir}/$i" ; then
	    as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5
	fi
	PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i"
    done



#--------------------------------------------------------------------
# The new loader needs to know the shared lib suffix.
#--------------------------------------------------------------------


cat >>confdefs.h <<_ACEOF
#define TCL_SHLIB_EXT "${TCL_SHLIB_SUFFIX}"
_ACEOF


#--------------------------------------------------------------------
# __CHANGE__
#
# You can add more files to clean if your extension creates any extra
# files by extending CLEANFILES.
# Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure







>
>
>







 







<

>







 







>







 







<
<
<
<
<
<
<
<
<
<







2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
....
2635
2636
2637
2638
2639
2640
2641

2642
2643
2644
2645
2646
2647
2648
2649
2650
....
3746
3747
3748
3749
3750
3751
3752
3753
3754
3755
3756
3757
3758
3759
3760
....
5594
5595
5596
5597
5598
5599
5600










5601
5602
5603
5604
5605
5606
5607

	    # on Darwin, check in Framework installation locations
	    if test "`uname -s`" = "Darwin" -a x"${ac_cv_c_tclconfig}" = x ; then
		for i in `ls -d ~/Library/Frameworks 2>/dev/null` \
			`ls -d /Library/Frameworks 2>/dev/null` \
			`ls -d /Network/Library/Frameworks 2>/dev/null` \
			`ls -d /System/Library/Frameworks 2>/dev/null` \
			`ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Library/Frameworks/Tcl.framework 2>/dev/null` \
			`ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/Network/Library/Frameworks/Tcl.framework 2>/dev/null` \
			`ls -d /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Tcl.framework 2>/dev/null` \
			; do
		    if test -f "$i/Tcl.framework/tclConfig.sh" ; then
			ac_cv_c_tclconfig="`(cd $i/Tcl.framework; pwd)`"
			break
		    fi
		done
	    fi
................................................................................
	    fi

	    # check in a few common install locations
	    if test x"${ac_cv_c_tclconfig}" = x ; then
		for i in `ls -d ${libdir} 2>/dev/null` \
			`ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d ${prefix}/lib 2>/dev/null` \

			`ls -d /usr/local/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \
			`ls -d /usr/pkg/lib 2>/dev/null` \
			`ls -d /usr/lib 2>/dev/null` \
			`ls -d /usr/lib64 2>/dev/null` \
			`ls -d /usr/lib/tcl8.6 2>/dev/null` \
			`ls -d /usr/lib/tcl8.5 2>/dev/null` \
			`ls -d /usr/local/lib/tcl8.6 2>/dev/null` \
			`ls -d /usr/local/lib/tcl8.5 2>/dev/null` \
................................................................................
	    # check in a few common install locations
	    if test x"${ac_cv_c_tdbcconfig}" = x ; then
		for i in `ls -d ${libdir} 2>/dev/null` \
			`ls -d ${exec_prefix}/lib 2>/dev/null` \
			`ls -d ${prefix}/lib 2>/dev/null` \
			`ls -d /usr/local/lib 2>/dev/null` \
			`ls -d /usr/contrib/lib 2>/dev/null` \
			`ls -d /usr/pkg/lib 2>/dev/null` \
			`ls -d /usr/lib 2>/dev/null` \
			`ls -d /usr/lib64 2>/dev/null` \
			; do
		    if test -f "$i/tdbcConfig.sh" ; then
			ac_cv_c_tdbcconfig=`(cd $i; pwd)`
			break
		    fi
................................................................................
	if test ! -f "${srcdir}/$i" ; then
	    as_fn_error $? "could not find tcl source file '${srcdir}/$i'" "$LINENO" 5
	fi
	PKG_TCL_SOURCES="$PKG_TCL_SOURCES $i"
    done













#--------------------------------------------------------------------
# __CHANGE__
#
# You can add more files to clean if your extension creates any extra
# files by extending CLEANFILES.
# Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure

Changes to configure.ac.

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
else
    TEA_ADD_LIBS([${tdbc_STUB_LIB_SPEC}])
fi
TEA_ADD_CFLAGS([${tdbc_CFLAGS}])
TEA_ADD_STUB_SOURCES()
TEA_ADD_TCL_SOURCES([library/tdbcodbc.tcl])

#--------------------------------------------------------------------
# The new loader needs to know the shared lib suffix.
#--------------------------------------------------------------------

AC_DEFINE_UNQUOTED(TCL_SHLIB_EXT,"${TCL_SHLIB_SUFFIX}",
    [What is the default extension for shared libraries?])

#--------------------------------------------------------------------
# __CHANGE__
#
# You can add more files to clean if your extension creates any extra
# files by extending CLEANFILES.
# Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure
# and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var.







<
<
<
<
<
<
<







130
131
132
133
134
135
136







137
138
139
140
141
142
143
else
    TEA_ADD_LIBS([${tdbc_STUB_LIB_SPEC}])
fi
TEA_ADD_CFLAGS([${tdbc_CFLAGS}])
TEA_ADD_STUB_SOURCES()
TEA_ADD_TCL_SOURCES([library/tdbcodbc.tcl])








#--------------------------------------------------------------------
# __CHANGE__
#
# You can add more files to clean if your extension creates any extra
# files by extending CLEANFILES.
# Add pkgIndex.tcl if it is generated in the Makefile instead of ./configure
# and change Makefile.in to move it from CONFIG_CLEAN_FILES to BINARIES var.

Changes to generic/odbcStubInit.c.

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
..
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
...
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
...
489
490
491
492
493
494
495
496
497
 * Static data used in this file
 */

/*
 * Names of the libraries that might contain the ODBC API
 */


/* Uncomment or -DTDBC_NEW_LOADER=1 to use the new loader */
/*#define TDBC_NEW_LOADER 1*/


#ifdef TDBC_NEW_LOADER

#include <stdlib.h>

/* Sorted by name asc. */
static const char *const odbcStubLibNames[] = {
    "odbc", "odbc32", NULL
};
/* Sorted by num desc. No leading dots. Empty first. */
static const char *const odbcStubLibNumbers[] = {
	"", "1.2", "0.1", NULL
};
/* Sorted by name asc. */
static const char *const odbcOptLibNames[] = {
    "odbccp", "odbccp32", "odbcinst", NULL
};
/* Sorted by num desc. No leading dots. Empty first. */
static const char *const odbcOptLibNumbers[] = {
	"", "2.6", "0.0", NULL
};

#else

static const char *const odbcStubLibNames[] = {
#if defined(__APPLE__)
    "libiodbc.2",
#elif defined(__OpenBSD__)
    "libiodbc",
#else
    "odbc32", "odbc", "libodbc32", "libodbc", "libiodbc",
................................................................................
    "libiodbcinst",
#else
    "odbccp", "odbccp32", "odbcinst",
    "libodbccp", "libodbccp32", "libodbcinst", "libiodbcinst",
#endif
    NULL
};

#endif


/*
 * Names of the functions that we need from ODBC
 */

static const char *const odbcSymbolNames[] = {
    /* @SYMNAMES@: DO NOT EDIT THESE NAMES */
................................................................................
BOOL (INSTAPI* SQLConfigDataSourceW)(HWND, WORD, LPCWSTR, LPCWSTR)
= NULL;
BOOL (INSTAPI* SQLConfigDataSource)(HWND, WORD, LPCSTR, LPCSTR)
= NULL;
BOOL (INSTAPI* SQLInstallerError)(WORD, DWORD*, LPSTR, WORD, WORD*)
= NULL;


#ifdef TDBC_NEW_LOADER

#ifndef TCL_SHLIB_EXT
#  define TCL_SHLIB_EXT ".so"
#endif

#ifndef LIBPREFIX
#  ifdef __CYGWIN__
#    define LIBPREFIX "cyg"
#  else
#    define LIBPREFIX "lib"
#  endif
#endif

#ifdef __CYGWIN__
#  define TDBC_SHLIB_SEP "-"
#else
#  define TDBC_SHLIB_SEP "."
#endif

const char *const tdbcLibFormats[] = {
	LIBPREFIX "%s" TCL_SHLIB_EXT "%s" "%s",
	"%s" TCL_SHLIB_EXT "%s" "%s",
	NULL
};

/*
 *-----------------------------------------------------------------------------
 *
 * tdbcLoadLib --
 *
 *	Tries to load a shared library given a list of lib names and/or
 *	all combinations of LIBPREFIX, no LIBPREFIX, lib names and lib numbers.
 *	Takes CYGWIN into account.
 *
 * Results:
 *	Returns the handle to the loaded ODBC client library and leaves the
 *	name of the the loaded ODBC client library in the interpreter, or NULL
 *	if the load is unsuccessful and leaves a list of error message(s) in the
 *	interpreter.
 *
 *-----------------------------------------------------------------------------
 */

static Tcl_LoadHandle
tdbcLoadLib (
    Tcl_Interp *interp,			/* Receives errors or lib name if successful */
    const char *const soNames[],	/* Lib names. Kwazy lookup not done if NULL */
    const char *const soNumbers[],	/* Lib numbers for kwazy lookup */
    const char *const soSymbolNames[],	/* Passed to Tcl_LoadFile */
    const void *soStubDefs,		/* Passed to Tcl_LoadFile */
    const char *soList,			/* Lib name list to try first if not NULL */
    const char *const soFormats[]	/* Lib name printf formats for kwazy lookup.
					   Default used if NULL.
					   Maybe not useful as a parameter. */
) {
    const char *const *nam;		/* Name */
    const char *const *num;		/* Number */
    const char *const *fmt;		/* Format */
    Tcl_Obj *lib;			/* Holds lib name during kwazy lookup */
    Tcl_Obj *result;			/* List of errors or lib name if successful */
    Tcl_LoadHandle handle;		/* NULL or handle to loaded lib if successful */

    result = NULL; /* Important! This is eventually returned. */
    handle = NULL; /* Important! This is eventually returned. */

    /*
     * Try to load a lib from a string claiming to be a list of libs?
     */
    if (soList != NULL) {	/* Yes! */
	Tcl_Obj *l;
	Tcl_Obj **els;
	int nels;
	int i;

	/*
         * Make list from string.
	 * Caller is responsible for listability and utf8ness.
         */
	l = Tcl_NewStringObj(soList, -1);
	Tcl_IncrRefCount(l);

	if (Tcl_ListObjGetElements(interp, l, &nels, &els) != TCL_OK) {
	    Tcl_DecrRefCount(l);
	    return NULL;
	}

	result = Tcl_NewListObj(0, NULL);
	Tcl_IncrRefCount(result);

	/*
	 * Left-to-right, trying to load a lib at each iteration.
         */
	for (i = 0; i < nels; i++) {
	    if (Tcl_LoadFile(interp, els[i], soSymbolNames, 0, (void *) soStubDefs, &handle) == TCL_OK) {
		/* Lib found and loaded. Cleanup and setup result. */
		Tcl_DecrRefCount(result); /* Throw away any errors collected. */
		result = Tcl_DuplicateObj(els[i]);
		Tcl_IncrRefCount(result);
		break;
	    }
	    Tcl_ListObjAppendElement(NULL, result, Tcl_GetObjResult(interp)); /* Collect error. */
	    handle = NULL; /* Important! This is eventually returned. */
	}
	Tcl_DecrRefCount(l);
	if (handle != NULL) {
	    goto loadDone;
	}
    }

    /*
     * At this point no lib list was provided or no lib was found in the list.
     */

    /*
     * Done if names not provided.
     */
    if (soNames == NULL) {
	goto loadDone;
    }

    /*
     * Use default format(s) if not supplied.
     */
    if (soFormats == NULL) {
	soFormats = tdbcLibFormats;
    }

    if (result == NULL) {
	result = Tcl_NewListObj(0, NULL);
	Tcl_IncrRefCount(result);
    }

    /*
     * Try every possible combination (aka Kwazy Lookup).
     */
    for (nam =   &soNames[0]; *nam != NULL; nam++) {
    for (num = &soNumbers[0]; *num != NULL; num++) {
    for (fmt = &soFormats[0]; *fmt != NULL; fmt++) {
	lib = Tcl_ObjPrintf(*fmt, *nam, (*num[0] == '\0' ? "" : TDBC_SHLIB_SEP), *num);
	Tcl_IncrRefCount(lib);
	if (Tcl_LoadFile(interp, lib, soSymbolNames, 0, (void *) soStubDefs, &handle) == TCL_OK) {
	    /* Lib found and loaded. Cleanup and setup result. */
	    Tcl_DecrRefCount(result); /* Throw away any errors collected. */
	    result = lib;
	    goto loadDone;
	}
	Tcl_ListObjAppendElement(NULL, result, Tcl_GetObjResult(interp)); /* Collect error. */
	Tcl_DecrRefCount(lib);
	handle = NULL; /* Important! This is eventually returned. */
    }}}

loadDone:

    if (result != NULL) {
	Tcl_SetObjResult(interp, result);
	Tcl_DecrRefCount(result);
    }

    return handle; /* Like I said... */
}

/*
 *-----------------------------------------------------------------------------
 *
 * OdbcInitStubs --
 *
 *	Initialize the Stubs table for the ODBC API
 *
 * Results:
 *	Returns the handle to the loaded ODBC client library, or NULL
 *	if the load is unsuccessful. Leaves an error message in the
 *	interpreter.
 *
 *-----------------------------------------------------------------------------
 */

MODULE_SCOPE Tcl_LoadHandle
OdbcInitStubs(Tcl_Interp* interp,
				/* Tcl interpreter */
	      Tcl_LoadHandle* handle2Ptr)
				/* Pointer to a second load handle
				 * that represents the ODBCINST library */
{
    Tcl_LoadHandle handle;	/* Handle to a load module */
    int status;			/* Status of Tcl library calls for ODBC lib */
    int status2;		/* Status of Tcl library calls for ODBCINST lib */

    SQLConfigDataSourceW = NULL;/* Symbols maybe in ODBCINST lib */
    SQLConfigDataSource = NULL;
    SQLInstallerError = NULL;

    /*
     * Try to load a client library and resolve the ODBC API within it.
     */

    handle = tdbcLoadLib(interp,
	odbcStubLibNames, odbcStubLibNumbers,
	odbcSymbolNames, odbcStubs,
	getenv("TDBC_ODBC_ODBCLIBS"), NULL
    );
    status = (handle == NULL ? TCL_ERROR : TCL_OK);

    /*
     * We've run out of library names (in which case status==TCL_ERROR
     * and the error message reflects the last unsuccessful load attempt).
     */

    if (status != TCL_OK) {
	return NULL;
    }

    /*
     * If a client library is found, then try to load ODBCINST as well.
     */

    *handle2Ptr = tdbcLoadLib(interp,
	odbcOptLibNames, odbcOptLibNumbers,
	NULL, NULL,
	getenv("TDBC_ODBC_ODBCINSTLIBS"), NULL
    );
    status2 = (*handle2Ptr == NULL ? TCL_ERROR : TCL_OK);

    if (status2 == TCL_OK) {
	SQLConfigDataSourceW =
	    (BOOL (INSTAPI*)(HWND, WORD, LPCWSTR, LPCWSTR))
	    Tcl_FindSymbol(NULL, *handle2Ptr, "SQLConfigDataSourceW");
	if (SQLConfigDataSourceW == NULL) {
	    SQLConfigDataSource =
		(BOOL (INSTAPI*)(HWND, WORD, LPCSTR, LPCSTR))
		Tcl_FindSymbol(NULL, *handle2Ptr,
			       "SQLConfigDataSource");
	}
	SQLInstallerError =
	    (BOOL (INSTAPI*)(WORD, DWORD*, LPSTR, WORD, WORD*))
	    Tcl_FindSymbol(NULL, *handle2Ptr, "SQLInstallerError");
    } else {
	Tcl_ResetResult(interp);
    }

    /*
     * We've successfully loaded a library.
     */

    return handle;
}

#else

/*
 *-----------------------------------------------------------------------------
 *
 * OdbcInitStubs --
 *
 *	Initialize the Stubs table for the ODBC API
 *
................................................................................
     */
    Tcl_DecrRefCount(shlibext);
    if (status != TCL_OK) {
	return NULL;
    }
    return handle;
}

#endif







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







 







<
<
<







 







<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<







 







<
<
25
26
27
28
29
30
31




























32
33
34
35
36
37
38
..
47
48
49
50
51
52
53



54
55
56
57
58
59
60
...
107
108
109
110
111
112
113


























































































































































































































































114
115
116
117
118
119
120
...
208
209
210
211
212
213
214


 * Static data used in this file
 */

/*
 * Names of the libraries that might contain the ODBC API
 */





























static const char *const odbcStubLibNames[] = {
#if defined(__APPLE__)
    "libiodbc.2",
#elif defined(__OpenBSD__)
    "libiodbc",
#else
    "odbc32", "odbc", "libodbc32", "libodbc", "libiodbc",
................................................................................
    "libiodbcinst",
#else
    "odbccp", "odbccp32", "odbcinst",
    "libodbccp", "libodbccp32", "libodbcinst", "libiodbcinst",
#endif
    NULL
};




/*
 * Names of the functions that we need from ODBC
 */

static const char *const odbcSymbolNames[] = {
    /* @SYMNAMES@: DO NOT EDIT THESE NAMES */
................................................................................
BOOL (INSTAPI* SQLConfigDataSourceW)(HWND, WORD, LPCWSTR, LPCWSTR)
= NULL;
BOOL (INSTAPI* SQLConfigDataSource)(HWND, WORD, LPCSTR, LPCSTR)
= NULL;
BOOL (INSTAPI* SQLInstallerError)(WORD, DWORD*, LPSTR, WORD, WORD*)
= NULL;



























































































































































































































































/*
 *-----------------------------------------------------------------------------
 *
 * OdbcInitStubs --
 *
 *	Initialize the Stubs table for the ODBC API
 *
................................................................................
     */
    Tcl_DecrRefCount(shlibext);
    if (status != TCL_OK) {
	return NULL;
    }
    return handle;
}