/**********************************************************************
// @@@ 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:         arkcmp_proc.cpp
 * Description:  This is the main entry point for arkcmp procedural interface.
 *
 *
 *
 * Created:      7/9/2013
 * Language:     C++
 *
 *
 *
 *****************************************************************************
 */


#include "Platform.h"
#include "NewDel.h"
#include <fstream>
#include <string.h>


#include "seabed/ms.h"
#include "seabed/fs.h"
extern void my_mpi_fclose();
#include "SCMVersHelp.h"
DEFINE_DOVERS(tdm_arkcmp)


#include "CmpMessage.h"
#include "CmpConnection.h"
#include "CmpContext.h"
#include "CmpCommon.h"
#include "CmpStoredProc.h"
#include "CmpErrLog.h"
#include "CompException.h"
// #include "StaticCompiler.h"
#include "logmxevent.h"
#include "QCache.h"
#include "QueryCacheSt.h"
#include "NATableSt.h"
#include "ComCextdecs.h"

#define CLI_DLL
#include "SQLCLIdev.h"
#undef CLI_DLL

#include "EHException.h"
#include "CmpEHCallBack.h"

#include "ObjectNames.h"
#include "Globals.h"
#include "CliSemaphore.h"

ostream &operator<<(ostream &dest, const ComDiagsArea& da);

// mainNewHandler_CharSave and mainNewHandler are used in the error
// handling when running out of virtual memory for the main program.
//
// Save 4K bytes of memory for the error handling when running out of VM.

static char* mainNewHandler_CharSave = new char[4096];


static Int32  mainNewHandler(size_t s)

{
  if (mainNewHandler_CharSave)
  {
    delete[] mainNewHandler_CharSave;
    mainNewHandler_CharSave = NULL;
    CmpErrLog((char *)"Memory allocation failure");
    ArkcmpFatalError(ARKCMP_ERROR_PREFIX "Out of virtual memory.", NOMEM_SEV);
  }
  return 0;

}

static void longJumpHandler()
{
  // check if we have emergency memory for reporting error.
  if (mainNewHandler_CharSave == 0)
    exit(1);

  delete [] mainNewHandler_CharSave;
  mainNewHandler_CharSave = 0;
  ArkcmpFatalError(ARKCMP_ERROR_PREFIX "Assertion failed (thrown by longjmp).");
}

extern THREAD_P jmp_buf CmpInternalErrorJmpBuf;

static void initializeArkcmp()
{
  CmpInternalErrorJmpBufPtr = &CmpInternalErrorJmpBuf;
  // noop for now
}

void deinitializeArkcmp()
{
  // noop for now
}


// RETURN:  0, no error.  
//          2, error during NADefaults creation. 
//          1, other errors during CmpContext creation.
Int32 arkcmp_main_entry()
{

  if (getenv("SQL_CMP_MSGBOX_PROCESS") != NULL )
     MessageBox(NULL, "Server: Process Launched", "tdm_arkcmp",
		MB_OK|MB_ICONINFORMATION);
  // The following call causes output messages to be displayed in the
  // same order on NSK and Windows.
  cout.sync_with_stdio();

  initializeArkcmp();
  try
  {
    { // a local ctor scope, within a try block
      // Set up the context info for the connection, it contains the variables
      // persistent through each statement loops.

      CmpContext *context=NULL;
      NAHeap *parentHeap = GetCliGlobals()->getCurrContextHeap();
      NAHeap *cmpContextHeap = new (parentHeap)
                      NAHeap((char *)"Cmp Context Heap",
                           parentHeap,
                           (Lng32)524288);
      try
      {
        CLISemaphore *cliSemaphore;
        cliSemaphore = GetCliGlobals()->getSemaphore();
        cliSemaphore->get();
        context= new (cmpContextHeap)CmpContext(CmpContext::IS_DYNAMIC_SQL,
			 cmpContextHeap);
        cliSemaphore->release();

         if (! context->getSchemaDB()->getDefaults().getSqlParser_NADefaults_Ptr())
          {
            // error during nadefault creation.
            // Cannot proceed.
            ArkcmpErrorMessageBox
              (ARKCMP_ERROR_PREFIX "- Cannot initialize NADefaults data.",
               ERROR_SEV, FALSE, FALSE, TRUE);
            return(2);
            }

      }
      catch (...)
      {
        ArkcmpErrorMessageBox
          (ARKCMP_ERROR_PREFIX "- Cannot initialize Compiler global data.",
           ERROR_SEV, FALSE, FALSE, TRUE);
        return(1);
      }

      //  moved down the IdentifyMyself so that it can be determined that the
      //  context has not yet been set up
      IdentifyMyself::SetMyName(I_AM_EMBEDDED_SQL_COMPILER);
      context->setIsEmbeddedArkcmp(TRUE);
      context->initContextGlobals();
      context->envs()->cleanup();

      // Clear the CLI globals context area if there are any leftover CLI diags
      //This is a fresh context and shouldn't have CLI diags.
      SQL_EXEC_ClearDiagnostics(NULL);

      assert(cmpCurrentContext == context);

      // Clear the SQL text buffer in the event logging area.
      cmpCurrentContext->resetLogmxEventSqlText();

    }

  }

  catch(BaseException& bE)
    {
      char msg[500];
      sprintf(msg, "%s BaseException: %s %d", ARKCMP_ERROR_PREFIX,
              bE.getFileName(), bE.getLineNum());
      ArkcmpFatalError(msg);
  }
  catch(...)
    {
      ArkcmpFatalError(ARKCMP_ERROR_PREFIX "Fatal exception.");
    }

  return 0;  
}


void arkcmp_main_exit()
{

}
