The exportToDatabase program creates a logger, opens a logger tape, and exports it to a MS Access database.
You must have a MS Access data source named "Logger MS Access ODBC" (or change the code accordingly). See the User Guide for instructions on how to set up the data source.
/******************************************************************************* ** Copyright (c) 1992-2011 VT MAK ** All rights reserved. *******************************************************************************/ #include <absoluteTime.h> #include <lgrPlaybackInterface.h> #include <lgrPrint.h> #include <lgrSimInterface.h> #include <lgrSqlExportSettings.h> #include <lgrEditorInterface.h> #include <lgrHlaFilterByClass.h> #include <vlutil/vlProcessControl.h> #include <vlutil/vlPrint.h> #include <cmdLine/cmdLine.h> #include <lgrVersion.h> #if DtDIS #include <vl/dExConnInit.h> #include <disLogger.h> #endif #if DtHLA #include <vl/hExConnInit.h> #include <hlaLogger.h> #endif using namespace MAKLogger; // Hard coded paths for files. Relative to the bin directories. #ifdef DtHLA #ifdef DtHLA_1516 #ifdef DtHLA_1516_EVOLVED const char defaultFileName[] = "..\\logger_tapes\\maklanddemoHLA1516e_vrlink_evolved_xml.lgr"; #else // DtHLA_1516 && !DtHLA_1516_EVOLVED const char defaultFileName[] = "..\\logger_tapes\\maklanddemoHLA1516_vrlink_xml.lgr"; #endif // DtHLA_1516_EVOLVED #else // !DtHLA_1516 const char defaultFileName[] = "..\\logger_tapes\\maklanddemoHLA13.lgr"; #endif // DtHLA_1516 #else // !DtHLA const char defaultFileName[] = "..\\logger_tapes\\maklanddemoDIS.lgr"; #endif // DtHLA bool keyCheck(const char* keysToCheck) { if(DtKbHit()) { char c = DtGetCh(); return strchr(keysToCheck,c) != 0; } return false; } // Add the database export to the editor interface. #if DtDIS #include "lgrDisSqlExporter.h" typedef DtLgrDisSqlExporter TheExporter; #elif DtHLA #include "lgrHlaSqlExporter.h" typedef DtLgrHlaSqlExporter TheExporter; #endif void addDatabaseExport(DtLgrEditorInterface* editorInterface) { DtString fileFormat = TheExporter::theExportName(); DtString fileFilter = ""; // Do not offset the times. bool offsetData = false; // Do not generate extra data. bool generateData = false; // Export both selection and whole file. DtLgrEditorInterface::ExportType exportType = DtLgrEditorInterface::UserExport; DtLgrPacketPrinter* printer(0); printer = TheExporter::create(); if(editorInterface) { editorInterface->addExportType(fileFormat,fileFilter,offsetData,generateData, exportType,std::auto_ptr<DtLgrPacketPrinter>(printer)); } } // Capture export signals class DtExportSlots { public: DtExportSlots() : myExportComplete(false) , myExportCanceled(false) {} ~DtExportSlots() {} void clearSignals() { myExportComplete = false; myExportCanceled = false; } bool MyExportComplete() const { return myExportComplete; } void MyExportComplete(bool val) { myExportComplete = val; } bool MyExportCanceled() const { return myExportCanceled; } void MyExportCanceled(bool val) { myExportCanceled = val; } public: void exportCompleted(const DtString& exportType) { myExportComplete = true; } void exportCanceled(const DtString& exportType) { myExportCanceled = true; } protected: bool myExportComplete; bool myExportCanceled; }; int exportFile(int argc, char** argv) { DtCmdLine::CmdLine cmdLine("exportFileToDatabase","Example of how to export a logger file to a database.",LOGGER_VERSION_STRING); DtCmdLine::UnlabeledMultiArg<DtString> filenameArg("Filename","The name of the logger file to export.","string"); cmdLine.add(&filenameArg); cmdLine.parse(argc,argv); std::vector<DtString> values = filenameArg.getValue(); if(values.size() == 0) { values.push_back(defaultFileName); } DtString filename(values.front()); try { // Create the logger based upon it's protocol. These helped sub classes // automatically register the protocol and provide additional utility // functions. #if DtDIS // Create a DIS logger DtDisLogger* aLogger = DtDisLogger::create(true); #endif #if DtHLA // Create a HLA logger DtHlaLogger* aLogger = DtHlaLogger::create(true); #endif // Initialize logger with default settings. DtExerciseConnInitializer exConnInit; #ifdef DtHLA #ifdef DtHLA_1516 #ifdef DtHLA_1516_EVOLVED exConnInit.setFedFileName("VR-Link_evolved.xml"); #else // DtHLA_1516 && !DtHLA_1516_EVOLVED exConnInit.setFedFileName("VR-Link.xml"); #endif // DtHLA_1516_EVOLVED #else // !DtHLA_1516 exConnInit.setFedFileName("VR-Link.fed"); #endif // DtHLA_1516 #endif // DtHLA aLogger->connect(exConnInit); DtLgrSimInterface* simInterface = DtLgrSimInterface::create(*aLogger); aLogger->tick(); simInterface->update(); if(!simInterface->isConnected()) { DtInfo << "Unable to connect." << std::endl; return 1; } delete simInterface; // Create Playback interface to open file DtLgrPlaybackInterface* pbInterface = DtLgrPlaybackInterface::create(*aLogger); if(!pbInterface) { DtInfo << "Error: Unable to create playback interface." << std::endl; return 1; } // Tell the logger to open a file. pbInterface->openFile(filename); // Process Commands aLogger->tick(); // Update interface pbInterface->update(); // Check to see if file was loaded. if(!pbInterface->isFileLoaded()) { DtInfo << "Unable to open file: " << filename << "." << std::endl; return 1; } // Configure export settings (these are for HLA 1.3 and export to Microsoft Access database) DtSqlExportSettings mySettings; mySettings.setDriver("Microsoft Access Driver (*.mdb)"); mySettings.setServerName("localhost"); mySettings.setUserName("root"); mySettings.setPassword(""); mySettings.setDataSource("Logger MS Access ODBC"); #ifdef DtHLA #ifdef DtHLA_1516 #ifdef DtHLA_1516_EVOLVED mySettings.setOmtFile("VR-Link_evolved.xml"); #else // DtHLA_1516 && !DtHLA_1516_EVOLVED mySettings.setOmtFile("VR-Link.xml"); #endif // DtHLA_1516_EVOLVED #else // !DtHLA_1516 mySettings.setOmtFile("VR-Link.omt"); #endif // DtHLA_1516 #endif // DtHLA mySettings.setShortTableNames(1); mySettings.setGenerateInstanceTable(1); mySettings.setGenerateCheckpointTable(1); mySettings.setGenerateLargeSubcomponentTables(1); mySettings.setLargeSubcomponentThreshold(50); #ifdef DtHLA // Add a class filter to remove updates of the specified class DtLgrHlaFilterByClass* classFilter = DtLgrHlaFilterByClass::create(); #ifdef DtHLA_1516 classFilter->setFilterObjectClass("HLAobjectRoot.BaseEntity.PhysicalEntity.Platform.Aircraft", true); #else // !DtHLA_1516 classFilter->setFilterObjectClass("ObjectRoot.BaseEntity.PhysicalEntity.Platform.Aircraft", true); #endif // DtHLA_1516 mySettings.packetFilters().push_back(classFilter); #endif // DtHLA DtString dest = mySettings.encodeDestination(); // Create Editor interface for controlling export. DtLgrEditorInterface* editorInterface = DtLgrEditorInterface::create(*aLogger); if(!editorInterface) { DtInfo << "Error: Unable to create editor interface." << std::endl; return 1; } // Add the database export addDatabaseExport(editorInterface); // Add slots to capture result of export operation DtExportSlots exportSlots; DtConnect(editorInterface->exportCompletedSignal, &exportSlots, &DtExportSlots::exportCompleted); DtConnect(editorInterface->exportCanceledSignal, &exportSlots, &DtExportSlots::exportCanceled); editorInterface->exportFile("Database",dest,false,false); DtInfo << "Exporting file: " << filename << "." << std::endl; DtInfo << "Wait ...\n"; // Export operation is processed within the single tick // Tick logger aLogger->tick(); // Update Interface pbInterface->update(); editorInterface->update(); // Check to see if the logger is still completed the export. if (exportSlots.MyExportCanceled()) { DtInfo << "Export was canceled." << std::endl; } else if(!exportSlots.MyExportComplete()) { DtInfo << "Stopping export." << std::endl; editorInterface->cancelLongOperation(); // Make the logger stop. aLogger->tick(); } DtInfo << "Finished exporting file." << std::endl; DtRestoreKbHit(); delete pbInterface; delete editorInterface; delete aLogger; } catch (DtException& ex) { DtString output = DtSerializeException(ex); DtInfo << output << std::endl; return 0; } return 0; } int main(int argc, char** argv) { return exportFile(argc,argv); }