From 273a604ff4894da3f5ddc409bb1b3c5e2847aa06 Mon Sep 17 00:00:00 2001 From: Hiroshi Inoue Date: Wed, 2 May 2007 21:44:13 +0000 Subject: [PATCH] The version is now 8.2.0401. [Windows] Handle AUTOCOMMIT mode more carefully in a distributed transaction so as not to issue COMMIT unexpectedly. [UNIX} Allow the UNIX domain configuration (the same as libpq). --- connection.c | 24 ++++++++++++++++++++++-- connection.h | 5 ++--- convert.c | 46 +++++++++++++++++++++++++++++----------------- descriptor.c | 2 +- msdtc_enlist.cpp | 17 +++++++++++------ options.c | 39 ++++++++++++++++++++++----------------- parse.c | 3 +-- pgapi30.c | 6 +++--- pgtypes.c | 2 +- psqlodbc.h | 8 ++++++-- results.c | 4 ++-- socket.c | 12 ++++++++---- version.h | 8 ++++---- win64.mak | 16 ++++++++-------- 14 files changed, 120 insertions(+), 72 deletions(-) diff --git a/connection.c b/connection.c index 780783e..11104aa 100644 --- a/connection.c +++ b/connection.c @@ -287,7 +287,7 @@ CC_conninfo_init(ConnInfo *conninfo) conninfo->cvt_null_date_string = -1; #ifdef _HANDLE_ENLIST_IN_DTC_ conninfo->xa_opt = -1; - conninfo->autocommit_normal = 0; + conninfo->autocommit_public = SQL_AUTOCOMMIT_ON; #endif /* _HANDLE_ENLIST_IN_DTC_ */ memcpy(&(conninfo->drivers), &globals, sizeof(globals)); } @@ -548,6 +548,26 @@ CC_abort(ConnectionClass *self) return ret; } +/* This is called by SQLSetConnectOption etc also */ +char +CC_set_autocommit(ConnectionClass *self, BOOL on) +{ + CSTR func = "CC_set_autocommit"; + BOOL currsts = CC_is_in_autocommit(self); + + if ((on && currsts) || + (!on && !currsts)) + return on; + mylog("%s: %d->%d\n", func, currsts, on); + if (CC_is_in_trans(self)) + CC_commit(self); + if (on) + self->transact_status |= CONN_IN_AUTOCOMMIT; + else + self->transact_status &= ~CONN_IN_AUTOCOMMIT; + + return on; +} /* This is called by SQLDisconnect also */ char @@ -3056,7 +3076,7 @@ CC_lookup_lo(ConnectionClass *self) NULL, IGNORE_ABORT_ON_CONN | ROLLBACK_ON_ERROR, NULL); if (QR_command_maybe_successful(res) && QR_get_num_cached_tuples(res) > 0) { - Oid basetype; + OID basetype; self->lobj_type = QR_get_value_backend_int(res, 0, 0, NULL); basetype = QR_get_value_backend_int(res, 0, 1, NULL); diff --git a/connection.h b/connection.h index 7419ef2..1958d63 100644 --- a/connection.h +++ b/connection.h @@ -84,8 +84,6 @@ enum #define CONN_IN_ERROR_BEFORE_IDLE (1L<<3) /* AutoCommit functions */ -#define CC_set_autocommit_off(x) (x->transact_status &= ~CONN_IN_AUTOCOMMIT) -#define CC_set_autocommit_on(x) (x->transact_status |= CONN_IN_AUTOCOMMIT) #define CC_is_in_autocommit(x) (x->transact_status & CONN_IN_AUTOCOMMIT) /* Transaction in/not functions */ @@ -307,7 +305,7 @@ typedef struct signed char cvt_null_date_string; #ifdef _HANDLE_ENLIST_IN_DTC_ signed char xa_opt; - signed char autocommit_normal; + signed char autocommit_public; #endif /* _HANDLE_ENLIST_IN_DTC_ */ GLOBAL_VALUES drivers; /* moved from driver's option */ } ConnInfo; @@ -486,6 +484,7 @@ char CC_cleanup(ConnectionClass *self); char CC_begin(ConnectionClass *self); char CC_commit(ConnectionClass *self); char CC_abort(ConnectionClass *self); +char CC_set_autocommit(ConnectionClass *self, BOOL on); int CC_set_translation(ConnectionClass *self); char CC_connect(ConnectionClass *self, char password_req, char *salt); char CC_add_statement(ConnectionClass *self, StatementClass *stmt); diff --git a/convert.c b/convert.c index 22d6efe..57815e6 100644 --- a/convert.c +++ b/convert.c @@ -2412,14 +2412,29 @@ inolog("%s: enter prepared=%d\n", func, stmt->prepared); stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; else if (stmt->options.scroll_concurrency != SQL_CONCUR_READ_ONLY) { - if (SQL_CURSOR_KEYSET_DRIVEN == stmt->options.cursor_type && - 0 == (ci->updatable_cursors & ALLOW_KEYSET_DRIVEN_CURSORS)) - stmt->options.cursor_type = SQL_CURSOR_STATIC; - if (SQL_CURSOR_STATIC == stmt->options.cursor_type && - 0 == (ci->updatable_cursors & ALLOW_STATIC_CURSORS)) - stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; - else if (SC_update_not_ready(stmt)) - parse_statement(stmt, TRUE); + if (SQL_CURSOR_KEYSET_DRIVEN == stmt->options.cursor_type) + { + if (0 == (ci->updatable_cursors & ALLOW_KEYSET_DRIVEN_CURSORS)) + stmt->options.cursor_type = SQL_CURSOR_STATIC; + else + { + if (SC_update_not_ready(stmt)) + parse_statement(stmt, TRUE); + if (stmt->updatable && + stmt->ntab > 0) + { + if (bestitem = GET_NAME(stmt->ti[0]->bestitem), NULL == bestitem) + stmt->options.cursor_type = SQL_CURSOR_STATIC; + } + } + } + if (SQL_CURSOR_STATIC == stmt->options.cursor_type) + { + if (0 == (ci->updatable_cursors & ALLOW_STATIC_CURSORS)) + stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; + else if (SC_update_not_ready(stmt)) + parse_statement(stmt, TRUE); + } if (SC_parsed_status(stmt) == STMT_PARSE_FATAL) { stmt->options.scroll_concurrency = SQL_CONCUR_READ_ONLY; @@ -2436,9 +2451,7 @@ inolog("%s: enter prepared=%d\n", func, stmt->prepared); qp->from_pos = stmt->from_pos; qp->where_pos = stmt->where_pos; } -inolog("type=%d concur=%d\n", - stmt->options.cursor_type, - stmt->options.scroll_concurrency); +inolog("type=%d concur=%d\n", stmt->options.cursor_type, stmt->options.scroll_concurrency); } SC_miscinfo_clear(stmt); @@ -2582,12 +2595,11 @@ inolog("type=%d concur=%d\n", * 2nd query is keyset gathering */ CVT_APPEND_STR(qb, " where ctid = '(0,0)';select \"ctid"); - if (stmt && stmt->ntab > 0) - bestitem = GET_NAME(stmt->ti[0]->bestitem); - if (!bestitem) - bestitem = OID_NAME; - CVT_APPEND_STR(qb, "\", \""); - CVT_APPEND_STR(qb, bestitem); + if (bestitem) + { + CVT_APPEND_STR(qb, "\", \""); + CVT_APPEND_STR(qb, bestitem); + } CVT_APPEND_STR(qb, "\" from "); CVT_APPEND_DATA(qb, qp->statement + qp->from_pos + 5, npos - qp->from_pos - 5); } diff --git a/descriptor.c b/descriptor.c index f51fd9c..82a9f46 100644 --- a/descriptor.c +++ b/descriptor.c @@ -32,7 +32,7 @@ void TI_Constructor(TABLE_INFO *self, const ConnectionClass *conn) char qual[32]; STR_TO_NAME(self->bestitem, OID_NAME); - sprintf(qual, "\"oid\" = %%u"); + sprintf(qual, "\"%s\" = %%u", OID_NAME); STR_TO_NAME(self->bestqual, qual); TI_set_hasoids(self); TI_set_hasoids_checked(self); diff --git a/msdtc_enlist.cpp b/msdtc_enlist.cpp index 721d1c9..bb9a8dd 100755 --- a/msdtc_enlist.cpp +++ b/msdtc_enlist.cpp @@ -235,6 +235,8 @@ public: }; +#define SYNC_AUTOCOMMIT(conn) (SQL_AUTOCOMMIT_OFF != conn->connInfo.autocommit_public ? (conn->transact_status |= CONN_IN_AUTOCOMMIT) : (conn->transact_status &= ~CONN_IN_AUTOCOMMIT)) + IAsyncPG::IAsyncPG(void) : helper(NULL), RMCookie(0), enlist(NULL), conn(NULL), xaconn(NULL), refcnt(1), prepared(false), requestAccepted(false) { InterlockedIncrement(&g_cComponents); @@ -410,6 +412,7 @@ void IAsyncPG::SetDone(HRESULT res) if (conn) { conn->asdum = NULL; + SYNC_AUTOCOMMIT(conn); conn = NULL; } SLOCK_RELEASE(); @@ -448,6 +451,7 @@ ConnectionClass *IAsyncPG::generateXAConn(bool spinAcquired) PGAPI_AllocConnect(conn->henv, (HDBC *) &xaconn); memcpy(&xaconn->connInfo, &conn->connInfo, sizeof(ConnInfo)); conn->asdum = NULL; + SYNC_AUTOCOMMIT(conn); conn = NULL; SLOCK_RELEASE(); LIFELOCK_RELEASE; @@ -972,6 +976,8 @@ mylog("dllname=%s dsn=%s\n", GetXaLibName(), conn->connInfo.dsn); res = 0; DWORD rSize; ret = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, regKey, 0, KEY_QUERY_VALUE | KEY_SET_VALUE, &sKey); + if (ERROR_SUCCESS != ret) + ret = ::RegCreateKeyEx(HKEY_LOCAL_MACHINE, regKey, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &sKey, NULL); if (ERROR_SUCCESS == ret) { switch (ret = ::RegQueryValueEx(sKey, "XADLL", NULL, NULL, NULL, &rSize)) @@ -990,6 +996,7 @@ mylog("dllname=%s dsn=%s\n", GetXaLibName(), conn->connInfo.dsn); res = 0; CC_set_error(conn, CONN_UNSUPPORTED_OPTION, "XARMCreate error:Please register HKLM\\SOFTWARE\\Microsoft\\MSDTC\\XADLL", func); break; } + ::RegCloseKey(sKey); } } if (!errset) @@ -1020,8 +1027,8 @@ mylog("ConvertTridToXID -> %s\n", pgxid); return SQL_ERROR; } - mylog("asdum=%x start transaction\n", asdum); - CC_set_autocommit_off(conn); + mylog("asdum=%p start transaction\n", asdum); + CC_set_autocommit(conn, FALSE); asdum->SetConnection(conn); conn->asdum = asdum; @@ -1032,7 +1039,6 @@ mylog("ConvertTridToXID -> %s\n", pgxid); EXTERN_C RETCODE EnlistInDtc(ConnectionClass *conn, void *pTra, int method) { static ITransactionDispenser *pDtc = NULL; - ConnInfo *ci = &(conn->connInfo); if (!pTra) { @@ -1041,14 +1047,13 @@ EXTERN_C RETCODE EnlistInDtc(ConnectionClass *conn, void *pTra, int method) { /* asdum->Release(); */ } - if (ci->autocommit_normal) - CC_set_autocommit_on(conn); + else + SYNC_AUTOCOMMIT(conn); return SQL_SUCCESS; } if (CC_is_in_trans(conn)) { CC_abort(conn); - ci->autocommit_normal = (CC_is_in_autocommit(conn) ? 1 : 0); } if (!pDtc) { diff --git a/options.c b/options.c index d87138d..6b99163 100644 --- a/options.c +++ b/options.c @@ -288,8 +288,10 @@ PGAPI_SetConnectOption( { CSTR func = "PGAPI_SetConnectOption"; ConnectionClass *conn = (ConnectionClass *) hdbc; + ConnInfo *ci = &(conn->connInfo); char changed = FALSE; RETCODE retval; + BOOL autocomm_on; mylog("%s: entering fOption = %d vParam = %d\n", func, fOption, vParam); if (!conn) @@ -351,29 +353,33 @@ PGAPI_SetConnectOption( break; case SQL_AUTOCOMMIT: - if (vParam == SQL_AUTOCOMMIT_ON && CC_is_in_autocommit(conn)) - break; - else if (vParam == SQL_AUTOCOMMIT_OFF && !CC_is_in_autocommit(conn)) - break; - if (CC_is_in_trans(conn)) - CC_commit(conn); - - mylog("PGAPI_SetConnectOption: AUTOCOMMIT: transact_status=%d, vparam=%d\n", conn->transact_status, vParam); - switch (vParam) { - case SQL_AUTOCOMMIT_OFF: - CC_set_autocommit_off(conn); - break; - case SQL_AUTOCOMMIT_ON: - CC_set_autocommit_on(conn); + autocomm_on = TRUE; + break; + case SQL_AUTOCOMMIT_OFF: + autocomm_on = FALSE; break; - default: CC_set_error(conn, CONN_INVALID_ARGUMENT_NO, "Illegal parameter value for SQL_AUTOCOMMIT", func); return SQL_ERROR; } + if (autocomm_on && SQL_AUTOCOMMIT_OFF != ci->autocommit_public) + break; + else if (!autocomm_on && SQL_AUTOCOMMIT_OFF == ci->autocommit_public) + break; + ci->autocommit_public = (autocomm_on ? SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF); + mylog("%s: AUTOCOMMIT: transact_status=%d, vparam=%d\n", func, conn->transact_status, vParam); + +#ifdef _HANDLE_ENLIST_IN_DTC_ + if (NULL != conn->asdum) + { + mylog("%s: Ignored AUTOCOMMIT in a distributed transaction, OK ?"); + break; + } +#endif /* _HANDLE_ENLIST_IN_DTC_ */ + CC_set_autocommit(conn, autocomm_on); break; case SQL_CURRENT_QUALIFIER: /* ignored */ @@ -522,8 +528,7 @@ PGAPI_GetConnectOption( break; case SQL_AUTOCOMMIT: - *((SQLUINTEGER *) pvParam) = (SQLUINTEGER) (CC_is_in_autocommit(conn) ? - SQL_AUTOCOMMIT_ON : SQL_AUTOCOMMIT_OFF); + *((SQLUINTEGER *) pvParam) = ci->autocommit_public; break; case SQL_CURRENT_QUALIFIER: /* don't use qualifiers */ diff --git a/parse.c b/parse.c index 9d7d87f..25ec4d8 100644 --- a/parse.c +++ b/parse.c @@ -389,8 +389,7 @@ static BOOL CheckHasOids(StatementClass * stmt) TI_set_hasoids(ti); foundKey = TRUE; STR_TO_NAME(ti->bestitem, OID_NAME); - strcpy(query, "\"oid\" = %u"); - /*strcpy(query, "\"oid\" = %%u");*/ + sprintf(query, "\"%s\" = %u", OID_NAME); STR_TO_NAME(ti->bestqual, query); } TI_set_hasoids_checked(ti); diff --git a/pgapi30.c b/pgapi30.c index 685d8f2..d5f4ab2 100644 --- a/pgapi30.c +++ b/pgapi30.c @@ -1669,7 +1669,7 @@ PGAPI_SetConnectAttr(HDBC ConnectionHandle, if (unsupported) { char msg[64]; - snprintf(msg, sizeof(msg), "Couldn't set unsupported connect attribute " FORMAT_LPTR, (LONG_PTR) Value); + snprintf(msg, sizeof(msg), "Couldn't set unsupported connect attribute " FORMAT_INTEGER, Attribute); CC_set_error(conn, CONN_OPTION_NOT_FOR_THE_DRIVER, msg, func); return SQL_ERROR; } @@ -1951,7 +1951,7 @@ RETCODE bulk_ope_callback(RETCODE retcode, void *para) } conn = SC_get_conn(s->stmt); if (s->auto_commit_needed) - PGAPI_SetConnectOption(conn, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON); + CC_set_autocommit(conn, TRUE); irdflds = SC_get_IRDF(s->stmt); if (irdflds->rowsFetched) *(irdflds->rowsFetched) = s->processed; @@ -1981,7 +1981,7 @@ PGAPI_BulkOperations(HSTMT hstmt, SQLSMALLINT operationX) { conn = SC_get_conn(s.stmt); if (s.auto_commit_needed = (char) CC_is_in_autocommit(conn), s.auto_commit_needed) - PGAPI_SetConnectOption(conn, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); + CC_set_autocommit(conn, FALSE); } if (SQL_ADD != s.operation) { diff --git a/pgtypes.c b/pgtypes.c index 47371e7..e21bbc6 100644 --- a/pgtypes.c +++ b/pgtypes.c @@ -530,7 +530,7 @@ pgtype_to_name(StatementClass *stmt, OID type, BOOL auto_increment) case PG_TYPE_INT2: return "int2"; case PG_TYPE_OID: - return "oid"; + return OID_NAME; case PG_TYPE_XID: return "xid"; case PG_TYPE_INT4: diff --git a/psqlodbc.h b/psqlodbc.h index e53711a..22bb52a 100644 --- a/psqlodbc.h +++ b/psqlodbc.h @@ -5,7 +5,7 @@ * * Comments: See "notice.txt" for copyright and license information. * - * $Id: psqlodbc.h,v 1.118 2007/04/11 16:36:47 h-saito Exp $ + * $Id: psqlodbc.h,v 1.119 2007/05/02 21:44:12 hinoue Exp $ * */ @@ -308,8 +308,12 @@ typedef double SDOUBLE; * "date+outlet+invoice" */ /* POSIX defines a PATH_MAX.( wondows is _MAX_PATH ..) */ #ifndef PATH_MAX +#ifdef _MAX_PATH +#define PATH_MAX _MAX_PATH +#else #define PATH_MAX 1024 -#endif +#endif /* _MAX_PATH */ +#endif /* PATH_MAX */ #define MAX_ROW_SIZE 0 /* Unlimited rowsize with the * Tuple Toaster */ diff --git a/results.c b/results.c index 510820a..7cecf7f 100644 --- a/results.c +++ b/results.c @@ -4469,7 +4469,7 @@ RETCODE spos_callback(RETCODE retcode, void *para) } conn = SC_get_conn(s->stmt); if (s->auto_commit_needed) - PGAPI_SetConnectOption(conn, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_ON); + CC_set_autocommit(conn, TRUE); if (s->irow > 0) { if (SQL_ADD != s->fOption && s->ridx >= 0) /* for SQLGetData */ @@ -4584,7 +4584,7 @@ mylog("num_cols=%d gdatainfo=%d\n", QR_NumPublicResultCols(s.res), gdata_allocat case SQL_DELETE: case SQL_ADD: if (s.auto_commit_needed = CC_is_in_autocommit(conn), s.auto_commit_needed) - PGAPI_SetConnectOption(conn, SQL_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF); + CC_set_autocommit(conn, FALSE); break; case SQL_POSITION: break; diff --git a/socket.c b/socket.c index 5da82d3..bb20ed2 100644 --- a/socket.c +++ b/socket.c @@ -223,9 +223,13 @@ SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long tim getnameinfo_ptr = (getnameinfo_func)GetProcAddress(ws2_hnd, "getnameinfo"); #endif /* - * If it is a valid IP address, use it. Otherwise use hostname lookup. + * Hostname lookup. */ - if (hostname && hostname[0]) + if (hostname && hostname[0] +#ifndef WIN32 + && '/' != hostname[0] +#endif /* WIN32 */ + ) { char portstr[16]; int ret; @@ -251,8 +255,8 @@ SOCK_connect_to(SocketClass *self, unsigned short port, char *hostname, long tim { struct sockaddr_un *un = (struct sockaddr_un *) &(self->sadr_area); family = un->sun_family = AF_UNIX; - /* passing NULL means that this only supports the pg default "/tmp" */ - UNIXSOCK_PATH(un, port, ((char *) NULL)); + /* passing NULL or '' means pg default "/tmp" */ + UNIXSOCK_PATH(un, port, hostname); self->sadr_len = UNIXSOCK_LEN(un); } #else diff --git a/version.h b/version.h index dc9b610..6d30b56 100644 --- a/version.h +++ b/version.h @@ -9,9 +9,9 @@ #ifndef __VERSION_H__ #define __VERSION_H__ -#define POSTGRESDRIVERVERSION "08.02.0400" -#define POSTGRES_RESOURCE_VERSION "08.02.0400\0" -#define PG_DRVFILE_VERSION 8,2,04,00 -#define PG_BUILD_VERSION "200704280001" +#define POSTGRESDRIVERVERSION "08.02.0401" +#define POSTGRES_RESOURCE_VERSION "08.02.0401\0" +#define PG_DRVFILE_VERSION 8,2,04,01 +#define PG_BUILD_VERSION "200704290001" #endif diff --git a/win64.mak b/win64.mak index c9bfe8e..033e957 100755 --- a/win64.mak +++ b/win64.mak @@ -231,7 +231,7 @@ BSC32_SBRS= \ LINK32=link.exe LIB32=lib.exe -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib advapi32.lib odbc32.lib odbccp32.lib wsock32.lib XOleHlp.lib winmm.lib "$(OUTDIR)\$(DTCLIB).lib" msvcrt.lib bufferoverflowu.lib /nologo /dll /machine:$(CPU) /def:"$(DEF_FILE)" /pdb:"$(OUTDIR)\psqlodbc.pdb" /out:"$(OUTDIR)\$(MAINDLL)" /implib:"$(OUTDIR)\$(MAINLIB).lib" +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib advapi32.lib odbc32.lib odbccp32.lib wsock32.lib XOleHlp.lib winmm.lib "$(OUTDIR)\$(DTCLIB).lib" msvcrt.lib bufferoverflowu.lib /nologo /dll /machine:$(CPU) /def:"$(DEF_FILE)" !IF "$(ANSI_VERSION)" == "yes" DEF_FILE= "psqlodbca.def" !ELSE @@ -290,35 +290,35 @@ LINK32_OBJS= \ "$(INTDIR)\psqlodbc.res" DTCDEF_FILE= "$(DTCLIB).def" -LIB32_DTCLIBFLAGS=/nologo /machine:$(CPU) /def:"$(DTCDEF_FILE)" /out:"$(OUTDIR)\$(DTCLIB).lib" +LIB32_DTCLIBFLAGS=/nologo /machine:$(CPU) /def:"$(DTCDEF_FILE)" -LINK32_DTCFLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib wsock32.lib XOleHlp.lib $(OUTDIR)\$(MAINLIB).lib bufferoverflowu.lib Delayimp.lib /DelayLoad:XOLEHLP.DLL /nologo /dll /incremental:no /pdb:"$(OUTDIR)\$(DTCLIB).pdb" /machine:$(CPU) /out:"$(OUTDIR)\$(DTCDLL)" +LINK32_DTCFLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib uuid.lib wsock32.lib XOleHlp.lib $(OUTDIR)\$(MAINLIB).lib bufferoverflowu.lib Delayimp.lib /DelayLoad:XOLEHLP.DLL /nologo /dll /incremental:no /machine:$(CPU) LINK32_DTCOBJS= \ "$(INTDIR)\msdtc_enlist.obj" "$(INTDIR)\xalibname.obj" XADEF_FILE= "$(XALIB).def" -LINK32_XAFLAGS=/nodefaultlib:libcmt.lib kernel32.lib user32.lib gdi32.lib advapi32.lib odbc32.lib odbccp32.lib wsock32.lib XOleHlp.lib winmm.lib msvcrt.lib bufferoverflowu.lib /nologo /dll /incremental:no /pdb:"$(OUTDIR)\$(XALIB).pdb" /machine:$(CPU) /def:"$(XADEF_FILE)" /out:"$(OUTDIR)\$(XADLL)" /implib:"$(OUTDIR)\$(XALIB).lib" +LINK32_XAFLAGS=/nodefaultlib:libcmt.lib kernel32.lib user32.lib gdi32.lib advapi32.lib odbc32.lib odbccp32.lib wsock32.lib XOleHlp.lib winmm.lib msvcrt.lib bufferoverflowu.lib /nologo /dll /incremental:no /machine:$(CPU) /def:"$(XADEF_FILE)" LINK32_XAOBJS= \ "$(INTDIR)\pgxalib.obj" "$(OUTDIR)\$(MAINDLL)" : $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< - $(LINK32_FLAGS) $(LINK32_OBJS) + $(LINK32_FLAGS) $(LINK32_OBJS) /pdb:$*.pdb /implib:$*.lib /out:$@ << "$(OUTDIR)\$(DTCLIB).lib" : $(DEF_FILE) $(LINK32_DTCOBJS) $(LIB32) @<< - $(LIB32_DTCLIBFLAGS) $(LINK32_DTCOBJS) + $(LIB32_DTCLIBFLAGS) $(LINK32_DTCOBJS) /out:$@ << "$(OUTDIR)\$(DTCDLL)" : $(LINK32_DTCOBJS) $(LINK32) @<< - $(LINK32_DTCFLAGS) $(LINK32_DTCOBJS) $(OUTDIR)\$(DTCLIB).exp + $(LINK32_DTCFLAGS) $(LINK32_DTCOBJS) $*.exp /pdb:$*.pdb /out:$@ << "$(OUTDIR)\$(XADLL)" : $(XADEF_FILE) $(LINK32_XAOBJS) $(LINK32) @<< - $(LINK32_XAFLAGS) $(LINK32_XAOBJS) + $(LINK32_XAFLAGS) $(LINK32_XAOBJS) /pdb:$*.pdb /implib:$*.lib /out:$@ << -- 2.39.5