| /********************************************************************** |
| // @@@ START COPYRIGHT @@@ |
| // |
| // Licensed to the Apache Software Foundation (ASF) under one |
| // or more contributor license agreements. See the NOTICE file |
| // distributed with this work for additional information |
| // regarding copyright ownership. The ASF licenses this file |
| // to you under the Apache License, Version 2.0 (the |
| // "License"); you may not use this file except in compliance |
| // with the License. You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, |
| // software distributed under the License is distributed on an |
| // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| // KIND, either express or implied. See the License for the |
| // specific language governing permissions and limitations |
| // under the License. |
| // |
| // @@@ END COPYRIGHT @@@ |
| **********************************************************************/ |
| /* -*-C++-*- |
| ***************************************************************************** |
| * |
| * File: SqlciMain.cpp |
| * Description: Main program for mxci |
| * |
| * |
| * Created: 4/15/95 |
| * Language: C++ |
| * |
| * |
| * |
| * |
| ***************************************************************************** |
| */ |
| |
| #include "Platform.h" |
| |
| |
| #include <iostream> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include "BaseTypes.h" |
| #include "NAAssert.h" |
| #include "SqlciEnv.h" |
| #include "SqlciNode.h" |
| #include "TempIncludes.h" |
| //#include "UtilInt.h" |
| #include "StmtCompilationMode.h" // because of a kludge in eh/EHException.cpp |
| #include "ComDiags.h" |
| |
| |
| // The following are needed only until the "shadow-process" is implemented. |
| #include "rosetta/rosgen.h" |
| #define psecure_h_including_section |
| #define psecure_h_security_app_priv_ |
| #define psecure_h_security_ntuser_set_ |
| #include "security/psecure.h" |
| |
| |
| |
| |
| |
| #include "seabed/ms.h" |
| #include "seabed/fs.h" |
| #include "SCMBuildStr.h" |
| #include "SCMVersHelp.h" |
| #ifdef _DEBUG |
| #include "Globals.h" |
| #endif // _DEBUG |
| |
| DEFINE_DOVERS(sqlci) |
| |
| #if defined(_DEBUG) |
| #include "security/dsecure.h" |
| #define psecure_h_including_section |
| #define psecure_h_security_psb_set_ |
| #define psecure_h_security_psb_get_ |
| #include "security/psecure.h" |
| #define MAX_PRINTABLE_SID_LENGTH 256 |
| #endif //_DEBUG |
| |
| #ifdef CLI_DLL |
| #include "SQLCLIdev.h" |
| #endif |
| |
| #include "EHException.h" |
| |
| #ifdef _DEBUG_RTS |
| #include "ComQueue.h" |
| #include "Globals.h" |
| #include "SqlStats.h" |
| #include "dhalt.h" |
| #endif |
| |
| #include "QRLogger.h" |
| |
| extern void my_mpi_fclose(); |
| |
| |
| // jmp_buf Buf; |
| THREAD_P jmp_buf ExportJmpBuf; |
| extern THREAD_P jmp_buf* ExportJmpBufPtr; |
| |
| SqlciEnv * global_sqlci_env = NULL ; // Global sqlci_env for break key handling purposes. |
| |
| // This processes options of the form: |
| // <hyphen><single option char><zero or more blanks><required argument string> |
| // e.g. "-ifilename" "-i filename". |
| // An (English) error message is emitted for "-i" without an argument, |
| // "-" without an option letter, and "x" without a hyphen, but |
| // all other options pass thru with no error, as they may be an X option |
| // processed later in the InitializeX call. |
| // |
| // If the "-u name" option is specified, a copy of the name is |
| // returned in the user_name output parameter. |
| // The name is always uppercased regardless of whether it is enclosed |
| // in double quotes. |
| void processOption(Int32 argc, char *argv[], Int32 &i, |
| const char *& in_filename, |
| const char *& input_string, |
| const char *& out_filename, |
| char *& sock_port, |
| NAString &user_name |
| ) |
| { |
| Int32 iorig = i; |
| char op = '\0'; |
| // const char *argAfterOp = NULL; |
| char *argAfterOp = NULL; |
| Int32 status; |
| if (argv[i][0] == '-') |
| { |
| op = argv[i][1]; |
| if (op) |
| if (argv[i][2]) |
| argAfterOp = &argv[i][2]; |
| else if (i < argc-1) |
| argAfterOp = argv[++i]; |
| } |
| |
| if (argAfterOp) |
| { |
| switch (op) |
| { |
| case 's': sock_port = argAfterOp; // socket port number |
| break; |
| case 'i': in_filename = argAfterOp; // input file |
| break; |
| case 'o': out_filename = argAfterOp; // output file |
| break; |
| case 'q': input_string = argAfterOp; // input qry |
| break; |
| // case 'p': sqlci->getUtil()->setProgramName(argAfterOp); // utility name |
| // break; |
| // case 't': sqlci->getUtil()->setTerminalName(argAfterOp); // utility debug |
| // sqlci->getUtil()->setDebug(11); // inspect flag |
| // break; |
| |
| case 'u': |
| { |
| // The user_name output parameter will contain a copy of the |
| // name |
| user_name = argAfterOp; |
| user_name.toUpper(); |
| |
| } // case 'u' |
| break; |
| |
| default: |
| ; // ok -- may be an X option, processed later in InitializeX |
| |
| } // switch (op) |
| } // if (argAfterOp) |
| |
| else |
| { |
| // No argument appears after the option |
| switch (op) |
| { |
| case 'v': printf("sqlci version: %s\n", SCMBuildStr); |
| exit(0); |
| break; |
| |
| case 'i': |
| case 'p': |
| case 't': |
| cerr << argv[0] << ": " << argv[iorig] |
| << " option requires an argument -- ignored" << endl; |
| break; |
| |
| case '\0': |
| cerr << argv[0] << ": " << argv[iorig] |
| << " option is unknown -- ignored" << endl; |
| break; |
| |
| default: |
| ; // ok -- may be an X option, processed later in InitializeX |
| |
| } // switch (op) |
| } // if (argAfterOp) else ... |
| } |
| |
| #ifdef _DEBUG_RTS |
| _callable void removeProcess() |
| { |
| CliGlobals *cliGlobals = GetCliGlobals(); |
| StatsGlobals *statsGlobals = cliGlobals->getStatsGlobals(); |
| if (statsGlobals != NULL) |
| { |
| int error = statsGlobals->getStatsSemaphore(cliGlobals->getSemId(), |
| cliGlobals->myPin()); |
| if (error == 0) |
| { |
| statsGlobals->removeProcess(cliGlobals->myPin()); |
| statsGlobals->releaseStatsSemaphore(cliGlobals->getSemId(), cliGlobals->myPin()); |
| } |
| else if (error == 4011) |
| { |
| // BINSEM_LOCK_ timed out. Halt the CPU |
| PROCESSOR_HALT_ (SQL_FS_INTERNAL_ERROR); |
| } |
| } |
| } |
| #endif |
| |
| Int32 main (Int32 argc, char *argv[]) |
| { |
| dovers(argc, argv); |
| |
| // check this before file_init_attach overwrites the user env |
| NABoolean sync_with_stdio = (getenv("NO_SYNC_WITH_STDIO") == NULL); |
| |
| try |
| { |
| file_init_attach(&argc, &argv, TRUE, (char *)""); |
| msg_debug_hook("sqlci", "sqlci.hook"); |
| file_mon_process_startup2(true, false); |
| atexit(my_mpi_fclose); |
| } |
| catch (...) |
| { |
| cerr << "Error while initializing messaging system. Please make sure Trafodion is started and up. Exiting..." << endl; |
| exit(1); |
| } |
| |
| if (sync_with_stdio) |
| ios::sync_with_stdio(); |
| |
| |
| // Establish app user id from the current NT process user identity. |
| // This must be done explicitly until the "shadow-process" mechanism |
| // is fully implemented. (It is done too late in cli/Context.cpp.) |
| // FX: I'm not sure whether the following code applies |
| // to NT only. |
| |
| |
| // process command line options |
| char * in_filename = NULL; |
| char * input_string = NULL; |
| char * out_filename = NULL; |
| char * sock_port = NULL; |
| NAString user_name(""); |
| Int32 i = 1; |
| for (; i < argc; i++) |
| processOption(argc, argv, |
| i, |
| (const char *&)in_filename, |
| (const char *&)input_string, |
| (const char *&)out_filename, |
| (char *&)sock_port, |
| user_name |
| ); |
| |
| if (sock_port) |
| { |
| } |
| |
| // create a SQLCI object |
| SqlciEnv * sqlci = new SqlciEnv(); |
| global_sqlci_env = sqlci; |
| |
| if (user_name.length() > 0) |
| sqlci->setUserNameFromCommandLine(user_name); |
| |
| |
| if (setjmp(ExportJmpBuf)) |
| { |
| |
| printf("\nSQLCI terminating due to assertion failure"); |
| delete sqlci; |
| exit(1); // NAExit(1); |
| } |
| |
| ExportJmpBufPtr = &ExportJmpBuf; |
| |
| if ((!in_filename) && |
| (out_filename)) |
| { |
| sqlci->setNoBanner(TRUE); |
| |
| // create a logfile with the name out_filename. |
| // Do not do that if an in_filename is specified. Users should |
| // put the log command in the input file. |
| char * logf = new char[strlen("LOG ") + |
| strlen(out_filename) + |
| strlen(" clear;") + |
| 1]; |
| sprintf(logf, "LOG %s clear;", out_filename); |
| sqlci->run(NULL, logf); |
| delete logf; |
| |
| sqlci->get_logfile()->setNoDisplay(TRUE); |
| } |
| |
| // setup log4cxx, need to be done here so initLog4cxx can have access to |
| // process information since it is needed to compose the log name |
| QRLogger::initLog4cxx(QRLogger::QRL_MXEXE); |
| |
| // run it -- this is where the action is! |
| if (in_filename || input_string) |
| sqlci->run(in_filename, input_string); |
| else |
| sqlci->run(); |
| |
| if ((!in_filename) && |
| (out_filename)) |
| { |
| sqlci->run(NULL, (char *)"LOG;"); |
| } |
| |
| // Now we are done, delete SQLCI object |
| delete sqlci; |
| #ifdef _DEBUG_RTS |
| removeProcess(); |
| #endif |
| #ifdef _DEBUG |
| // Delete all contexts |
| GetCliGlobals()->deleteContexts(); |
| #endif // _DEBUG |
| return 0; |
| } |