Changeset: 616bb4cd6210 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/616bb4cd6210 Branch: strimps_v3 Log Message:
Merge with default branch diffs (truncated from 1343 to 300 lines): diff --git a/ChangeLog.Mar2025 b/ChangeLog.Mar2025 --- a/ChangeLog.Mar2025 +++ b/ChangeLog.Mar2025 @@ -1,3 +1,9 @@ # ChangeLog file for devel # This file is updated with Maddlog +* Thu May 8 2025 Sjoerd Mullender <[email protected]> +- It is now possible to specify an idle timeout using --set + idle_timeout=<seconds> (see mserver5 manual page) which gets triggered + if a connection to the server is idle (i.e. does not send any queries + to the server) while there is a SQL transaction active. + diff --git a/clients/mapilib/mapi_querytype.h b/clients/mapilib/mapi_querytype.h --- a/clients/mapilib/mapi_querytype.h +++ b/clients/mapilib/mapi_querytype.h @@ -13,7 +13,7 @@ #ifndef _MAPI_QUERYTYPE_H_INCLUDED #define _MAPI_QUERYTYPE_H_INCLUDED 1 -/* this definition is a straight copy from sql/include/sql_query.h */ +/* this definition is also used by the SQL layer */ typedef enum { Q_PARSE = 0, Q_TABLE = 1, diff --git a/clients/odbc/driver/ODBCConvert.c b/clients/odbc/driver/ODBCConvert.c --- a/clients/odbc/driver/ODBCConvert.c +++ b/clients/odbc/driver/ODBCConvert.c @@ -1019,23 +1019,39 @@ ODBCFetch(ODBCStmt *stmt, if (type == SQL_C_DEFAULT) type = ODBCDefaultType(irdrec); - if (precision == UNAFFECTED || - scale == UNAFFECTED || - datetime_interval_precision == UNAFFECTED) { + if (precision == UNAFFECTED) { + precision = (ardrec) ? ardrec->sql_desc_precision : (type == SQL_C_NUMERIC) ? 10 : 6; + } + if (scale == UNAFFECTED) { + scale = (ardrec) ? ardrec->sql_desc_scale : 0; + } + if (datetime_interval_precision == UNAFFECTED) { if (ardrec) { - if (precision == UNAFFECTED) - precision = ardrec->sql_desc_precision; - if (scale == UNAFFECTED) - scale = ardrec->sql_desc_scale; - if (datetime_interval_precision == UNAFFECTED) - datetime_interval_precision = ardrec->sql_desc_datetime_interval_precision; + datetime_interval_precision = ardrec->sql_desc_datetime_interval_precision; } else { - if (precision == UNAFFECTED) - precision = type == SQL_C_NUMERIC ? 10 : 6; - if (scale == UNAFFECTED) - scale = 0; - if (datetime_interval_precision == UNAFFECTED) + switch (type) { + case SQL_C_INTERVAL_YEAR: + datetime_interval_precision = 4; + break; + case SQL_C_INTERVAL_YEAR_TO_MONTH: + case SQL_C_INTERVAL_MONTH: + datetime_interval_precision = 6; + break; + case SQL_C_INTERVAL_DAY: + case SQL_C_INTERVAL_DAY_TO_HOUR: + case SQL_C_INTERVAL_DAY_TO_MINUTE: + case SQL_C_INTERVAL_DAY_TO_SECOND: + case SQL_C_INTERVAL_HOUR: + case SQL_C_INTERVAL_HOUR_TO_MINUTE: + case SQL_C_INTERVAL_HOUR_TO_SECOND: + case SQL_C_INTERVAL_MINUTE: + case SQL_C_INTERVAL_MINUTE_TO_SECOND: + case SQL_C_INTERVAL_SECOND: + datetime_interval_precision = 9; + break; + default: datetime_interval_precision = 2; + } } } i = datetime_interval_precision; diff --git a/clients/odbc/tests/ODBCtester.c b/clients/odbc/tests/ODBCtester.c --- a/clients/odbc/tests/ODBCtester.c +++ b/clients/odbc/tests/ODBCtester.c @@ -269,7 +269,7 @@ testGetDataGUID(SQLHANDLE stmt) pos += snprintf(outp + pos, outp_len - pos, "NULL\n"); else pos += snprintf(outp + pos, outp_len - pos, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x\n", - (unsigned int) guid_val.Data1, guid_val.Data2, guid_val.Data3, + guid_val.Data1, guid_val.Data2, guid_val.Data3, guid_val.Data4[0], guid_val.Data4[1], guid_val.Data4[2], guid_val.Data4[3], guid_val.Data4[4], guid_val.Data4[5], guid_val.Data4[6], guid_val.Data4[7]); check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col)"); } @@ -297,6 +297,118 @@ testGetDataGUID(SQLHANDLE stmt) return ret; } +static SQLRETURN +testGetDataIntervalDay(SQLHANDLE stmt, int sqlquery) +{ + SQLRETURN ret; + SQLLEN RowCount = 0; + SWORD NumResultCols = 0; + + size_t outp_len = 1800; + char * outp = malloc(outp_len); + size_t pos = 0; + + char * sql1 = "select cast(NULL as interval day) as valnil, cast('99' as interval day) as val1, cast('-99' as interval day) as val2;"; + char * sql2 = "select cast(NULL as interval day) as valnil, cast('101' as interval day) as val1, cast('-102' as interval day) as val2;"; /* Interval field overflow */ + ret = SQLExecDirect(stmt, (sqlquery == 1) ? (SQLCHAR *) sql1 : (SQLCHAR *) sql2, SQL_NTS); + pos += snprintf(outp + pos, outp_len - pos, "SQLExecDirect query %d\n", sqlquery); + check(ret, SQL_HANDLE_STMT, stmt, "SQLExecDirect"); + + ret = SQLRowCount(stmt, &RowCount); + pos += snprintf(outp + pos, outp_len - pos, "SQLRowCount is " LLFMT "\n", (int64_t) RowCount); + check(ret, SQL_HANDLE_STMT, stmt, "SQLRowCount"); + + ret = SQLNumResultCols(stmt, &NumResultCols); + pos += snprintf(outp + pos, outp_len - pos, "SQLNumResultCols is %d\n", NumResultCols); + check(ret, SQL_HANDLE_STMT, stmt, "SQLNumResultCols"); + + ret = SQLFetch(stmt); + pos += snprintf(outp + pos, outp_len - pos, "SQLFetch\n"); + check(ret, SQL_HANDLE_STMT, stmt, "SQLFetch"); + + for (SWORD col = 1; col <= NumResultCols; col++) { + char buf[99]; + char str_val[42]; + int int_val; + SQL_INTERVAL_STRUCT itv_val; + SQLLEN vallen = 0; + SQLLEN NumAttr = 0; + + /* retrieve query result column metadata */ + ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_CONCISE_TYPE, (PTR)&buf, (SQLLEN)20, NULL, &NumAttr); + pos += snprintf(outp + pos, outp_len - pos, "SQLColAttribute(%d, SQL_DESC_CONCISE_TYPE) returns %d, NumAttr " LLFMT "\n", col, ret, (int64_t) NumAttr); + ret = SQLColAttribute(stmt, (UWORD)col, SQL_DESC_DISPLAY_SIZE, (PTR)&buf, (SQLLEN)20, NULL, &NumAttr); + pos += snprintf(outp + pos, outp_len - pos, "SQLColAttribute(%d, SQL_DESC_DISPLAY_SIZE) returns %d, NumAttr " LLFMT "\n", col, ret, (int64_t) NumAttr); + + /* test SQLGetData(SQL_C_CHAR) */ + ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_CHAR, (PTR)&str_val, (SQLLEN)41, &vallen); + pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, SQL_C_CHAR, 41) returns %d, vallen " LLFMT ", str_val: '%s'\n", + col, ret, (int64_t) vallen, (vallen == SQL_NULL_DATA) ? "NULL" : str_val); + check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as str"); + + /* test SQLGetData(SQL_C_SLONG) */ + ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_SLONG, (PTR)&int_val, (SQLLEN)4, &vallen); + pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, SQL_C_SLONG) returns %d, vallen " LLFMT ", int_val: ", col, ret, (int64_t) vallen); + if (vallen == SQL_NULL_DATA) + pos += snprintf(outp + pos, outp_len - pos, "NULL\n"); + else + pos += snprintf(outp + pos, outp_len - pos, "%d\n", int_val); + check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int"); /* SQLstate 07006 Restricted data type attribute violation */ + + /* test SQLGetData(SQL_C_INTERVAL_DAY) */ + ret = SQLGetData(stmt, (UWORD)col, (SWORD)SQL_C_INTERVAL_DAY, (PTR)&itv_val, (SQLLEN)sizeof(SQL_INTERVAL_STRUCT), &vallen); + pos += snprintf(outp + pos, outp_len - pos, "SQLGetData(%d, SQL_C_INTERVAL_DAY) returns %d, vallen " LLFMT ", itv_day_val: ", col, ret, (int64_t) vallen); + if (vallen == SQL_NULL_DATA) + pos += snprintf(outp + pos, outp_len - pos, "NULL\n"); + else + pos += snprintf(outp + pos, outp_len - pos, "%d (type %d, sign %d)\n", itv_val.intval.day_second.day, itv_val.interval_type, itv_val.interval_sign); + check(ret, SQL_HANDLE_STMT, stmt, "SQLGetData(col) as int"); + } + + compareResult("testGetDataIntervalDay()", outp, + (sqlquery == 1) + ? "SQLExecDirect query 1\nSQLRowCount is 1\nSQLNumResultCols is 3\nSQLFetch\n" + "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, str_val: 'NULL'\n" + "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, int_val: NULL\n" + "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen -1, itv_day_val: NULL\n" + "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 17, str_val: 'INTERVAL '99' DAY'\n" + "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, int_val: 99\n" /* SQLstate 07006 Restricted data type attribute violation */ + "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 28, itv_day_val: 99 (type 3, sign 0)\n" + "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 18, str_val: 'INTERVAL -'99' DAY'\n" + "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, int_val: -99\n" /* SQLstate 07006 Restricted data type attribute violation */ + "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 28, itv_day_val: 99 (type 3, sign 1)\n" + : "SQLExecDirect query 2\nSQLRowCount is 1\nSQLNumResultCols is 3\nSQLFetch\n" + "SQLColAttribute(1, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(1, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(1, SQL_C_CHAR, 41) returns 0, vallen -1, str_val: 'NULL'\n" + "SQLGetData(1, SQL_C_SLONG) returns 0, vallen -1, int_val: NULL\n" + "SQLGetData(1, SQL_C_INTERVAL_DAY) returns 0, vallen -1, itv_day_val: NULL\n" + "SQLColAttribute(2, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(2, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(2, SQL_C_CHAR, 41) returns 0, vallen 18, str_val: 'INTERVAL '101' DAY'\n" + "SQLGetData(2, SQL_C_SLONG) returns 0, vallen 4, int_val: 101\n" /* SQLstate 07006 Restricted data type attribute violation */ + "SQLGetData(2, SQL_C_INTERVAL_DAY) returns 0, vallen 28, itv_day_val: 101 (type 3, sign 0)\n" /* SQLstate 22015 Interval field overflow */ + "SQLColAttribute(3, SQL_DESC_CONCISE_TYPE) returns 0, NumAttr 103\n" + "SQLColAttribute(3, SQL_DESC_DISPLAY_SIZE) returns 0, NumAttr 21\n" + "SQLGetData(3, SQL_C_CHAR, 41) returns 0, vallen 19, str_val: 'INTERVAL -'102' DAY'\n" + "SQLGetData(3, SQL_C_SLONG) returns 0, vallen 4, int_val: -102\n" /* SQLstate 07006 Restricted data type attribute violation */ + "SQLGetData(3, SQL_C_INTERVAL_DAY) returns 0, vallen 28, itv_day_val: 102 (type 3, sign 1)\n" /* SQLstate 22015 Interval field overflow */ + ); + + ret = SQLCloseCursor(stmt); + check(ret, SQL_HANDLE_STMT, stmt, "SQLCloseCursor"); + + /* cleanup */ + free(outp); + return ret; +} + int main(int argc, char **argv) { @@ -351,6 +463,12 @@ main(int argc, char **argv) ret = testGetDataGUID(stmt); check(ret, SQL_HANDLE_STMT, stmt, "testGetDataGUID(STMT)"); + ret = testGetDataIntervalDay(stmt, 1); + check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 99, -99)"); + + ret = testGetDataIntervalDay(stmt, 2); + check(ret, SQL_HANDLE_STMT, stmt, "testGetDataIntervalDay(STMT, 101, -102)"); + /* cleanup */ ret = SQLFreeHandle(SQL_HANDLE_STMT, stmt); check(ret, SQL_HANDLE_STMT, stmt, "SQLFreeHandle (STMT)"); diff --git a/common/utils/msabaoth.c b/common/utils/msabaoth.c --- a/common/utils/msabaoth.c +++ b/common/utils/msabaoth.c @@ -292,7 +292,7 @@ msab_marchScenario(const char *lang) if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL) return(tmp); - if ((f = MT_fopen(pathbuf, "a+")) != NULL) { + if ((f = MT_fopen(pathbuf, "r")) != NULL) { if ((len = fread(buf, 1, 255, f)) > 0) { char *p; @@ -308,6 +308,9 @@ msab_marchScenario(const char *lang) tmp = p; } } + fclose(f); + } + if ((f = MT_fopen(pathbuf, "a")) != NULL) { /* append to the file */ fprintf(f, "%s\n", lang); (void)fflush(f); @@ -336,10 +339,10 @@ msab_retreatScenario(const char *lang) if ((tmp = getDBPath(pathbuf, sizeof(pathbuf), SCENARIOFILE)) != NULL) return(tmp); - if ((f = MT_fopen(pathbuf, "a+")) != NULL) { + if ((f = MT_fopen(pathbuf, "r")) != NULL) { if ((len = fread(buf, 1, 255, f)) > 0) { char *p; - char written = 0; + bool written = false; buf[len] = '\0'; tmp = buf; @@ -348,14 +351,14 @@ msab_retreatScenario(const char *lang) *p = '\0'; if (strcmp(tmp, lang) == 0) { memmove(tmp, p + 1, strlen(p + 1) + 1); - written = 1; + written = true; } else { *p = '\n'; tmp = p+1; } } - if (written != 0) { - rewind(f); + fclose(f); + if (written && (f = fopen(pathbuf, "w")) != NULL) { len = strlen(buf) + 1; if (fwrite(buf, 1, len, f) < len) { snprintf(buf, sizeof(buf), "failed to write: %s (%s)", @@ -366,8 +369,11 @@ msab_retreatScenario(const char *lang) fflush(f); fclose(f); return(NULL); + } else if (written) { + snprintf(buf, sizeof(buf), "failed to open file: %s (%s)", + strerror(errno), pathbuf); + return strdup(buf); } - (void)fclose(f); (void) MT_remove(pathbuf); return(NULL); } else { @@ -383,9 +389,7 @@ msab_retreatScenario(const char *lang) return(NULL); } } - snprintf(buf, sizeof(buf), "failed to open file: %s (%s)", - strerror(errno), pathbuf); - return(strdup(buf)); + return(NULL); _______________________________________________ checkin-list mailing list -- [email protected] To unsubscribe send an email to [email protected]
