From db981117f697078eaf2d5c8ebd24cd24bc5b7447 Mon Sep 17 00:00:00 2001 From: Hiroshi Inoue Date: Sun, 4 Jan 2009 02:40:04 +0000 Subject: [PATCH] 1.Take domain types into account in SQLColumns() (Thanks to Luiz K. Matsumura). 2.Take RESTRICT actions into account in SQLForeignKeys() (report from Farid Zidan). 3.Fix a bug that small negative decimal values are mistaken for non-negative (bug report from Dominic Smith). 4.Use MSG_NOSIGNAL/MSG_NOSIGPIPE option on send()/recv() to avoid crash on SIGPIPE (bug report from Brian Feldman). 5.Remove a spurious "." with no trailing digits in timestamp representation (bug report from Brian Feldman). 6.Rename trim() funtion in order to avoid conflict of function name (report from Dominic Smith). 7.Put back the change to add *read only* clause for read only cursors. 8.Improve pgtype_transfer_octet_length(). --- catfunc.h | 1 + connection.c | 7 +- convert.c | 11 ++- descriptor.h | 4 +- dlg_specific.h | 1 + info.c | 203 +++++++++++++++++++++++++------------------------ misc.c | 2 +- misc.h | 2 +- mylog.c | 5 ++ pgtypes.c | 22 +++--- pgtypes.h | 2 +- results.c | 7 +- socket.c | 8 +- socket.h | 11 +++ sspisvcs.c | 12 +-- version.h | 2 +- 16 files changed, 165 insertions(+), 135 deletions(-) diff --git a/catfunc.h b/catfunc.h index 5a481b4..9f4a30d 100644 --- a/catfunc.h +++ b/catfunc.h @@ -48,6 +48,7 @@ enum { ,COLUMNS_AUTO_INCREMENT ,COLUMNS_PHYSICAL_NUMBER ,COLUMNS_TABLE_OID + ,COLUMNS_BASE_TYPEID ,NUM_OF_COLUMNS_FIELDS }; /* SQLPrimaryKeys field position */ diff --git a/connection.c b/connection.c index 30f8ac6..baed5cb 100644 --- a/connection.c +++ b/connection.c @@ -2543,7 +2543,7 @@ inolog("send_query response_length=%d\n", response_length); mylog("send_query: setting cmdbuffer = '%s'\n", cmdbuffer); - trim(cmdbuffer); /* get rid of trailing space */ + my_trim(cmdbuffer); /* get rid of trailing space */ if (strnicmp(cmdbuffer, bgncmd, lenbgncmd) == 0) { CC_set_in_trans(self); @@ -3513,7 +3513,7 @@ CC_send_cancel_request(const ConnectionClass *conn) crp.cp.backendPID = htonl(conn->be_pid); crp.cp.cancelAuthCode = htonl(conn->be_key); - while (send(tmpsock, (char *) &crp, sizeof(crp), 0) != (int) sizeof(crp)) + while (send(tmpsock, (char *) &crp, sizeof(crp), SEND_FLAG) != (int) sizeof(crp)) { if (SOCK_ERRNO != EINTR) { @@ -3524,7 +3524,7 @@ CC_send_cancel_request(const ConnectionClass *conn) } if (ret) { - while (recv(tmpsock, (char *) &crp, 1, 0) < 0) + while (recv(tmpsock, (char *) &crp, 1, RECV_FLAG) < 0) { if (EINTR != SOCK_ERRNO) break; @@ -3553,6 +3553,7 @@ int CC_mark_a_object_to_discard(ConnectionClass *conn, int type, const char *pla return 1; } + int CC_discard_marked_objects(ConnectionClass *conn) { int i, cnt; diff --git a/convert.c b/convert.c index f0f7833..7de1fdd 100644 --- a/convert.c +++ b/convert.c @@ -362,6 +362,8 @@ stime2timestamp(const SIMPLE_TIME *st, char *str, BOOL bZone, int precision) break; precstr[i] = '\0'; } + if (i == 0) + precstr[i] = '\0'; } zonestr[0] = '\0'; #ifdef TIMEZONE_GLOBAL @@ -2626,6 +2628,7 @@ inolog("type=%d concur=%d\n", stmt->options.cursor_type, stmt->options.scroll_co stmt->inaccurate_result = (0 != (qb->flags & FLGB_INACCURATE_RESULT)); if (0 == (qp->flags & FLGP_USING_CURSOR)) SC_no_fetchcursor(stmt); +#ifdef NOT_USED /* this seems problematic */ else if (0 == (qp->flags & (FLGP_SELECT_FOR_UPDATE_OR_SHARE | FLGP_SELECT_FOR_READONLY)) && 0 == stmt->multi_statement && PG_VERSION_GE(conn, 8.3)) @@ -2646,7 +2649,8 @@ inolog("type=%d concur=%d\n", stmt->options.cursor_type, stmt->options.scroll_co if (semi_colon_found) CVT_APPEND_CHAR(qb, semi_colon); CVT_TERMINATE(qb); - } + } +#endif /* NOT_USED */ if (0 != (qp->flags & FLGP_SELECT_INTO) || 0 != (qp->flags & FLGP_MULTIPLE_STATEMENT)) { @@ -3259,8 +3263,9 @@ inolog(" ival=%d,%d", ival, (val[3] << 24) | (val[2] << 16) | (val[1] << 8) | va o1val = ival / div; o2val = ival % div; if (0 == ns->sign) - o1val *= -1; - sprintf(chrform, "%d.%0*d", o1val, ns->scale, o2val); + sprintf(chrform, "-%d.%0*d", o1val, ns->scale, o2val); + else + sprintf(chrform, "%d.%0*d", o1val, ns->scale, o2val); } inolog(" convval=%s\n", chrform); return TRUE; diff --git a/descriptor.h b/descriptor.h index d9c72b8..b2ae87e 100644 --- a/descriptor.h +++ b/descriptor.h @@ -5,7 +5,7 @@ * * Comments: See "notice.txt" for copyright and license information. * - * $Id: descriptor.h,v 1.21 2008/09/24 13:14:32 hinoue Exp $ + * $Id: descriptor.h,v 1.22 2009/01/04 02:40:02 hinoue Exp $ * */ @@ -139,7 +139,7 @@ typedef struct int display_size; SQLLEN length; OID columntype; - OID basetype; + OID basetype; /* may be the basetype when the column type is a domain */ char expr; char quote; char dquote; diff --git a/dlg_specific.h b/dlg_specific.h index 9023a7e..efc28ab 100644 --- a/dlg_specific.h +++ b/dlg_specific.h @@ -21,6 +21,7 @@ extern "C" { #endif /* __cplusplus */ /* Unknown data type sizes */ +#define UNKNOWNS_AS_DEFAULT -1 #define UNKNOWNS_AS_MAX 0 #define UNKNOWNS_AS_DONTKNOW 1 #define UNKNOWNS_AS_LONGEST 2 diff --git a/info.c b/info.c index 3f982f8..7681bc3 100644 --- a/info.c +++ b/info.c @@ -950,7 +950,7 @@ inolog("serial in\n"); set_tuplefield_null(&tuple[12]); /* These values can be NULL */ - set_nullfield_int4(&tuple[2], pgtype_column_size(stmt, pgType, PG_STATIC, PG_STATIC)); + set_nullfield_int4(&tuple[2], pgtype_column_size(stmt, pgType, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_string(&tuple[3], pgtype_literal_prefix(stmt, pgType)); set_nullfield_string(&tuple[4], pgtype_literal_suffix(stmt, pgType)); set_nullfield_string(&tuple[5], pgtype_create_params(stmt, pgType)); @@ -1487,6 +1487,25 @@ static const char *gen_opestr(const char *orig_opestr, const ConnectionClass * c return (addE ? like_op_ext : like_op_sp); } +/* + * If specified schema name == user_name and the current schema is + * 'public', allowed to use the 'public' schema. + */ +static BOOL +allow_public_schema(ConnectionClass *conn, const char *szSchemaName, SQLSMALLINT cbSchemaName) +{ + const char *user = CC_get_username(conn); + size_t userlen = strlen(user); + + if (SQL_NTS == cbSchemaName) + cbSchemaName = strlen(szSchemaName); + + return (NULL != szSchemaName && + cbSchemaName == (SQLSMALLINT) userlen && + strnicmp(szSchemaName, user, userlen) == 0 && + stricmp(CC_get_current_schema(conn), pubstr) == 0); +} + RETCODE SQL_API PGAPI_Tables( HSTMT hstmt, @@ -1767,18 +1786,7 @@ retry_public_schema: (res = SC_get_Result(tbl_stmt)) && 0 == QR_get_num_total_tuples(res)) { - const char *user = CC_get_username(conn); - - /* - * If specified schema name == user_name and - * the current schema is 'public', - * retry the 'public' schema. - */ - if (szSchemaName && - (cbSchemaName == SQL_NTS || - cbSchemaName == (SQLSMALLINT) strlen(user)) && - strnicmp(szSchemaName, user, strlen(user)) == 0 && - stricmp(CC_get_current_schema(conn), pubstr) == 0) + if (allow_public_schema(conn, szSchemaName, cbSchemaName)) { szSchemaName = pubstr; cbSchemaName = SQL_NTS; @@ -2001,12 +2009,12 @@ PGAPI_Columns( Int2 field_number, sqltype, concise_type, result_cols, decimal_digits; - Int4 field_type, - the_type, - field_length, + Int4 field_length, mod_length, column_size, - ordinal; + ordinal, + typmod; + OID field_type, the_type, greloid, basetype; char useStaticPrecision, useStaticScale; char not_null[MAX_INFO_STRING], relhasrules[MAX_INFO_STRING], relkind[8]; @@ -2015,7 +2023,6 @@ PGAPI_Columns( ConnInfo *ci; ConnectionClass *conn; SQLSMALLINT internal_asis_type = SQL_C_CHAR, cbSchemaName; - SQLINTEGER greloid; const char *like_or_eq = likeop, *op_string; const char *szSchemaName; @@ -2078,12 +2085,14 @@ retry_public_schema: op_string = gen_opestr(like_or_eq, conn); if (conn->schema_support) { - strncpy(columns_query, + snprintf(columns_query, sizeof(columns_query), "select n.nspname, c.relname, a.attname, a.atttypid" ", t.typname, a.attnum, a.attlen, a.atttypmod, a.attnotnull" - ", c.relhasrules, c.relkind, c.oid, d.adsrc from (((pg_catalog.pg_class c" + ", c.relhasrules, c.relkind, c.oid, d.adsrc, %s from (((pg_catalog.pg_class c" " inner join pg_catalog.pg_namespace n on n.oid = c.relnamespace", - sizeof(columns_query)); + PG_VERSION_GE(conn, 7.4) ? + "case t.typtype when 'd' then t.typbasetype else 0 end, t.typtypmod" + : "0, -1"); if (search_by_ids) snprintf_add(columns_query, sizeof(columns_query), " and c.oid = %u", reloid); else @@ -2114,8 +2123,8 @@ retry_public_schema: snprintf(columns_query, sizeof(columns_query), "select u.usename, c.relname, a.attname, a.atttypid" ", t.typname, a.attnum, a.attlen, %s, a.attnotnull" - ", c.relhasrules, c.relkind, c.oid, NULL from pg_user u" - ", pg_class c, pg_attribute a, pg_type t where" + ", c.relhasrules, c.relkind, c.oid, NULL, 0, -1 from" + " pg_user u, pg_class c, pg_attribute a, pg_type t where" " u.usesysid = c.relowner and c.oid= a.attrelid" " and a.atttypid = t.oid and (a.attnum > 0)", PG_VERSION_LE(conn, 6.2) ? "a.attlen" : "a.atttypmod"); @@ -2151,19 +2160,8 @@ retry_public_schema: (res = SC_get_Result(col_stmt)) && 0 == QR_get_num_total_tuples(res)) { - const char *user = CC_get_username(conn); - - /* - * If specified schema name == user_name and - * the current schema is 'public', - * retry the 'public' schema. - */ if (!search_by_ids && - szSchemaName && - (cbSchemaName == SQL_NTS || - cbSchemaName == (SQLSMALLINT) strlen(user)) && - strnicmp(szSchemaName, user, strlen(user)) == 0 && - stricmp(CC_get_current_schema(conn), pubstr) == 0) + allow_public_schema(conn, szSchemaName, cbSchemaName)) { PGAPI_FreeStmt(hcol_stmt, SQL_DROP); hcol_stmt = NULL; @@ -2197,7 +2195,7 @@ retry_public_schema: goto cleanup; } - result = PGAPI_BindCol(hcol_stmt, 4, SQL_C_LONG, + result = PGAPI_BindCol(hcol_stmt, 4, SQL_C_ULONG, &field_type, 4, NULL); if (!SQL_SUCCEEDED(result)) { @@ -2271,6 +2269,22 @@ retry_public_schema: goto cleanup; } + result = PGAPI_BindCol(hcol_stmt, 14, SQL_C_ULONG, + &basetype, sizeof(basetype), NULL); + if (!SQL_SUCCEEDED(result)) + { + SC_error_copy(stmt, col_stmt, TRUE); + goto cleanup; + } + + result = PGAPI_BindCol(hcol_stmt, 15, SQL_C_LONG, + &typmod, sizeof(typmod), NULL); + if (!SQL_SUCCEEDED(result)) + { + SC_error_copy(stmt, col_stmt, TRUE); + goto cleanup; + } + if (res = QR_Constructor(), !res) { SC_set_error(stmt, STMT_NO_MEMORY_ERROR, "Couldn't allocate memory for PGAPI_Columns result.", func); @@ -2316,7 +2330,8 @@ retry_public_schema: QR_set_field_info_v(res, COLUMNS_FIELD_TYPE, "FIELD_TYPE", PG_TYPE_INT4, 4); QR_set_field_info_v(res, COLUMNS_AUTO_INCREMENT, "AUTO_INCREMENT", PG_TYPE_INT4, 4); QR_set_field_info_v(res, COLUMNS_PHYSICAL_NUMBER, "PHYSICAL NUMBER", PG_TYPE_INT2, 2); - QR_set_field_info_v(res, COLUMNS_TABLE_OID, "TABLE OID", PG_TYPE_INT4, 4); + QR_set_field_info_v(res, COLUMNS_TABLE_OID, "TABLE OID", PG_TYPE_OID, 4); + QR_set_field_info_v(res, COLUMNS_BASE_TYPEID, "BASE TYPEID", PG_TYPE_OID, 4); ordinal = 1; result = PGAPI_Fetch(hcol_stmt); @@ -2352,8 +2367,8 @@ retry_public_schema: set_tuplefield_int2(&tuple[COLUMNS_DATA_TYPE], sqltype); set_tuplefield_string(&tuple[COLUMNS_TYPE_NAME], "OID"); - set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_int2(&tuple[COLUMNS_SCALE], pgtype_decimal_digits(stmt, the_type, PG_STATIC)); set_nullfield_int2(&tuple[COLUMNS_RADIX], pgtype_radix(stmt, the_type)); set_tuplefield_int2(&tuple[COLUMNS_NULLABLE], SQL_NO_NULLS); @@ -2367,11 +2382,12 @@ retry_public_schema: set_tuplefield_int4(&tuple[COLUMNS_ORDINAL_POSITION], ordinal); set_tuplefield_string(&tuple[COLUMNS_IS_NULLABLE], "No"); #endif /* ODBCVER */ - set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_tuplefield_int4(&tuple[COLUMNS_FIELD_TYPE], the_type); set_tuplefield_int4(&tuple[COLUMNS_AUTO_INCREMENT], TRUE); set_tuplefield_int2(&tuple[COLUMNS_PHYSICAL_NUMBER], OID_ATTNUM); set_tuplefield_int4(&tuple[COLUMNS_TABLE_OID], greloid); + set_tuplefield_int4(&tuple[COLUMNS_BASE_TYPEID], 0); ordinal++; } } @@ -2404,6 +2420,12 @@ mylog(" and the data=%s\n", attdef); set_tuplefield_string(&tuple[COLUMNS_TABLE_NAME], table_name); set_tuplefield_string(&tuple[COLUMNS_COLUMN_NAME], field_name); auto_unique = SQL_FALSE; + if (basetype != 0 && + field_type != conn->lobj_type) + { + field_type = basetype; + mod_length = typmod; + } switch (field_type) { case PG_TYPE_INT4: @@ -2513,21 +2535,21 @@ mylog(" and the data=%s\n", attdef); #endif /* UNICODE_SUPPORT */ set_tuplefield_int4(&tuple[COLUMNS_LENGTH], field_length); #if (ODBCVER >= 0x0300) - set_tuplefield_int4(&tuple[COLUMNS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, field_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, field_type, mod_length)); #endif /* ODBCVER */ set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], mod_length); } if (useStaticPrecision) { - mylog("%s: field type is OTHER: field_type = %d, pgtype_length = %d\n", func, field_type, pgtype_buffer_length(stmt, field_type, PG_STATIC, PG_STATIC)); + mylog("%s: field type is OTHER: field_type = %d, pgtype_length = %d\n", func, field_type, pgtype_buffer_length(stmt, field_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); - set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, field_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, field_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, field_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, field_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); #if (ODBCVER >= 0x0300) set_tuplefield_null(&tuple[COLUMNS_CHAR_OCTET_LENGTH]); #endif /* ODBCVER */ - set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, field_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, field_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); } if (useStaticScale) { @@ -2560,6 +2582,7 @@ mylog(" and the data=%s\n", attdef); set_tuplefield_int4(&tuple[COLUMNS_AUTO_INCREMENT], auto_unique); set_tuplefield_int2(&tuple[COLUMNS_PHYSICAL_NUMBER], field_number); set_tuplefield_int4(&tuple[COLUMNS_TABLE_OID], greloid); + set_tuplefield_int4(&tuple[COLUMNS_BASE_TYPEID], basetype); ordinal++; result = PGAPI_Fetch(hcol_stmt); @@ -2593,8 +2616,8 @@ mylog(" and the data=%s\n", attdef); sqltype = pgtype_to_concise_type(stmt, the_type, PG_STATIC); set_tuplefield_int2(&tuple[COLUMNS_DATA_TYPE], sqltype); set_tuplefield_string(&tuple[COLUMNS_TYPE_NAME], pgtype_to_name(stmt, the_type, FALSE)); - set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_PRECISION], pgtype_column_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[COLUMNS_LENGTH], pgtype_buffer_length(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_int2(&tuple[COLUMNS_SCALE], pgtype_decimal_digits(stmt, the_type, PG_STATIC)); set_nullfield_int2(&tuple[COLUMNS_RADIX], pgtype_radix(stmt, the_type)); set_tuplefield_int2(&tuple[COLUMNS_NULLABLE], SQL_NO_NULLS); @@ -2607,11 +2630,12 @@ mylog(" and the data=%s\n", attdef); set_tuplefield_int4(&tuple[COLUMNS_ORDINAL_POSITION], ordinal); set_tuplefield_string(&tuple[COLUMNS_IS_NULLABLE], "No"); #endif /* ODBCVER */ - set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[COLUMNS_DISPLAY_SIZE], pgtype_display_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_tuplefield_int4(&tuple[COLUMNS_FIELD_TYPE], the_type); set_tuplefield_int4(&tuple[COLUMNS_AUTO_INCREMENT], FALSE); set_tuplefield_int2(&tuple[COLUMNS_PHYSICAL_NUMBER], XMIN_ATTNUM); set_tuplefield_int4(&tuple[COLUMNS_TABLE_OID], greloid); + set_tuplefield_int4(&tuple[COLUMNS_BASE_TYPEID], 0); ordinal++; } result = SQL_SUCCESS; @@ -2749,18 +2773,7 @@ retry_public_schema: (res = SC_get_Result(col_stmt)) && 0 == QR_get_num_total_tuples(res)) { - const char *user = CC_get_username(conn); - - /* - * If specified schema name == user_name and - * the current schema is 'public', - * retry the 'public' schema. - */ - if (szSchemaName && - (cbSchemaName == SQL_NTS || - cbSchemaName == (SQLSMALLINT) strlen(user)) && - strnicmp(szSchemaName, user, strlen(user)) == 0 && - stricmp(CC_get_current_schema(conn), pubstr) == 0) + if (allow_public_schema(conn, szSchemaName, cbSchemaName)) { PGAPI_FreeStmt(hcol_stmt, SQL_DROP); hcol_stmt = NULL; @@ -2840,8 +2853,8 @@ retry_public_schema: set_tuplefield_string(&tuple[1], "ctid"); set_tuplefield_int2(&tuple[2], pgtype_to_concise_type(stmt, the_type, PG_STATIC)); set_tuplefield_string(&tuple[3], pgtype_to_name(stmt, the_type, FALSE)); - set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_tuplefield_int2(&tuple[6], pgtype_decimal_digits(stmt, the_type, PG_STATIC)); set_tuplefield_int2(&tuple[7], SQL_PC_NOT_PSEUDO); inolog("Add ctid\n"); @@ -2864,8 +2877,8 @@ inolog("Add ctid\n"); set_tuplefield_string(&tuple[1], OID_NAME); set_tuplefield_int2(&tuple[2], pgtype_to_concise_type(stmt, the_type, PG_STATIC)); set_tuplefield_string(&tuple[3], pgtype_to_name(stmt, the_type, TRUE)); - set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_tuplefield_int2(&tuple[6], pgtype_decimal_digits(stmt, the_type, PG_STATIC)); set_tuplefield_int2(&tuple[7], SQL_PC_PSEUDO); } @@ -2881,8 +2894,8 @@ inolog("Add ctid\n"); set_tuplefield_string(&tuple[1], "xmin"); set_tuplefield_int2(&tuple[2], pgtype_to_concise_type(stmt, the_type, PG_STATIC)); set_tuplefield_string(&tuple[3], pgtype_to_name(stmt, the_type, FALSE)); - set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, PG_STATIC)); + set_tuplefield_int4(&tuple[4], pgtype_column_size(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); + set_tuplefield_int4(&tuple[5], pgtype_buffer_length(stmt, the_type, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_tuplefield_int2(&tuple[6], pgtype_decimal_digits(stmt, the_type, PG_STATIC)); set_tuplefield_int2(&tuple[7], SQL_PC_PSEUDO); } @@ -3795,18 +3808,8 @@ retry_public_schema: if (conn->schema_support && SQL_NO_DATA_FOUND == result) { - const char *user = CC_get_username(conn); - - /* - * If specified schema name == user_name and - * the current schema is 'public', - * retry the 'public' schema. - */ - if (0 == reloid && szSchemaName && - (cbSchemaName == SQL_NTS || - cbSchemaName == (SQLSMALLINT) strlen(user)) && - strnicmp(szSchemaName, user, strlen(user)) == 0 && - stricmp(CC_get_current_schema(conn), pubstr) == 0) + if (0 == reloid && + allow_public_schema(conn, szSchemaName, cbSchemaName)) { szSchemaName = pubstr; cbSchemaName = SQL_NTS; @@ -4925,7 +4928,7 @@ PGAPI_ProcedureColumns( QResultClass *res, *tres; SQLLEN tcount; OID pgtype; - Int4 paramcount, i, j; + Int4 paramcount, column_size, i, j; RETCODE result; BOOL search_pattern, bRetset; const char *like_or_eq, *op_string, *retset; @@ -5106,8 +5109,9 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_RETURN_VALUE); set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, pgtype, PG_STATIC)); set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, FALSE)); - set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, pgtype, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, PG_STATIC)); + column_size = pgtype_column_size(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT); + set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size); + set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, pgtype, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, pgtype)); set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN); @@ -5116,7 +5120,7 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]); set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, pgtype, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype)); - set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, PG_STATIC, PG_STATIC)); + set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, column_size)); set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], 0); set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING); #endif /* ODBCVER >= 0x0300 */ @@ -5231,8 +5235,9 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_PARAM_INPUT); set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, pgtype, PG_STATIC)); set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, pgtype, FALSE)); - set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, pgtype, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, PG_STATIC)); + column_size = pgtype_column_size(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT); + set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size); + set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, pgtype, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, pgtype, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, pgtype)); set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN); @@ -5241,7 +5246,7 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]); set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, pgtype, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, pgtype)); - set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, PG_STATIC, PG_STATIC)); + set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, pgtype, column_size)); set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], j + 1); set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING); #endif /* ODBCVER >= 0x0300 */ @@ -5270,8 +5275,9 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_int2(&tuple[PROCOLS_COLUMN_TYPE], SQL_RESULT_COL); set_tuplefield_int2(&tuple[PROCOLS_DATA_TYPE], pgtype_to_concise_type(stmt, typid, PG_STATIC)); set_tuplefield_string(&tuple[PROCOLS_TYPE_NAME], pgtype_to_name(stmt, typid, FALSE)); - set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], pgtype_column_size(stmt, typid, PG_STATIC, PG_STATIC)); - set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, typid, PG_STATIC, PG_STATIC)); + column_size = pgtype_column_size(stmt, typid, PG_STATIC, UNKNOWNS_AS_DEFAULT); + set_nullfield_int4(&tuple[PROCOLS_COLUMN_SIZE], column_size); + set_tuplefield_int4(&tuple[PROCOLS_BUFFER_LENGTH], pgtype_buffer_length(stmt, typid, PG_STATIC, UNKNOWNS_AS_DEFAULT)); set_nullfield_int2(&tuple[PROCOLS_DECIMAL_DIGITS], pgtype_decimal_digits(stmt, typid, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_NUM_PREC_RADIX], pgtype_radix(stmt, typid)); set_tuplefield_int2(&tuple[PROCOLS_NULLABLE], SQL_NULLABLE_UNKNOWN); @@ -5280,7 +5286,7 @@ mylog("atttypid=%s\n", atttypid ? atttypid : "(null)"); set_tuplefield_null(&tuple[PROCOLS_COLUMN_DEF]); set_nullfield_int2(&tuple[PROCOLS_SQL_DATA_TYPE], pgtype_to_sqldesctype(stmt, typid, PG_STATIC)); set_nullfield_int2(&tuple[PROCOLS_SQL_DATETIME_SUB], pgtype_to_datetime_sub(stmt, typid)); - set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, typid, PG_STATIC, PG_STATIC)); + set_nullfield_int4(&tuple[PROCOLS_CHAR_OCTET_LENGTH], pgtype_transfer_octet_length(stmt, typid, column_size)); set_tuplefield_int4(&tuple[PROCOLS_ORDINAL_POSITION], 0); set_tuplefield_string(&tuple[PROCOLS_IS_NULLABLE], NULL_STRING); #endif /* ODBCVER >= 0x0300 */ @@ -5569,18 +5575,7 @@ retry_public_schema: (flag & PODBC_SEARCH_PUBLIC_SCHEMA) != 0 && 0 == tablecount) { - const char *user = CC_get_username(conn); - - /* - * If specified schema name == user_name and - * the current schema is 'public', - * retry the 'public' schema. - */ - if (szSchemaName && - (cbSchemaName == SQL_NTS || - cbSchemaName == (SQLSMALLINT) strlen(user)) && - strnicmp(szSchemaName, user, strlen(user)) == 0 && - stricmp(CC_get_current_schema(conn), pubstr) == 0) + if (allow_public_schema(conn, szSchemaName, cbSchemaName)) { QR_Destructor(wres); wres = NULL; @@ -5851,12 +5846,14 @@ PGAPI_ForeignKeys_new( "\n when 'c' then %d::int2" "\n when 'n' then %d::int2" "\n when 'd' then %d::int2" + "\n when 'r' then %d::int2" "\n else %d::int2" "\n end as UPDATE_RULE" ",\n case ref.confdeltype" "\n when 'c' then %d::int2" "\n when 'n' then %d::int2" "\n when 'd' then %d::int2" + "\n when 'r' then %d::int2" "\n else %d::int2" "\n end as DELETE_RULE" ",\n ref.conname as FK_NAME" @@ -5909,10 +5906,12 @@ PGAPI_ForeignKeys_new( , SQL_CASCADE , SQL_SET_NULL , SQL_SET_DEFAULT + , SQL_RESTRICT , SQL_NO_ACTION , SQL_CASCADE , SQL_SET_NULL , SQL_SET_DEFAULT + , SQL_RESTRICT , SQL_NO_ACTION #if (ODBCVER >= 0x0300) , SQL_INITIALLY_DEFERRED @@ -5955,12 +5954,14 @@ PGAPI_ForeignKeys_new( "\n when 'c' then %d::int2" "\n when 'n' then %d::int2" "\n when 'd' then %d::int2" + "\n when 'r' then %d::int2" "\n else %d::int2" "\n end as UPDATE_RULE" ",\n case confdeltype" "\n when 'c' then %d::int2" "\n when 'n' then %d::int2" "\n when 'd' then %d::int2" + "\n when 'r' then %d::int2" "\n else %d::int2" "\n end as DELETE_RULE" ",\n conname as FK_NAME" @@ -6003,10 +6004,12 @@ PGAPI_ForeignKeys_new( , SQL_CASCADE , SQL_SET_NULL , SQL_SET_DEFAULT + , SQL_RESTRICT , SQL_NO_ACTION , SQL_CASCADE , SQL_SET_NULL , SQL_SET_DEFAULT + , SQL_RESTRICT , SQL_NO_ACTION #if (ODBCVER >= 0x0300) , SQL_INITIALLY_DEFERRED diff --git a/misc.c b/misc.c index 63c4e0f..a226d75 100644 --- a/misc.c +++ b/misc.c @@ -246,7 +246,7 @@ remove_newlines(char *string) char * -trim(char *s) +my_trim(char *s) { size_t i; diff --git a/misc.h b/misc.h index 42571b8..46d0423 100644 --- a/misc.h +++ b/misc.h @@ -128,7 +128,7 @@ void FinalizeLogging(); void remove_newlines(char *string); char *strncpy_null(char *dst, const char *src, ssize_t len); -char *trim(char *string); +char *my_trim(char *string); char *make_string(const char *s, ssize_t len, char *buf, size_t bufsize); char *make_lstring_ifneeded(ConnectionClass *, const char *s, ssize_t len, BOOL); char *my_strcat(char *buf, const char *fmt, const char *s, ssize_t len); diff --git a/mylog.c b/mylog.c index 6a073f0..d790bdd 100644 --- a/mylog.c +++ b/mylog.c @@ -174,6 +174,11 @@ mylog(const char *fmt,...) { generate_homefile(MYLOGFILE, filebuf); MLOGFP = fopen(filebuf, PG_BINARY_A); + if (!MLOGFP) + { + generate_filename("c:\\podbclog", MYLOGFILE, filebuf); + MLOGFP = fopen(filebuf, PG_BINARY_A); + } } if (MLOGFP) setbuf(MLOGFP, NULL); diff --git a/pgtypes.c b/pgtypes.c index 229911a..ddb2f53 100644 --- a/pgtypes.c +++ b/pgtypes.c @@ -890,6 +890,8 @@ pgtype_column_size(StatementClass *stmt, OID type, int col, int handle_unknown_s ConnectionClass *conn = SC_get_conn(stmt); ConnInfo *ci = &(conn->connInfo); + if (handle_unknown_size_as == UNKNOWNS_AS_DEFAULT) + handle_unknown_size_as = ci->drivers.unknown_sizes; switch (type) { case PG_TYPE_CHAR: @@ -1160,22 +1162,22 @@ pgtype_desclength(StatementClass *stmt, OID type, int col, int handle_unknown_si * Transfer octet length. */ Int4 -pgtype_transfer_octet_length(StatementClass *stmt, OID type, int col, int handle_unknown_size_as) +pgtype_transfer_octet_length(StatementClass *stmt, OID type, int column_size) { ConnectionClass *conn = SC_get_conn(stmt); int coef = 1; - Int4 prec = pgtype_column_size(stmt, type, col, handle_unknown_size_as), maxvarc; + Int4 maxvarc; switch (type) { case PG_TYPE_VARCHAR: case PG_TYPE_BPCHAR: case PG_TYPE_TEXT: - if (SQL_NO_TOTAL == prec) - return prec; + if (SQL_NO_TOTAL == column_size) + return column_size; #ifdef UNICODE_SUPPORT if (CC_is_in_unicode_driver(conn)) - return prec * WCLEN; + return column_size * WCLEN; #endif /* UNICODE_SUPPORT */ /* after 7.2 */ if (PG_VERSION_GE(conn, 7.2)) @@ -1184,16 +1186,16 @@ pgtype_transfer_octet_length(StatementClass *stmt, OID type, int col, int handle /* CR -> CR/LF */ coef = 2; if (coef == 1) - return prec; + return column_size; maxvarc = conn->connInfo.drivers.max_varchar_size; - if (prec <= maxvarc && prec * coef > maxvarc) + if (column_size <= maxvarc && column_size * coef > maxvarc) return maxvarc; - return coef * prec; + return coef * column_size; case PG_TYPE_BYTEA: - return prec; + return column_size; default: if (type == conn->lobj_type) - return prec; + return column_size; } return -1; } diff --git a/pgtypes.h b/pgtypes.h index 5a87a2d..ba94999 100644 --- a/pgtypes.h +++ b/pgtypes.h @@ -98,7 +98,7 @@ SQLSMALLINT pgtype_precision(StatementClass *stmt, OID type, int col, int handle Int4 pgtype_display_size(StatementClass *stmt, OID type, int col, int handle_unknown_size_as); Int4 pgtype_buffer_length(StatementClass *stmt, OID type, int col, int handle_unknown_size_as); Int4 pgtype_desclength(StatementClass *stmt, OID type, int col, int handle_unknown_size_as); -Int4 pgtype_transfer_octet_length(StatementClass *stmt, OID type, int col, int handle_unknown_size_as); +Int4 pgtype_transfer_octet_length(StatementClass *stmt, OID type, int column_size); SQLSMALLINT pgtype_decimal_digits(StatementClass *stmt, OID type, int col); /* corresponds to "scale" in ODBC 2.x */ SQLSMALLINT pgtype_min_decimal_digits(StatementClass *stmt, OID type); /* corresponds to "min_scale" in ODBC 2.x */ diff --git a/results.c b/results.c index 59e7abe..f7ba1e0 100644 --- a/results.c +++ b/results.c @@ -458,7 +458,7 @@ PGAPI_ColAttributes( Int2 col_idx; ConnectionClass *conn; ConnInfo *ci; - int unknown_sizes; + int column_size, unknown_sizes; int cols = 0; RETCODE result; const char *p = NULL; @@ -623,6 +623,7 @@ inolog("answering bookmark info\n"); mylog("colAttr: col %d field_type=%d fi,ti=%p,%p\n", col_idx, field_type, fi, ti); + column_size = (fi != NULL && fi->column_size > 0) ? fi->column_size : pgtype_column_size(stmt, field_type, col_idx, unknown_sizes); switch (fDescType) { case SQL_COLUMN_AUTO_INCREMENT: /* == SQL_DESC_AUTO_UNIQUE_VALUE */ @@ -707,7 +708,7 @@ inolog("COLUMN_NULLABLE=%d\n", value); break; case SQL_COLUMN_PRECISION: /* in 2.x */ - value = (fi && fi->column_size > 0) ? fi->column_size : pgtype_column_size(stmt, field_type, col_idx, unknown_sizes); + value = column_size; if (value < 0) value = 0; @@ -793,7 +794,7 @@ inolog("COLUMN_SCALE=%d\n", value); mylog("%s: col %d, desc_length = %d\n", func, col_idx, value); break; case SQL_DESC_OCTET_LENGTH: - value = (fi && fi->length > 0) ? fi->length : pgtype_transfer_octet_length(stmt, field_type, col_idx, unknown_sizes); + value = (fi && fi->length > 0) ? fi->length : pgtype_transfer_octet_length(stmt, field_type, column_size); if (-1 == value) value = 0; mylog("%s: col %d, octet_length = %d\n", func, col_idx, value); diff --git a/socket.c b/socket.c index a42af03..aeec5cd 100644 --- a/socket.c +++ b/socket.c @@ -507,11 +507,11 @@ static int SOCK_SSPI_recv(SocketClass *self, void *buffer, int len) { #ifdef USE_SSPI if (!self->sspisvcs || !self->ssd) - return recv(self->socket, (char *) buffer, len, 0); + return recv(self->socket, (char *) buffer, len, RECV_FLAG); else return SSPI_recv(self, (char *) buffer, len); #endif /* USE_SSPI */ - return recv(self->socket, (char *) buffer, len, 0); + return recv(self->socket, (char *) buffer, len, RECV_FLAG); } static int SOCK_SSPI_send(SocketClass *self, const void *buffer, int len) @@ -520,11 +520,11 @@ static int SOCK_SSPI_send(SocketClass *self, const void *buffer, int len) CSTR func = "SOCK_SSPI_send"; if (!self->sspisvcs || !self->ssd) - return send(self->socket, (char *) buffer, len, 0); + return send(self->socket, (char *) buffer, len, SEND_FLAG); else return SSPI_send(self, buffer, len); #endif /* USE_SSPI */ - return send(self->socket, (char *) buffer, len, 0); + return send(self->socket, (char *) buffer, len, SEND_FLAG); } #ifdef USE_SSL diff --git a/socket.h b/socket.h index 8ac24f5..71a3246 100644 --- a/socket.h +++ b/socket.h @@ -102,6 +102,17 @@ typedef int (WSAAPI *getaddrinfo_func) (const char *, const char *, typedef int (WSAAPI *getnameinfo_func) (const struct sockaddr *, socklen_t, char *, size_t, char *, size_t, int); +#ifdef MSG_NOSIGNAL +#define SEND_FLAG MSG_NOSIGNAL +#define RECV_FLAG MSG_NOSIGNAL +#elseifdef MSG_NOSIGPIPE +#define SEND_FLAG MSG_NOSIGPIPE +#define RECV_FLAG MSG_NOSIGPIPE +#else +#define SEND_FLAG 0 +#define RECV_FLAG 0 +#endif /* MSG_NOSIGNAL */ + #define SOCKET_ALREADY_CONNECTED 1 #define SOCKET_HOST_NOT_FOUND 2 #define SOCKET_COULD_NOT_CREATE_SOCKET 3 diff --git a/sspisvcs.c b/sspisvcs.c index aa7615b..3ac01d4 100644 --- a/sspisvcs.c +++ b/sspisvcs.c @@ -64,7 +64,7 @@ static int sendall(SOCKET sock, const void *buf, int len) retry_count = 0; for (ttllen = 0, reqlen = len; reqlen > 0;) { - if (0 > (wrtlen = send(sock, (const char *) buf + ttllen, reqlen, 0))) + if (0 > (wrtlen = send(sock, (const char *) buf + ttllen, reqlen, SEND_FLAG))) { int gerrno = SOCK_ERRNO; @@ -97,7 +97,7 @@ static int recvall(SOCKET sock, void *buf, int len) for (ttllen = 0, reqlen = len; reqlen > 0;) { - if (0 > (rcvlen = recv(sock, (char *) buf + ttllen, reqlen, 0))) + if (0 > (rcvlen = recv(sock, (char *) buf + ttllen, reqlen, RECV_FLAG))) { int gerrno = SOCK_ERRNO; @@ -478,7 +478,7 @@ SchannelClientHandshakeLoop( cbData = recv(Socket, IoBuffer + cbIoBuffer, IO_BUFFER_SIZE - cbIoBuffer, - 0); + RECV_FLAG); if (cbData == SOCKET_ERROR) { int gerrno = SOCK_ERRNO; @@ -904,7 +904,7 @@ mylog("buf=%p read=%d req=%d\n", pbIoBuffer, cbIoBuffer, reqlen); cbData = recv(self->socket, pbIoBuffer + cbIoBuffer, reqlen, - 0); + RECV_FLAG); if (cbData == SOCKET_ERROR) { int gerrno = SOCK_ERRNO; @@ -1075,7 +1075,7 @@ cleanup: return rtnlen; } else - return recv(self->socket, (char *) buffer, len, 0); + return recv(self->socket, (char *) buffer, len, RECV_FLAG); } int SSPI_send(SocketClass *self, const void *buffer, int len) @@ -1139,7 +1139,7 @@ mylog("EMPTY=%p %d %d\n", sb[3].pvBuffer, sb[3].cbBuffer, sb[3].BufferType); return slen; } else - return send(self->socket, (char *) buffer, len, 0); + return send(self->socket, (char *) buffer, len, SEND_FLAG); } void ReleaseSvcSpecData(SocketClass *self) diff --git a/version.h b/version.h index 31dcd0f..3b623cd 100644 --- a/version.h +++ b/version.h @@ -12,6 +12,6 @@ #define POSTGRESDRIVERVERSION "08.03.0401" #define POSTGRES_RESOURCE_VERSION "08.03.0401\0" #define PG_DRVFILE_VERSION 8,3,04,01 -#define PG_BUILD_VERSION "200811230001" +#define PG_BUILD_VERSION "200901040002" #endif -- 2.39.5