From: Jim S. <jim...@us...> - 2005-09-02 19:11:18
|
Update of /cvsroot/firebird/vulcan/src/alice In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv31050/src/alice Modified Files: alice.cpp alice.h alice_meta.epp alice_proto.h aliceswi.h all.cpp all.h all_proto.h exe.cpp tdr.cpp tdr_proto.h Log Message: Work in progress on Services provider Index: alice.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/alice.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- alice.cpp 20 Jan 2005 19:59:06 -0000 1.1.1.1 +++ alice.cpp 2 Sep 2005 19:11:10 -0000 1.2 @@ -24,8 +24,6 @@ // //____________________________________________________________ // -// $Id$ -// // 2001.07.06 Sean Leyne - Code Cleanup, removed "#ifdef READONLY_DATABASE" // conditionals, as the engine now fully supports // readonly databases. @@ -40,23 +38,23 @@ #include <stdlib.h> #include <string.h> #include <stdarg.h> +#include <stdio.h> +#include "../jrd/ibase.h" +#include "../jrd/common.h" +#include "../jrd/license.h" #include "../alice/alice.h" #include "../alice/aliceswi.h" -//#include "../alice/all.h" +#include "../alice/all.h" #include "../alice/all_proto.h" #include "../alice/exe_proto.h" -#include "../jrd/ib_stdio.h" -//#include "../jrd/y_ref.h" -#include "../jrd/ibase.h" -#include "../jrd/common.h" -#include "../jrd/license.h" #include "../jrd/msg_encode.h" #include "../jrd/gds_proto.h" #include "../jrd/svc.h" #include "../jrd/svc_proto.h" -#include "../jrd/thd_proto.h" +#include "../jrd/thd.h" #include "../alice/alice_proto.h" +#include "MsgFormat.h" #ifdef HAVE_UNISTD_H #include <unistd.h> @@ -87,29 +85,29 @@ // defined in burp.cpp as well, and is not relevant for SUPERSERVER #ifndef SUPERSERVER -struct tgbl *gdgbl; +AliceGlobals* gdgbl; #endif const int ALICE_MSG_FAC = 3; -static inline void exit_local(int code, volatile tgbl* tdgbl) +static inline void exit_local(int code, AliceGlobals* tdgbl) { tdgbl->exit_code = code; - //Firebird::status_exception::raise(1); - throw ExitException; + firebird::status_exception::raise(1); } #if defined (WIN95) static bool fAnsiCP = false; #endif -static void ALICE_error(USHORT number); // overloaded to keep down param count static inline void translate_cp(TEXT* sz); static void expand_filename(const TEXT*, TEXT*); + #ifndef SUPERSERVER -static int output_main(svc*, const UCHAR*); +static int output_main(Service*, const UCHAR*); #endif -static int common_main(int, char**, pfn_svc_output, svc*); + +static int common_main(int, char**, pfn_svc_output, Service*); static void alice_output(const SCHAR*, ...) ATTRIBUTE_FORMAT(1,2); @@ -120,9 +118,9 @@ // if gfix is run as a service // -static int output_svc(SVC output_data, const UCHAR * output_buf) +static int output_svc(Service* output_data, const UCHAR * output_buf) { - ib_fprintf(ib_stdout, "%s", output_buf); + fprintf(stdout, "%s", output_buf); return 0; } @@ -134,21 +132,17 @@ // Entry point for GFIX in case of service manager. // -int ALICE_main(svc* service) +THREAD_ENTRY_DECLARE ALICE_main(THREAD_ENTRY_PARAM arg) { + Service* service = (Service*)arg; const int exit_code = common_main(service->svc_argc, service->svc_argv, SVC_output, service); - service->svc_handle = 0; - if (service->svc_service->in_use != NULL) { - *(service->svc_service->in_use) = FALSE; - } - // Mark service thread as finished. // If service is detached, cleanup memory being used by service. SVC_finish(service, SVC_finished); - return exit_code; + return (THREAD_ENTRY_RETURN)(exit_code); } //____________________________________________________________ @@ -176,9 +170,9 @@ // Routine which is passed to GFIX for calling back when there is output. // -static int output_main(svc* output_data, const UCHAR* output_buf) +static int output_main(Service* output_data, const UCHAR* output_buf) { - ib_fprintf(ib_stderr, "%s", output_buf); + fprintf(stderr, "%s", output_buf); return 0; } @@ -193,27 +187,15 @@ int common_main(int argc, char* argv[], pfn_svc_output output_proc, - svc* output_data) + Service* output_data) { #if defined (WIN95) fAnsiCP = (GetConsoleCP() == GetACP()); #endif - volatile tgbl* tdgbl = (tgbl*) gds__alloc(sizeof(tgbl)); - - if (!tdgbl) - { - // NOMEM: return error, FREE: during function exit in the SETJMP - return FINI_ERROR; - } - - SET_THREAD_DATA; - SVC_PUTSPECIFIC_DATA; - memset((void *) tdgbl, 0, sizeof(tgbl)); - tdgbl->output_proc = output_proc; - tdgbl->output_data = output_data; - tdgbl->ALICE_permanent_pool = NULL; - tdgbl->ALICE_default_pool = NULL; + AliceGlobals gblInstance(output_proc, output_data); + AliceGlobals* tdgbl = &gblInstance; + AliceGlobals::putSpecific(tdgbl); try { @@ -224,14 +206,12 @@ // Perform some special handling when run as an Interbase service. The // first switch can be "-svc" (lower case!) or it can be "-svc_re" followed - // by 3 file descriptors to use in re-directing ib_stdin, ib_stdout, and ib_stderr. + // by 3 file descriptors to use in re-directing stdin, stdout, and stderr. tdgbl->sw_service = false; tdgbl->sw_service_thd = false; tdgbl->service_blk = NULL; - tdgbl->status = - // TMN: cast away volatile - (long *) tdgbl->status_vector; + tdgbl->status = tdgbl->status_vector; if (argc > 1 && !strcmp(argv[1], "-svc")) { @@ -243,7 +223,7 @@ { tdgbl->sw_service = true; tdgbl->sw_service_thd = true; - tdgbl->service_blk = (SVC) output_data; + tdgbl->service_blk = (Service*) output_data; tdgbl->status = tdgbl->service_blk->svc_status; argv++; argc--; @@ -255,6 +235,7 @@ long redir_in = atol(argv[2]); long redir_out = atol(argv[3]); long redir_err = atol(argv[4]); + #ifdef WIN_NT #if defined (WIN95) fAnsiCP = true; @@ -263,14 +244,19 @@ redir_out = _open_osfhandle(redir_out, 0); redir_err = _open_osfhandle(redir_err, 0); #endif - if (redir_in != 0 && dup2((int) redir_in, 0)) + + if (redir_in != 0) + if (dup2((int) redir_in, 0)) close((int) redir_in); - if (redir_out != 1 && dup2((int) redir_out, 1)) + if (redir_out != 1) + if (dup2((int) redir_out, 1)) close((int) redir_out); - if (redir_err != 2 && dup2((int) redir_err, 2)) + if (redir_err != 2) + if (dup2((int) redir_err, 2)) close((int) redir_err); + argv += 4; argc -= 4; } @@ -283,11 +269,12 @@ bool error = false; ULONG switches = 0; tdgbl->ALICE_data.ua_shutdown_delay = 0; - TEXT* database = NULL; + const TEXT* database = NULL; TEXT string[512]; - argv++; + // tested outside the loop + const in_sw_tab_t* table = alice_in_sw_table; while (--argc > 0) @@ -295,10 +282,9 @@ if ((*argv)[0] != '-') { if (database) - { ALICE_error(1, database, 0, 0, 0, 0); // msg 1: "data base file name (%s) already given", - } + database = *argv++; #if defined (WIN95) @@ -358,57 +344,75 @@ switches |= table->in_sw_value; + if ((table->in_sw_value & (sw_shut | sw_online)) && (argc > 1)) + { + ALICE_down_case(*argv, string, sizeof(string)); + bool found = false; + + if ((found = (strcmp(string, "normal") == 0))) + tdgbl->ALICE_data.ua_shutdown_mode = SHUT_NORMAL; + else if ((found = (strcmp(string, "multi") == 0))) + tdgbl->ALICE_data.ua_shutdown_mode = SHUT_MULTI; + else if ((found = (strcmp(string, "single") == 0))) + tdgbl->ALICE_data.ua_shutdown_mode = SHUT_SINGLE; + else if ((found = (strcmp(string, "full") == 0))) + tdgbl->ALICE_data.ua_shutdown_mode = SHUT_FULL; + + // Consume argument only if we identified mode + // Let's hope that database with names of modes above are unusual + + if (found) + { + argv++; + argc--; + } + } + if (table->in_sw_value & sw_begin_log) { if (--argc <= 0) ALICE_error(5); // msg 5: replay log pathname required - expand_filename(*argv++, // TMN: cast away volatile - (TEXT *) tdgbl->ALICE_data.ua_log_file); + expand_filename(*argv++, tdgbl->ALICE_data.ua_log_file); } - if (table->in_sw_value & (sw_buffers)) { - if (--argc <= 0) { + if (table->in_sw_value & (sw_buffers)) + { + if (--argc <= 0) ALICE_error(6); // msg 6: number of page buffers for cache required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if ((!(tdgbl->ALICE_data.ua_page_buffers = atoi(string))) - && (strcmp(string, "0"))) - { + + if ((!(tdgbl->ALICE_data.ua_page_buffers = atoi(string))) && (strcmp(string, "0"))) ALICE_error(7); // msg 7: numeric value required - } - if (tdgbl->ALICE_data.ua_page_buffers < 0) { + + if (tdgbl->ALICE_data.ua_page_buffers < 0) ALICE_error(8); // msg 8: positive numeric value required } - } - if (table->in_sw_value & (sw_housekeeping)) { - if (--argc <= 0) { + if (table->in_sw_value & (sw_housekeeping)) + { + if (--argc <= 0) ALICE_error(113); // msg 113: dialect number required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if ((!(tdgbl->ALICE_data.ua_sweep_interval = atoi(string))) - && (strcmp(string, "0"))) - { + + if ((!(tdgbl->ALICE_data.ua_sweep_interval = atoi(string))) && (strcmp(string, "0"))) ALICE_error(7); // msg 7: numeric value required - } - if (tdgbl->ALICE_data.ua_sweep_interval < 0) { + + if (tdgbl->ALICE_data.ua_sweep_interval < 0) ALICE_error(8); // msg 8: positive numeric value required } - } - if (table->in_sw_value & (sw_set_db_dialect)) { - if (--argc <= 0) { + if (table->in_sw_value & (sw_set_db_dialect)) + { + if (--argc <= 0) ALICE_error(113); // msg 113: dialect info is required XXX - } ALICE_down_case(*argv++, string, sizeof(string)); - if ((!(tdgbl->ALICE_data.ua_db_SQL_dialect = atoi(string))) && - (strcmp(string, "0"))) - { + if ((!(tdgbl->ALICE_data.ua_db_SQL_dialect = atoi(string))) && (strcmp(string, "0"))) ALICE_error(7); // msg 7: numeric value required - } // JMB: Removed because tdgbl->ALICE_data.ua_db_SQL_dialect is // an unsigned number. Therefore this check is useless. @@ -419,150 +423,150 @@ // } } - if (table->in_sw_value & (sw_commit | sw_rollback | sw_two_phase)) { - if (--argc <= 0) { + if (table->in_sw_value & (sw_commit | sw_rollback | sw_two_phase)) + { + if (--argc <= 0) ALICE_error(10); // msg 10: transaction number or "all" required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if (!(tdgbl->ALICE_data.ua_transaction = atoi(string))) { - if (strcmp(string, "all")) { + + if (!(tdgbl->ALICE_data.ua_transaction = atoi(string))) + { + if (strcmp(string, "all")) ALICE_error(10); // msg 10: transaction number or "all" required - } - else { + else switches |= sw_list; } } - } - if (table->in_sw_value & sw_write) { - if (--argc <= 0) { + if (table->in_sw_value & sw_write) + { + if (--argc <= 0) ALICE_error(11); // msg 11: "sync" or "async" required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if (!strcmp(string, ALICE_SW_SYNC)) { + + if (!strcmp(string, ALICE_SW_SYNC)) tdgbl->ALICE_data.ua_force = true; - } else if (!strcmp(string, ALICE_SW_ASYNC)) { + else if (!strcmp(string, ALICE_SW_ASYNC)) tdgbl->ALICE_data.ua_force = false; - } - else { + else ALICE_error(11); // msg 11: "sync" or "async" required } - } - if (table->in_sw_value & sw_use) { - if (--argc <= 0) { + if (table->in_sw_value & sw_use) + { + if (--argc <= 0) ALICE_error(12); // msg 12: "full" or "reserve" required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if (!strcmp(string, "full")) { + + if (!strcmp(string, "full")) tdgbl->ALICE_data.ua_use = true; - } - else if (!strcmp(string, "reserve")) { + else if (!strcmp(string, "reserve")) tdgbl->ALICE_data.ua_use = false; - } else { + else ALICE_error(12); // msg 12: "full" or "reserve" required } - } - if (table->in_sw_value & sw_user) { - if (--argc <= 0) { + if (table->in_sw_value & sw_user) + { + if (--argc <= 0) ALICE_error(13); // msg 13: user name required - } - tdgbl->ALICE_data.ua_user = - const_cast<UCHAR* >(reinterpret_cast<UCHAR*>(*argv++)); + + tdgbl->ALICE_data.ua_user = reinterpret_cast<UCHAR*>(*argv++); } - if (table->in_sw_value & sw_password) { - if (--argc <= 0) { + if (table->in_sw_value & sw_password) + { + if (--argc <= 0) ALICE_error(14); // msg 14: password required - } - tdgbl->ALICE_data.ua_password = - const_cast<UCHAR* >(reinterpret_cast<UCHAR*>(*argv++)); + + tdgbl->ALICE_data.ua_password = reinterpret_cast<UCHAR*>(*argv++); } - if (table->in_sw_value & sw_disable) { - if (--argc <= 0) { + if (table->in_sw_value & sw_disable) + { + if (--argc <= 0) ALICE_error(15); // msg 15: subsystem name - } + ALICE_down_case(*argv++, string, sizeof(string)); - if (strcmp(string, "wal")) { + + if (strcmp(string, "wal")) ALICE_error(16); // msg 16: "wal" required } - } - if (table->in_sw_value & (sw_attach | sw_force | sw_tran | sw_cache)) { - if (--argc <= 0) { + if (table->in_sw_value & (sw_attach | sw_force | sw_tran | sw_cache)) + { + if (--argc <= 0) ALICE_error(17); // msg 17: number of seconds required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if ((!(tdgbl->ALICE_data.ua_shutdown_delay = atoi(string))) - && (strcmp(string, "0"))) - { + + if ((!(tdgbl->ALICE_data.ua_shutdown_delay = atoi(string))) && (strcmp(string, "0"))) ALICE_error(7); // msg 7: numeric value required - } - if (tdgbl->ALICE_data.ua_shutdown_delay < 0 - || tdgbl->ALICE_data.ua_shutdown_delay > 32767) - { + + if (tdgbl->ALICE_data.ua_shutdown_delay < 0 || tdgbl->ALICE_data.ua_shutdown_delay > 32767) ALICE_error(18); // msg 18: numeric value between 0 and 32767 inclusive required } - } - if (table->in_sw_value & sw_mode) { - if (--argc <= 0) { + if (table->in_sw_value & sw_mode) + { + if (--argc <= 0) ALICE_error(110); // msg 110: "read_only" or "read_write" required - } + ALICE_down_case(*argv++, string, sizeof(string)); - if (!strcmp(string, ALICE_SW_MODE_RO)) { + + if (!strcmp(string, ALICE_SW_MODE_RO)) tdgbl->ALICE_data.ua_read_only = true; - } - else if (!strcmp(string, ALICE_SW_MODE_RW)) { + else if (!strcmp(string, ALICE_SW_MODE_RW)) tdgbl->ALICE_data.ua_read_only = false; - } else { + else ALICE_error(110); // msg 110: "read_only" or "read_write" required } } - } - // put this here since to put it above overly complicates the parsing // can't use tbl_requires since it only looks backwards on command line - if ((switches & sw_shut) - && !(switches & ((sw_attach | sw_force | sw_tran | sw_cache)))) - { + + if ((switches & sw_shut) && !(switches & ((sw_attach | sw_force | sw_tran | sw_cache)))) ALICE_error(19); // msg 19: must specify type of shutdown - } // catch the case where -z is only command line option // switches is unset since sw_z == 0 - if (!switches && !error && table->in_sw_value == sw_z) { + + if (!switches && !error && table->in_sw_value == sw_z) exit_local(FINI_OK, tdgbl); - } - if (!switches || !(switches & ~(sw_user | sw_password))) { - #ifndef SUPERSERVER + if (!switches || !(switches & ~(sw_user | sw_password))) + { +#ifndef SUPERSERVER ALICE_print(20, 0, 0, 0, 0, 0); // msg 20: please retry, specifying an option - #endif +#endif error = true; } - if (error) { - #ifdef SUPERSERVER + if (error) + { +#ifdef SUPERSERVER CMD_UTIL_put_svc_status(tdgbl->service_blk->svc_status, ALICE_MSG_FAC, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); - SVC_STARTED(tdgbl->service_blk); - #else - ALICE_print(21, 0, 0, 0, 0, 0); /* msg 21: plausible options are:\n */ + tdgbl->service_blk->svc_started(); +#else + + ALICE_print(21); // msg 21: plausible options are:\n + for (table = alice_in_sw_table; table->in_sw_msg; table++) ALICE_print(table->in_sw_msg, 0, 0, 0, 0, 0); - ALICE_print(22, 0, 0, 0, 0, 0); /* msg 22: \n qualifiers show the major option in parenthesis */ - #endif + + ALICE_print(22); // msg 22: \n qualifiers show the major option in parenthesis +#endif exit_local(FINI_ERROR, tdgbl); } - if (!database) { + if (!database) ALICE_error(23); // msg 23: please retry, giving a database name - } // generate the database parameter block for the attach, // based on the various switches @@ -570,37 +574,30 @@ USHORT ret; if (switches & (sw_list | sw_commit | sw_rollback | sw_two_phase)) - { ret = EXE_two_phase(database, switches); - } else { ret = EXE_action(database, switches); - - // cast away volatile - const SLONG* ua_val_errors = - const_cast<SLONG*>(tdgbl->ALICE_data.ua_val_errors); + const SLONG* ua_val_errors = tdgbl->ALICE_data.ua_val_errors; if (!ua_val_errors[VAL_INVALID_DB_VERSION]) { bool any_error = false; - for (int i = 0; i < MAX_VAL_ERRORS; ++i) { - if (ua_val_errors[i]) { + for (int i = 0; i < MAX_VAL_ERRORS; ++i) + if (ua_val_errors[i]) + { any_error = true; break; } - } - if (any_error) { - ALICE_print(24, 0, 0, 0, 0, 0); /* msg 24: Summary of validation errors\n */ + if (any_error) + { + ALICE_print(24); // msg 24: Summary of validation errors\n - for (int i = 0; i < MAX_VAL_ERRORS; ++i) { - if (ua_val_errors[i]) { - TEXT* szErr = reinterpret_cast<TEXT*>(ua_val_errors[i]); - ALICE_print(val_err_table[i], szErr, 0, 0, 0, 0); - } - } + for (int i = 0; i < MAX_VAL_ERRORS; ++i) + if (ua_val_errors[i]) + ALICE_print(val_err_table[i], ua_val_errors[i]); } } } @@ -609,36 +606,26 @@ ALICE_print_status(tdgbl->status); exit_local(FINI_OK, tdgbl); - } + } // try catch (const std::exception&) { - /* All "calls" to exit_local(), normal and error exits, wind up here */ - - SVC_STARTED(tdgbl->service_blk); + // All "calls" to exit_local(), normal and error exits, wind up here + tdgbl->service_blk->svc_started(); int exit_code = tdgbl->exit_code; // Close the status output file if (tdgbl->sw_redirect == REDIRECT && tdgbl->output_file != NULL) { - ib_fclose(tdgbl->output_file); + fclose(tdgbl->output_file); tdgbl->output_file = NULL; } - // Free all unfreed memory used by Gfix itself - ALLA_fini(); - - RESTORE_THREAD_DATA; - - // cast away volatile - gds__free((void*)tdgbl); - -#if defined(DEBUG_GDS_ALLOC) && !defined(SUPERSERVER) - gds_alloc_report(0, __FILE__, __LINE__); -#endif + AliceGlobals::restoreSpecific(); // All returns occur from this point - even normal returns + return exit_code; } // catch @@ -666,17 +653,14 @@ // Display a formatted error message // -void ALICE_print(USHORT number, - const TEXT* arg1, - const TEXT* arg2, - const TEXT* arg3, - const TEXT* arg4, - const TEXT* arg5) +void ALICE_print(USHORT number,...) { + va_list args; + va_start (args, number); TEXT buffer[256]; + MsgFormat::format(ALICE_MSG_FAC, number, args, sizeof(buffer), buffer); - gds__msg_format(0, ALICE_MSG_FAC, number, sizeof(buffer), buffer, arg1, - arg2, arg3, arg4, arg5); + //gds__msg_format(0, ALICE_MSG_FAC, number, sizeof(buffer), buffer, arg1, arg2, arg3, arg4, arg5); translate_cp(buffer); alice_output("%s\n", buffer); } @@ -684,41 +668,51 @@ //____________________________________________________________ // -// Print error message. Use isc_interprete_cpp +// Print error message. Use fb_interpret // to allow redirecting output. // -void ALICE_print_status(ISC_STATUS* status_vector) +void ALICE_print_status(const ISC_STATUS* status_vector) { if (status_vector) { - ISC_STATUS* vector = status_vector; + const ISC_STATUS* vector = status_vector; + #ifdef SUPERSERVER - int i = 0, j; - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); ISC_STATUS* status = tdgbl->service_blk->svc_status; - if (status != status_vector) { - while (*status && (++i < ISC_STATUS_LENGTH)) { + + if (status != status_vector) + { + int i = 0; + + if (status[1]) + while (*status && (++i < ISC_STATUS_LENGTH)) status++; - } - for (j = 0; status_vector[j] && (i < ISC_STATUS_LENGTH); j++, i++) { + + for (int j = 0; status_vector[j] && (i < ISC_STATUS_LENGTH); j++, i++) *status++ = status_vector[j]; } - } #endif SCHAR s[1024]; - isc_interprete(s, &vector); + + if (fb_interpret(s, sizeof(s), &vector)) + { translate_cp(s); alice_output("%s\n", s); // Continuation of error + s[0] = '-'; - while (isc_interprete(s + 1, &vector)) { + + while (fb_interpret(s + 1, sizeof(s) - 1, &vector)) + { translate_cp(s); alice_output("%s\n", s); } } + } } @@ -727,15 +721,11 @@ // Format and print an error message, then punt. // -void ALICE_error(USHORT number, - const TEXT* arg1, - const TEXT* arg2, - const TEXT* arg3, - const TEXT* arg4, - const TEXT* arg5) +void ALICE_error(USHORT number, ...) { - TGBL tdgbl = GET_THREAD_DATA; - TEXT buffer[256]; + va_list args; + va_start (args, number); + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); #ifdef SUPERSERVER ISC_STATUS* status = tdgbl->service_blk->svc_status; @@ -748,8 +738,9 @@ isc_arg_string, arg5); #endif - gds__msg_format(0, ALICE_MSG_FAC, number, sizeof(buffer), buffer, arg1, - arg2, arg3, arg4, arg5); + TEXT buffer[256]; + MsgFormat::format(ALICE_MSG_FAC, number, args, sizeof(buffer), buffer); + //gds__msg_format(0, ALICE_MSG_FAC, number, sizeof(buffer), buffer, arg1, arg2, arg3, arg4, arg5); translate_cp(buffer); alice_output("%s\n", buffer); exit_local(FINI_ERROR, tdgbl); @@ -757,15 +748,6 @@ -// -// Overload of ALICE_error to keep down parameter count. -// -static void ALICE_error(USHORT number) -{ - ALICE_error(number, 0, 0, 0, 0, 0); -} - - //____________________________________________________________ // // Platform independent output routine. @@ -777,19 +759,19 @@ UCHAR buf[1000]; int exit_code; - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (tdgbl->sw_redirect == NOOUTPUT || format[0] == '\0') { exit_code = tdgbl->output_proc(tdgbl->output_data, (UCHAR *)("")); } else if (tdgbl->sw_redirect == REDIRECT && tdgbl->output_file != NULL) { - VA_START(arglist, format); - ib_vfprintf(tdgbl->output_file, format, arglist); + va_start(arglist, format); + vfprintf(tdgbl->output_file, format, arglist); va_end(arglist); exit_code = tdgbl->output_proc(tdgbl->output_data, (UCHAR *)("")); } else { - VA_START(arglist, format); + va_start(arglist, format); vsprintf((char *) buf, format, arglist); va_end(arglist); Index: alice.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/alice.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- alice.h 20 Jan 2005 19:59:07 -0000 1.1.1.1 +++ alice.h 2 Sep 2005 19:11:10 -0000 1.2 @@ -24,24 +24,18 @@ #ifndef ALICE_ALICE_H #define ALICE_ALICE_H -#include "../jrd/ib_stdio.h" +#include <stdio.h> #include "../jrd/ibase.h" #include "../jrd/thd.h" -//#include "../alice/all.h" +#include "../alice/all.h" #include "../include/fb_blk.h" #include "../common/classes/alloc.h" +#include "../common/classes/array.h" -//#include <vector> +#include <vector> #include "../alice/blk.h" -#include "SVector.h" - -#define FRBRD void - -class ExitException -{ -}; enum val_errors { VAL_INVALID_DB_VERSION = 0, @@ -55,7 +49,15 @@ MAX_VAL_ERRORS = 8 }; -typedef struct user_action +enum alice_shut_mode { + SHUT_DEFAULT = 0, + SHUT_NORMAL = 1, + SHUT_MULTI = 2, + SHUT_SINGLE = 3, + SHUT_FULL = 4 +}; + +struct user_action { ULONG ua_switches; UCHAR* ua_user; @@ -71,38 +73,39 @@ SLONG ua_val_errors[MAX_VAL_ERRORS]; TEXT ua_log_file[MAXPATHLEN]; USHORT ua_db_SQL_dialect; -} *USER_ACTION; + alice_shut_mode ua_shutdown_mode; +}; -/* String block: used to store a string of constant length. */ +// String block: used to store a string of constant length. -class str : public pool_alloc_rpt<UCHAR, alice_type_str> +class alice_str : public pool_alloc_rpt<UCHAR, alice_type_str> { public: USHORT str_length; UCHAR str_data[2]; }; -typedef str* STR; -/* Transaction block: used to store info about a multidatabase transaction. */ +// Transaction block: used to store info about a multidatabase transaction. -typedef struct tdr : public pool_alloc<alice_type_tdr> +struct tdr : public pool_alloc<alice_type_tdr> { - tdr* tdr_next; /* next subtransaction */ - SLONG tdr_id; /* database-specific transaction id */ - str* tdr_fullpath; /* full (possibly) remote pathname */ - const TEXT* tdr_filename; /* filename within full pathname */ - str* tdr_host_site; /* host for transaction */ - str* tdr_remote_site; /* site for remote transaction */ - FRBRD* tdr_handle; /* reconnected transaction handle */ - FRBRD* tdr_db_handle; /* reattached database handle */ - USHORT tdr_db_caps; /* capabilities of database */ - USHORT tdr_state; /* see flags below */ -} *TDR; + tdr* tdr_next; // next subtransaction + SLONG tdr_id; // database-specific transaction id + alice_str* tdr_fullpath; // full (possibly) remote pathname + const TEXT* tdr_filename; // filename within full pathname + alice_str* tdr_host_site; // host for transaction + alice_str* tdr_remote_site; // site for remote transaction + FB_API_HANDLE tdr_handle; // reconnected transaction handle + FB_API_HANDLE tdr_db_handle; // reattached database handle + USHORT tdr_db_caps; // capabilities of database + USHORT tdr_state; // see flags below +}; -/* Transaction Description Record */ +typedef tdr* TDR; +// Transaction Description Record const int TDR_VERSION = 1; enum tdr_vals { @@ -113,42 +116,25 @@ TDR_PROTOCOL = 5 }; -/* flags for tdr_db_caps */ +// flags for tdr_db_caps enum tdr_db_caps_vals { CAP_none = 0, CAP_transactions = 1 }; -/* db has a RDB$TRANSACTIONS relation */ +// db has a RDB$TRANSACTIONS relation -/* flags for tdr_state */ +// flags for tdr_state enum tdr_state_vals { - TRA_none = 0, /* transaction description record is missing */ - TRA_limbo = 1, /* has been prepared */ - TRA_commit = 2, /* has committed */ - TRA_rollback = 3, /* has rolled back */ - TRA_unknown = 4 /* database couldn't be reattached, state is unknown */ + TRA_none = 0, // transaction description record is missing + TRA_limbo = 1, // has been prepared + TRA_commit = 2, // has committed + TRA_rollback = 3, // has rolled back + TRA_unknown = 4 // database couldn't be reattached, state is unknown }; -/* a couple of obscure blocks used only in data allocator routines */ - -class vec : public pool_alloc_rpt<class blk*, alice_type_vec> -{ -public: - ULONG vec_count; - blk *vec_object[1]; -}; -typedef vec* VEC; - -class vcl : public pool_alloc_rpt<SLONG, alice_type_vcl> -{ - ULONG vcl_count; - SLONG vcl_long[1]; -}; -typedef vcl* VCL; - -/* Global switches and data */ +// Global switches and data #include "../jrd/svc.h" @@ -158,56 +144,83 @@ NOOUTPUT = 2 }; -class AliceMemoryPool : public MemMgr -{ -}; +#ifndef SUPERSERVER +class AliceGlobals; +extern AliceGlobals* gdgbl; +#endif -class tgbl +class AliceGlobals //: public ThreadData { +private: + /*** + AliceMemoryPool* ALICE_default_pool; + friend class Firebird::SubsystemContextPoolHolder <AliceGlobals, AliceMemoryPool>; + + void setDefaultPool(AliceMemoryPool* p) + { + ALICE_default_pool = p; + } + ***/ + public: - //tgbl(AliceMemoryPool* p) : {} + AliceGlobals(pfn_svc_output outProc, Service* outData) + : + //ThreadData(ThreadData::tddALICE), + //ALICE_default_pool(0), + output_proc(outProc), + output_data(outData), + db_handle(0), + tr_handle(0) + { + } + + /*** + AliceMemoryPool* getDefaultPool() + { + return ALICE_default_pool; + } + ***/ - thdd tgbl_thd_data; user_action ALICE_data; - AliceMemoryPool* ALICE_permanent_pool; - AliceMemoryPool* ALICE_default_pool; ISC_STATUS_ARRAY status_vector; - //typedef std::vector<AliceMemoryPool*, Firebird::allocator<AliceMemoryPool*> > pool_vec_t; - //pool_vec_t pools; - SVector<AliceMemoryPool*> pools; int exit_code; pfn_svc_output output_proc; - svc* output_data; - IB_FILE* output_file; - SVC service_blk; + Service* output_data; + FILE* output_file; + Service* service_blk; isc_db_handle db_handle; isc_tr_handle tr_handle; ISC_STATUS* status; redirect_vals sw_redirect; bool sw_service; bool sw_service_thd; -}; -typedef tgbl* TGBL; - -#ifdef GET_THREAD_DATA -#undef GET_THREAD_DATA -#endif #ifdef SUPERSERVER -#define GET_THREAD_DATA ((TGBL) THD_get_specific(THDD_TYPE_TALICE)) -#define SET_THREAD_DATA THD_put_specific ((THDD) tdgbl, THDD_TYPE_TALICE); \ - tdgbl->tgbl_thd_data.thdd_type = \ - THDD_TYPE_TALICE -#define RESTORE_THREAD_DATA THD_restore_specific(THDD_TYPE_TALICE); + static inline AliceGlobals* getSpecific() { + ThreadData* tData = ThreadData::getSpecific(); + fb_assert (tData->getType() == ThreadData::tddALICE) + return (AliceGlobals*) tData; + } + static inline void putSpecific(AliceGlobals* tdgbl) { + tdgbl->ThreadData::putSpecific(); + } + static inline void restoreSpecific() { + ThreadData::restoreSpecific(); + } #else -extern tgbl *gdgbl; - -#define GET_THREAD_DATA (gdgbl) -#define SET_THREAD_DATA gdgbl = const_cast<tgbl*>(tdgbl); \ - tdgbl->tgbl_thd_data.thdd_type = THDD_TYPE_TGBL -#define RESTORE_THREAD_DATA + static inline AliceGlobals* getSpecific() { + return gdgbl; + } + static inline void putSpecific(AliceGlobals* tdgbl) { + gdgbl = tdgbl; + } + static inline void restoreSpecific() { + } #endif +}; + +//typedef Firebird::SubsystemContextPoolHolder <AliceGlobals, AliceMemoryPool> AliceContextPoolHolder; #endif // ALICE_ALICE_H Index: alice_meta.epp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/alice_meta.epp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- alice_meta.epp 20 Jan 2005 19:59:09 -0000 1.1.1.1 +++ alice_meta.epp 2 Sep 2005 19:11:10 -0000 1.2 @@ -33,18 +33,16 @@ #include "firebird.h" #include <stdio.h> #include "../jrd/common.h" -//#include "../jrd/y_ref.h" #include "../jrd/ibase.h" #include "../jrd/license.h" #include "../alice/alice.h" -//#include "../alice/all.h" +#include "../alice/all.h" #include "../alice/alice_meta.h" #include "../jrd/gds_proto.h" -#include "../jrd/thd_proto.h" +#include "../jrd/thd.h" #include "../include/fb_exception.h" #include "../common/classes/alloc.h" #include "../alice/alice_proto.h" -#include "OSRIException.h" #include <string.h> @@ -58,11 +56,11 @@ #define DB tdgbl->db_handle #define gds_trans tdgbl->tr_handle -static STR alloc_string(TEXT**); +static alice_str* alloc_string(const TEXT**); static USHORT get_capabilities(ISC_STATUS*); -static TDR get_description(SLONG[2]); +static TDR get_description(ISC_QUAD*); static void parse_fullpath(TDR); -static USHORT snarf_blob(SLONG[2], USHORT, TEXT*); +static USHORT snarf_blob(ISC_QUAD*, USHORT, TEXT*); /* @@ -71,8 +69,8 @@ */ struct rfr_tab_t { - TEXT* relation; - TEXT* field; + const TEXT* relation; + const TEXT* field; int bit_mask; }; @@ -84,8 +82,7 @@ static inline void return_error(const ISC_STATUS* user_status) { ALICE_print_status(gds_status); - //Firebird::status_exception::raise(0); - throw OSRIException(user_status); + Firebird::status_exception::raise(); } /*____________________________________________________________ @@ -96,8 +93,8 @@ void MET_disable_wal(ISC_STATUS* user_status, isc_db_handle handle) { - FRBRD* request = NULL; - TGBL tdgbl = GET_THREAD_DATA; + FB_API_HANDLE request = 0; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = handle)) return; @@ -126,8 +123,8 @@ void MET_get_state(ISC_STATUS* user_status, TDR trans) { - FRBRD* request = NULL; - TGBL tdgbl = GET_THREAD_DATA; + FB_API_HANDLE request = 0; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = trans->tdr_db_handle) || !(trans->tdr_db_caps & CAP_transactions)) @@ -171,9 +168,9 @@ TDR MET_get_transaction(ISC_STATUS* user_status, isc_db_handle handle, SLONG id) { - FRBRD* request = NULL; + FB_API_HANDLE request = 0; TDR trans = NULL; - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = handle)) return 0; @@ -190,7 +187,7 @@ TRA IN RDB$TRANSACTIONS WITH TRA.RDB$TRANSACTION_ID = id AND TRA.RDB$TRANSACTION_DESCRIPTION NOT MISSING - trans = get_description((SLONG*)&TRA.RDB$TRANSACTION_DESCRIPTION); + trans = get_description(&TRA.RDB$TRANSACTION_DESCRIPTION); END_FOR ON_ERROR return_error(user_status); @@ -222,7 +219,7 @@ void MET_set_capabilities(ISC_STATUS* user_status, TDR trans) { - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (!(DB = trans->tdr_db_handle)) return; @@ -246,18 +243,19 @@ * Eat a string with a byte-encoded length. */ -static STR alloc_string(TEXT** ptr) +static alice_str* alloc_string(const TEXT** ptr) { - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); - TEXT* p = *ptr; + const TEXT* p = *ptr; USHORT length = (USHORT) *p++; - STR string = FB_NEW_RPT(*tdgbl->ALICE_default_pool, length + 1) str; + alice_str* string = FB_NEW_RPT(*tdgbl->getDefaultPool(), length + 1) alice_str; TEXT* q = (TEXT *) string->str_data; - while (length--) + while (length--) { *q++ = *p++; + } *q = 0; *ptr = p; @@ -276,10 +274,10 @@ static USHORT get_capabilities(ISC_STATUS* user_status) { USHORT capabilities = CAP_none; - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); // Look for desired fields in system relations - FRBRD* req = NULL; + FB_API_HANDLE req = 0; for (const rfr_tab_t* rel_field_table = rfr_table; rel_field_table->relation; rel_field_table++) @@ -310,29 +308,38 @@ * in other databases. */ -static TDR get_description(SLONG blob_id[2]) +static TDR get_description(ISC_QUAD* blob_id) { TEXT buffer[1024]; TEXT* bigger_buffer = 0; - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); - TEXT* p = buffer; + const TEXT* p = buffer; const USHORT length = snarf_blob(blob_id, (USHORT) sizeof(buffer), buffer); if (length) { p = bigger_buffer = (TEXT *) gds__alloc((SLONG) length); + if (!p) { + tdgbl->status[0] = isc_arg_gds; + tdgbl->status[1] = isc_virmemexh; + tdgbl->status[2] = isc_arg_end; + + ALICE_print_status(tdgbl->status); + return NULL; + } snarf_blob(blob_id, length, bigger_buffer); } TDR trans = NULL; - STR host_site = NULL, database_path = NULL; + alice_str* host_site = NULL; + alice_str* database_path = NULL; // skip version number ++p; - TDR ptr; + TDR ptr = NULL; // silence uninitialized warning SLONG id_length, id; - while (*p) + while (*p) { switch (*p++) { case TDR_HOST_SITE: host_site = alloc_string(&p); @@ -344,12 +351,13 @@ case TDR_TRANSACTION_ID: id_length = *p++; - id = gds__vax_integer(reinterpret_cast<UCHAR*>(p), id_length); + id = gds__vax_integer(reinterpret_cast<const UCHAR*>(p), id_length); p += id_length; - if (!trans) - trans = ptr = FB_NEW(*tdgbl->ALICE_default_pool) tdr; + if (!trans) { + trans = ptr = FB_NEW(*tdgbl->getDefaultPool()) tdr; + } else { - ptr->tdr_next = FB_NEW(*tdgbl->ALICE_default_pool) tdr; + ptr->tdr_next = FB_NEW(*tdgbl->getDefaultPool()) tdr; ptr = ptr->tdr_next; } ptr->tdr_host_site = host_site; @@ -363,13 +371,16 @@ ALICE_print(108, 0, 0, 0, 0, 0); // msg 108: Transaction description item unknown. - if (length) + if (length) { gds__free(bigger_buffer); + } return NULL; } + } - if (length) + if (length) { gds__free(bigger_buffer); + } return trans; } @@ -383,7 +394,7 @@ static void parse_fullpath(TDR trans) { - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); // start at the end of the full pathname @@ -393,7 +404,7 @@ p++; const TEXT* const end = p; -/* Check for a named pipes name - \\node\path\db or //node/path/db */ +// Check for a named pipes name - \\node\path\db or //node/path/db while (p > start && !(*p == '/' && *(p - 1) == '/') && !(*p == '\\' && *(p - 1) == '\\')) @@ -411,7 +422,7 @@ if (*q) { trans->tdr_filename = q + 1; - trans->tdr_remote_site = FB_NEW_RPT(*tdgbl->ALICE_default_pool, q - p + 1) str; + trans->tdr_remote_site = FB_NEW_RPT(*tdgbl->getDefaultPool(), q - p + 1) alice_str; strncpy((char*) trans->tdr_remote_site->str_data, (char*) p, q - p); trans->tdr_remote_site->str_data[q - p] = '\0'; } @@ -442,7 +453,7 @@ ++p; if (length) { - trans->tdr_remote_site = FB_NEW_RPT(*tdgbl->ALICE_default_pool, length + 1) str; + trans->tdr_remote_site = FB_NEW_RPT(*tdgbl->getDefaultPool(), length + 1) alice_str; TEXT* q = (TEXT *) trans->tdr_remote_site->str_data; while (length--) *q++ = *p++; @@ -459,18 +470,18 @@ * is not big enough. */ -static USHORT snarf_blob(SLONG blob_id[2], +static USHORT snarf_blob(ISC_QUAD* blob_id, USHORT buffer_length, TEXT* buffer) { - TGBL tdgbl = GET_THREAD_DATA; + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); if (buffer_length) buffer[0] = 0; if (buffer_length > 1) buffer[1] = 0; - FRBRD* blob = NULL; - if (isc_open_blob(gds_status, &DB, &gds_trans, &blob, (ISC_QUAD*) blob_id)) + FB_API_HANDLE blob = 0; + if (isc_open_blob(gds_status, &DB, &gds_trans, &blob, blob_id)) { ALICE_print_status(gds_status); return 0; @@ -482,7 +493,7 @@ ISC_STATUS status; TEXT* ptr = buffer; - TEXT* const end = buffer + buffer_length; + const TEXT* const end = buffer + buffer_length; for (;;) { if (ptr >= end) break; Index: alice_proto.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/alice_proto.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- alice_proto.h 20 Jan 2005 19:59:02 -0000 1.1.1.1 +++ alice_proto.h 2 Sep 2005 19:11:10 -0000 1.2 @@ -25,16 +25,16 @@ #ifndef ALICE_ALICE_PROTO_H #define ALICE_ALICE_PROTO_H +#include "../jrd/thd.h" + #ifdef SUPERSERVER -int ALICE_main(Service* service); +THREAD_ENTRY_DECLARE ALICE_main(THREAD_ENTRY_PARAM); #endif void ALICE_down_case(const TEXT*, TEXT*, const size_t); -void ALICE_print(USHORT, const TEXT*, const TEXT*, const TEXT*, - const TEXT*, const TEXT*); -void ALICE_error(USHORT, const TEXT*, const TEXT*, const TEXT*, - const TEXT*, const TEXT*); -void ALICE_print_status(ISC_STATUS*); +void ALICE_print(USHORT, ...); +void ALICE_error(USHORT, ...); +void ALICE_print_status(const ISC_STATUS*); #endif // ALICE_ALICE_PROTO_H Index: aliceswi.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/aliceswi.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- aliceswi.h 20 Jan 2005 19:59:08 -0000 1.1.1.1 +++ aliceswi.h 2 Sep 2005 19:11:10 -0000 1.2 @@ -25,9 +25,9 @@ #include "../jrd/common.h" #include "../jrd/ibase.h" -/* switch definitions */ +// switch definitions -const unsigned long sw_list = 0x00000001UL; /* Byte 0, Bit 0 */ +const unsigned long sw_list = 0x00000001UL; // Byte 0, Bit 0 const unsigned long sw_prompt = 0x00000002UL; const unsigned long sw_commit = 0x00000004UL; const unsigned long sw_rollback = 0x00000008UL; @@ -35,7 +35,7 @@ const unsigned long sw_validate = 0x00000020UL; const unsigned long sw_no_update = 0x00000040UL; const unsigned long sw_full = 0x00000080UL; -const unsigned long sw_mend = 0x00000100UL; /* Byte 1, Bit 0 */ +const unsigned long sw_mend = 0x00000100UL; // Byte 1, Bit 0 const unsigned long sw_all = 0x00000200UL; const unsigned long sw_enable = 0x00000400UL; const unsigned long sw_disable = 0x00000800UL; @@ -43,7 +43,7 @@ const unsigned long sw_activate = 0x00002000UL; const unsigned long sw_two_phase = 0x00004000UL; const unsigned long sw_housekeeping = 0x00008000UL; -const unsigned long sw_kill = 0x00010000UL; /* Byte 2, Bit 0 */ +const unsigned long sw_kill = 0x00010000UL; // Byte 2, Bit 0 const unsigned long sw_begin_log = 0x00020000UL; const unsigned long sw_quit_log = 0x00040000UL; const unsigned long sw_write = 0x00080000UL; @@ -51,7 +51,7 @@ const unsigned long sw_user = 0x00200000UL; const unsigned long sw_password = 0x00400000UL; const unsigned long sw_shut = 0x00800000UL; -const unsigned long sw_online = 0x01000000UL; /* Byte 3, Bit 0 */ +const unsigned long sw_online = 0x01000000UL; // Byte 3, Bit 0 const unsigned long sw_cache = 0x02000000UL; const unsigned long sw_attach = 0x04000000UL; const unsigned long sw_force = 0x08000000UL; @@ -63,7 +63,7 @@ enum alice_switches { - IN_SW_ALICE_0 = 0, /* not a known switch */ + IN_SW_ALICE_0 = 0, // not a known switch IN_SW_ALICE_LIST = 1, IN_SW_ALICE_PROMPT = 2, IN_SW_ALICE_COMMIT = 3, @@ -95,7 +95,7 @@ IN_SW_ALICE_TRAN = 29, IN_SW_ALICE_BUFFERS = 30, IN_SW_ALICE_Z = 31, - IN_SW_ALICE_X = 32, /* set debug mode on */ + IN_SW_ALICE_X = 32, // set debug mode on IN_SW_ALICE_HIDDEN_ASYNC = 33, IN_SW_ALICE_HIDDEN_SYNC = 34, IN_SW_ALICE_HIDDEN_USEALL = 35, @@ -114,19 +114,19 @@ static const char* ALICE_SW_MODE_RO = "read_only"; static const char* ALICE_SW_MODE_RW = "read_write"; -/* Switch table */ +// Switch table static in_sw_tab_t alice_in_sw_table[] = { {IN_SW_ALICE_ACTIVATE, isc_spb_prp_activate, "activate", sw_activate, 0, ~(sw_activate | sw_user | sw_password), FALSE, 25, 0, NULL}, - /* msg 25: \t-activate shadow file for database usage */ + // msg 25: \t-activate shadow file for database usage {IN_SW_ALICE_ATTACH, 0, "attach", sw_attach, sw_shut, 0, FALSE, 26, 0, NULL}, - /* msg 26: \t-attach\tshutdown new database attachments */ + // msg 26: \t-attach\tshutdown new database attachments #ifdef DEV_BUILD {IN_SW_ALICE_BEGIN_LOG, 0, "begin_log", sw_begin_log, 0, ~(sw_begin_log | sw_user | sw_password), FALSE, 27, 0, NULL}, - /* msg 27: \t-begin_log\tbegin logging for replay utility */ + // msg 27: \t-begin_log\tbegin logging for replay utility #endif {IN_SW_ALICE_BUFFERS, isc_spb_prp_page_buffers, "buffers", sw_buffers, 0, 0, FALSE, 28, 0, NULL}, @@ -136,53 +136,53 @@ /* msg 29: \t-commit\t\tcommit transaction <tr / all> */ {IN_SW_ALICE_CACHE, 0, "cache", sw_cache, sw_shut, 0, FALSE, 30, 0, NULL}, - /* msg 30: \t-cache\t\tshutdown cache manager */ + // msg 30: \t-cache\t\tshutdown cache manager #ifdef DEV_BUILD {IN_SW_ALICE_DISABLE, 0, "disable", sw_disable, 0, 0, FALSE, 31, 0, NULL}, - /* msg 31: \t-disable\tdisable WAL */ + // msg 31: \t-disable\tdisable WAL #endif {IN_SW_ALICE_FULL, isc_spb_rpr_full, "full", sw_full, sw_validate, 0, FALSE, 32, 0, NULL}, - /* msg 32: \t-full\t\tvalidate record fragments (-v) */ + // msg 32: \t-full\t\tvalidate record fragments (-v) {IN_SW_ALICE_FORCE, 0, "force", sw_force, sw_shut, 0, FALSE, 33, 0, NULL}, - /* msg 33: \t-force\t\tforce database shutdown */ + // msg 33: \t-force\t\tforce database shutdown {IN_SW_ALICE_HOUSEKEEPING, isc_spb_prp_sweep_interval, "housekeeping", sw_housekeeping, 0, 0, FALSE, 34, 0, NULL}, /* msg 34: \t-housekeeping\tset sweep interval <n> */ {IN_SW_ALICE_IGNORE, isc_spb_rpr_ignore_checksum, "ignore", sw_ignore, 0, 0, FALSE, 35, 0, NULL}, - /* msg 35: \t-ignore\t\tignore checksum errors */ + // msg 35: \t-ignore\t\tignore checksum errors {IN_SW_ALICE_KILL, isc_spb_rpr_kill_shadows, "kill", sw_kill, 0, 0, FALSE, 36, 0, NULL}, - /* msg 36: \t-kill\t\tkill all unavailable shadow files */ + // msg 36: \t-kill\t\tkill all unavailable shadow files {IN_SW_ALICE_LIST, isc_spb_rpr_list_limbo_trans, "list", sw_list, 0, ~(sw_list | sw_user | sw_password), FALSE, 37, 0, NULL}, - /* msg 37: \t-list\t\tshow limbo transactions */ + // msg 37: \t-list\t\tshow limbo transactions {IN_SW_ALICE_MEND, isc_spb_rpr_mend_db, "mend", sw_mend | sw_validate | sw_full, 0, ~(sw_no_update | sw_user | sw_password), FALSE, 38, 0, NULL}, - /* msg 38: \t-mend\t\tprepare corrupt database for backup */ + // msg 38: \t-mend\t\tprepare corrupt database for backup {IN_SW_ALICE_MODE, 0, "mode", sw_mode, 0, ~(sw_mode | sw_user | sw_password), FALSE, 109, 0, NULL}, - /* msg 109: \t-mode\t\tread_only or read_write */ + // msg 109: \t-mode\t\tread_only or read_write {IN_SW_ALICE_NO_UPDATE, isc_spb_rpr_check_db, "no_update", sw_no_update, sw_validate, 0, FALSE, 39, 0, NULL}, - /* msg 39: \t-no_update\tread-only validation (-v) */ + // msg 39: \t-no_update\tread-only validation (-v) {IN_SW_ALICE_ONLINE, isc_spb_prp_db_online, "online", sw_online, 0, 0, FALSE, 40, 0, NULL}, - /* msg 40: \t-online\t\tdatabase online */ + // msg 40: \t-online\t\tdatabase online {IN_SW_ALICE_PROMPT, 0, "prompt", sw_prompt, sw_list, 0, FALSE, 41, 0, NULL}, - /* msg 41: \t-prompt\t\tprompt for commit/rollback (-l) */ + // msg 41: \t-prompt\t\tprompt for commit/rollback (-l) {IN_SW_ALICE_PASSWORD, 0, "password", sw_password, 0, 0, FALSE, 42, 0, NULL}, - /* msg 42: \t-password\tdefault password */ + // msg 42: \t-password\tdefault password #ifdef DEV_BUILD {IN_SW_ALICE_QUIT_LOG, 0, "quit_log", sw_quit_log, 0, ~(sw_quit_log | sw_user | sw_password), FALSE, 43, 0, NULL}, - /* msg 43: \t-quit_log\tquit logging for replay utility */ + // msg 43: \t-quit_log\tquit logging for replay utility #endif {IN_SW_ALICE_ROLLBACK, isc_spb_rpr_rollback_trans, "rollback", sw_rollback, 0, ~(sw_rollback | sw_user | sw_password), FALSE, 44, 0, NULL}, @@ -197,43 +197,43 @@ 111, 0, NULL}, - /* msg 111: \t-SQL_dialect\t\set dataabse dialect n */ + // msg 111: \t-SQL_dialect\t\set dataabse dialect n {IN_SW_ALICE_SWEEP, isc_spb_rpr_sweep_db, "sweep", sw_sweep, 0, ~(sw_sweep | sw_user | sw_password), FALSE, 45, 0, NULL}, - /* msg 45: \t-sweep\t\tforce garbage collection */ + // msg 45: \t-sweep\t\tforce garbage collection {IN_SW_ALICE_SHUT, 0, "shut", sw_shut, 0, ~(sw_shut | sw_attach | sw_cache | sw_force | sw_tran | sw_user | sw_password), FALSE, 46, 0, NULL}, - /* msg 46: \t-shut\t\tshutdown */ + // msg 46: \t-shut\t\tshutdown {IN_SW_ALICE_TWO_PHASE, isc_spb_rpr_recover_two_phase, "two_phase", sw_two_phase, 0, ~(sw_two_phase | sw_user | sw_password), FALSE, 47, 0, NULL}, - /* msg 47: \t-two_phase\tperform automated two-phase recovery */ + // msg 47: \t-two_phase\tperform automated two-phase recovery {IN_SW_ALICE_TRAN, 0, "tran", sw_tran, sw_shut, 0, FALSE, 48, 0, NULL}, - /* msg 48: \t-tran\t\tshutdown transaction startup */ + // msg 48: \t-tran\t\tshutdown transaction startup {IN_SW_ALICE_USE, 0, "use", sw_use, 0, ~(sw_use | sw_user | sw_password), FALSE, 49, 0, NULL}, - /* msg 49: \t-use\t\tuse full or reserve space for versions */ + // msg 49: \t-use\t\tuse full or reserve space for versions {IN_SW_ALICE_USER, 0, "user", sw_user, 0, 0, FALSE, 50, 0, NULL}, - /* msg 50: \t-user\t\tdefault user name */ + // msg 50: \t-user\t\tdefault user name {IN_SW_ALICE_VALIDATE, isc_spb_rpr_validate_db, "validate", sw_validate, 0, ~(sw_validate | sw_user | sw_password), FALSE, 51, 0, NULL}, - /* msg 51: \t-validate\tvalidate database structure */ + // msg 51: \t-validate\tvalidate database structure {IN_SW_ALICE_WRITE, 0, "write", sw_write, 0, ~(sw_write | sw_user | sw_password), FALSE, 52, 0, NULL}, - /* msg 52: \t-write\t\twrite synchronously or asynchronously */ + // msg 52: \t-write\t\twrite synchronously or asynchronously #ifdef DEV_BUILD {IN_SW_ALICE_X, 0, "x", 0, 0, 0, FALSE, 53, 0, NULL}, - /* msg 53: \t-x\t\tset debug on */ + // msg 53: \t-x\t\tset debug on #endif {IN_SW_ALICE_Z, 0, "z", sw_z, 0, 0, FALSE, 54, 0, NULL}, - /* msg 54: \t-z\t\tprint software version number */ + // msg 54: \t-z\t\tprint software version number /************************************************************************/ -/* WARNING: All new switches should be added right before this comments */ +// WARNING: All new switches should be added right before this comments /************************************************************************/ /* The next nine 'virtual' switches are hidden from user and are needed for services API Index: all.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/all.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- all.cpp 20 Jan 2005 19:59:07 -0000 1.1.1.1 +++ all.cpp 2 Sep 2005 19:11:10 -0000 1.2 @@ -28,163 +28,18 @@ // #include "firebird.h" +#include "../jrd/common.h" #include "../alice/all.h" -//#include "../jrd/ib_stdio.h" -//#include "../jrd/common.h" #include "../alice/alice.h" -//#include "../alice/all.h" -//#include "../alice/lls.h" -//#include "../alice/all_proto.h" -//#include "../jrd/gds_proto.h" -#include "../jrd/thd_proto.h" +#include "../jrd/thd.h" #include "../common/classes/alloc.h" - -//____________________________________________________________ -// -// Get rid of everything. -// - -void ALLA_fini(void) -{ - TGBL tdgbl = GET_THREAD_DATA; - - for (tgbl::pool_vec_t::iterator curr = tdgbl->pools.begin(); - curr != tdgbl->pools.end(); ++curr) - { - AliceMemoryPool::deletePool(*curr); - *curr = 0; - } - tdgbl->pools.clear(); - - tdgbl->ALICE_default_pool = 0; - tdgbl->ALICE_permanent_pool = 0; -} - - -//____________________________________________________________ -// -// Initialize the pool system. -// - -void ALLA_init(void) -{ - TGBL tdgbl = GET_THREAD_DATA; -#ifdef NOT_USED_OR_REPLACED - tdgbl->ALICE_default_pool = tdgbl->ALICE_permanent_pool = - AliceMemoryPool::create_new_pool(); -#else - // TMN: John, what pool to use here? - tdgbl->ALICE_permanent_pool = AliceMemoryPool::createPool(); - tdgbl->ALICE_default_pool = tdgbl->ALICE_permanent_pool; -#endif +AliceMemoryPool* AliceMemoryPool::createPool() { + AliceMemoryPool* result = (AliceMemoryPool*)internal_create(sizeof(AliceMemoryPool)); + return result; } - - -void AliceMemoryPool::ALLA_push(class blk *object, class lls** stack) +void AliceMemoryPool::deletePool(AliceMemoryPool* pool) { -/************************************** - * - * A L L _ p u s h - * - ************************************** - * - * Functional description - * Push an object on an LLS stack. - * - **************************************/ - TGBL tdgbl = GET_THREAD_DATA; - AliceMemoryPool* pool = tdgbl->ALICE_default_pool; - - class lls* node = pool->lls_cache.newBlock(); - node->lls_object = object; - node->lls_next = *stack; - *stack = node; -} - - -BLK AliceMemoryPool::ALLA_pop(LLS *stack) -{ -/************************************** - * - * A L L _ p o p - * - ************************************** - * - * Functional description - * Pop an object off a linked list stack. Save the node for - * further use. - * - **************************************/ - LLS node = *stack; - *stack = node->lls_next; - BLK object = node->lls_object; - - AliceMemoryPool* pool = (AliceMemoryPool*)MemoryPool::blk_pool(node); - pool->lls_cache.returnBlock(node); - - return object; -} - -#ifdef NOT_USED_OR_REPLACED -AliceMemoryPool* AliceMemoryPool::create_new_pool(MemoryPool* parent) -{ -/************************************** - * - * A L L _ p o o l - * - ************************************** - * - * Functional description - * Allocate a new pool. - * - **************************************/ - - TGBL tdgbl = GET_THREAD_DATA; - - // TMN: John, is this correct? - AliceMemoryPool* pool = new(0, parent) AliceMemoryPool(parent); - tgbl::pool_vec_t::iterator curr; - - for (curr = tdgbl->pools.begin(); curr != tdgbl->pools.end(); ++curr) - { - if (!*curr) - { - *curr = pool; - return pool; - } - } - - tdgbl->pools.resize(tdgbl->pools.size() + 10); - for (curr = tdgbl->pools.begin(); curr != tdgbl->pools.end(); ++curr) - { - if (!*curr) - { - *curr = pool; - return pool; - } - } - - //fb_assert(0); - //BUGCHECK ("ALLA_fini - finishing before starting"); - return 0;//pool; // Never reached, but makes the compiler happy. -} -#endif - -void AliceMemoryPool::deletePool(AliceMemoryPool* pool) { - TGBL tdgbl = GET_THREAD_DATA; - - tgbl::pool_vec_t::iterator curr; - for (curr = tdgbl->pools.begin(); curr != tdgbl->pools.end(); ++curr) - { - if (*curr == pool) - { - *curr = 0; - break; - } - } - pool->lls_cache.~BlockCache<lls>(); MemoryPool::deletePool(pool); } - Index: all.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/all.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- all.h 20 Jan 2005 19:59:01 -0000 1.1.1.1 +++ all.h 2 Sep 2005 19:11:10 -0000 1.2 @@ -24,34 +24,27 @@ #ifndef ALICE_ALL_H #define ALICE_ALL_H -#include "../jrd/block_cache.h" -#include "../alice/lls.h" +/*** +#include "../common/classes/auto.h" +#include "../common/classes/alloc.h" class AliceMemoryPool : public MemoryPool { protected: // Dummy constructor and destructor. Should never be called - AliceMemoryPool() : MemoryPool(NULL, NULL), lls_cache(*this) {} + AliceMemoryPool() : MemoryPool(NULL, default_stats_group, NULL, NULL) {} ~AliceMemoryPool() {} public: - static AliceMemoryPool *createPool() { - AliceMemoryPool *result = (AliceMemoryPool *)internal_create(sizeof(AliceMemoryPool)); - new (&result->lls_cache) BlockCache<lls> (*result); - return result; - } + static AliceMemoryPool* createPool(); static void deletePool(AliceMemoryPool* pool); -// static AliceMemoryPool *create_new_pool(MemoryPool* = 0); -// AliceMemoryPool(MemoryPool* p = 0) -// : MemoryPool(0, p), -// lls_cache(*this) -// {} - - static class blk* ALLA_pop(class lls**); - static void ALLA_push(class blk*, class lls**); - -private: - BlockCache<class lls> lls_cache; /* Was plb_lls */ + static void clear(AliceMemoryPool* ptr) + { + deletePool(ptr); + } }; +typedef Firebird::AutoPtr<AliceMemoryPool, AliceMemoryPool> AliceAutoPool; +***/ + #endif // ALICE_ALL_H Index: all_proto.h =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/all_proto.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- all_proto.h 20 Jan 2005 19:59:02 -0000 1.1.1.1 +++ all_proto.h 2 Sep 2005 19:11:10 -0000 1.2 @@ -24,8 +24,5 @@ #ifndef ALICE_ALL_PROTO_H #define ALICE_ALL_PROTO_H -void ALLA_init(); /* initialize pool system */ -void ALLA_fini(); /* get rid of everything */ - #endif // ALICE_ALL_PROTO_H Index: exe.cpp =================================================================== RCS file: /cvsroot/firebird/vulcan/src/alice/exe.cpp,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -b -U3 -r1.1.1.1 -r1.2 --- exe.cpp 20 Jan 2005 19:59:05 -0000 1.1.1.1 +++ exe.cpp 2 Sep 2005 19:11:10 -0000 1.2 @@ -24,7 +24,6 @@ // //____________________________________________________________ // -// $Id$ // // 2001.07.06 Sean Leyne - Code Cleanup, removed "#ifdef READONLY_DATABASE" // conditionals, as the engine now fully supports @@ -34,24 +33,24 @@ // #include "firebird.h" -#include "../jrd/ib_stdio.h" +#include <stdio.h> #include <stdlib.h> #include <string.h> -//#include "../jrd/y_ref.h" #include "../jrd/ibase.h" #include "../jrd/common.h" #include "../alice/alice.h" #include "../alice/alice_proto.h" #include "../alice/aliceswi.h" -//#include "../alice/all.h" +#include "../alice/all.h" #include "../alice/all_proto.h" #include "../alice/alice_meta.h" #include "../alice/tdr_proto.h" #include "../jrd/gds_proto.h" -#include "../jrd/thd_proto.h" +#include "../jrd/thd.h" +#include "../common/classes/ClumpletWriter.h" -static USHORT build_dpb(UCHAR*, const ULONG); +static void buildDpb(Firebird::ClumpletWriter&, const ULONG); static void extract_db_info(const UCHAR*); static const TEXT val_errors[] = @@ -61,22 +60,6 @@ isc_info_tpage_errors, isc_info_end }; -static inline void stuff_dpb(UCHAR** d, int blr) -{ - UCHAR *ptr = *d; - *ptr++ = (UCHAR)blr; - *d = ptr; -} - -static inline void stuff_dpb_long(UCHAR** d, int blr) -{ - stuff_dpb(d, blr); - stuff_dpb(d, blr >> 8); - stuff_dpb(d, blr >> 16); - stuff_dpb(d, blr >> 24); -} - - //____________________________________________________________ // @@ -84,35 +67,47 @@ int EXE_action(const TEXT* database, const ULONG switches) { - UCHAR dpb[128]; - TGBL tdgbl = GET_THREAD_DATA; - - ALLA_init(); + bool error = false; + AliceAutoPool newPool(AliceMemoryPool::createPool()); + { + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); + AliceContextPoolHolder context(tdgbl, newPool); for (USHORT i = 0; i < MAX_VAL_ERRORS; i++) + { tdgbl->ALICE_data.ua_val_errors[i] = 0; + } // generate the database parameter block for the attach, // based on the various switches + Firebird::ClumpletWriter dpb(true, MAX_DPB_SIZE); + buildDpb(dpb, switches); - const USHORT dpb_length = build_dpb(dpb, switches); - - bool error = false; - FRBRD* handle = NULL; - isc_attach_database(tdgbl->status, 0, database, &handle, dpb_length, - reinterpret_cast<SCHAR*>(dpb)); + FB_API_HANDLE handle = 0; + isc_attach_database(tdgbl->status, 0, database, &handle, + dpb.getBufferLength(), + reinterpret_cast<const SCHAR*>(dpb.getBuffer())); - SVC_STARTED(tdgbl->service_blk); + tdgbl->service_blk->svc_started(); - if (tdgbl->status[1]) + if (tdgbl->status[1] && + // Ignore isc_shutdown error produced when we switch to full shutdown mode. It is expected. + (tdgbl->status[1] != isc_shutdown || !(switches & sw_shut) || tdgbl->ALICE_data.ua_shutdown_mode != SHUT_FULL) + ) + { error = true; + } if (tdgbl->status[2] == isc_arg_warning) + { ALICE_print_status(tdgbl->status); + } - if (handle != NULL) { + if (handle != 0) + { UCHAR error_string[128]; - if ((switches & sw_validate) && (tdgbl->status[1] != isc_bug_check)) { + if ((switches & sw_validate) && (tdgbl->status[1] != isc_bug_check)) + { isc_database_info(tdgbl->status, &handle, sizeof(val_errors), val_errors, sizeof(error_string), reinterpret_cast<char*>(error_string)); @@ -121,12 +116,13 @@ } if (switches & sw_disable) + { MET_disable_wal(tdgbl->status, handle); + } isc_detach_database(tdgbl->status, &handle); } - - ALLA_fini(); + } return ((error) ? FINI_ERROR : FINI_OK); } @@ -138,41 +134,51 @@ int EXE_two_phase(const TEXT* database, const ULONG switches) { - UCHAR dpb[128]; - TGBL tdgbl = GET_THREAD_DATA; - - ALLA_init(); + bool error = false; + AliceAutoPool newPool(AliceMemoryPool::createPool()); + { + AliceGlobals* tdgbl = AliceGlobals::getSpecific(); + AliceContextPoolHolder context(tdgbl, newPool); for (USHORT i = 0; i < MAX_VAL_ERRORS; i++) + { tdgbl->ALICE_data.ua_val_errors[i] = 0; + } // generate the database parameter block for the attach, // based on the various switches + Firebird::ClumpletWriter dpb(true, MAX_DPB_SIZE); + buildDpb(dpb, switches); - const USHORT dpb_length = build_dpb(dpb, switches); - - bool error = false; - FRBRD* handle = NULL; + FB_API_HANDLE handle = 0; isc_attach_database(tdgbl->status, 0, database, &handle, - dpb_length, reinterpret_cast<char*>(dpb... [truncated message content] |