You've already forked mariadb-columnstore-engine
							
							
				mirror of
				https://github.com/mariadb-corporation/mariadb-columnstore-engine.git
				synced 2025-10-30 07:25:34 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			280 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			280 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright (C) 2014 InfiniDB, Inc.
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; version 2 of
 | |
|    the License.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, write to the Free Software
 | |
|    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 | |
|    MA 02110-1301, USA. */
 | |
| 
 | |
| /*******************************************************************************
 | |
|  * $Id: inputmgr.cpp 2258 2013-05-08 17:33:40Z dcathey $
 | |
|  *
 | |
|  *******************************************************************************/
 | |
| 
 | |
| #include "inputmgr.h"
 | |
| 
 | |
| #include <iostream>
 | |
| #include <unistd.h>
 | |
| #include <cstdlib>
 | |
| #include <cerrno>
 | |
| 
 | |
| #include "calpontsystemcatalog.h"
 | |
| #include "we_define.h"
 | |
| 
 | |
| using namespace std;
 | |
| using namespace WriteEngine;
 | |
| using namespace execplan;
 | |
| 
 | |
| namespace bulkloadxml
 | |
| {
 | |
| //------------------------------------------------------------------------------
 | |
| // InputMgr constructor
 | |
| //------------------------------------------------------------------------------
 | |
| InputMgr::InputMgr(const string& job)
 | |
| {
 | |
|   fParms[JOBID] = job;  // add or override default value
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // InputMgr destructor
 | |
| //------------------------------------------------------------------------------
 | |
| /* virtual */
 | |
| InputMgr::~InputMgr()
 | |
| {
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // printUsage
 | |
| //------------------------------------------------------------------------------
 | |
| void InputMgr::printUsage()
 | |
| {
 | |
|   //@bug 391
 | |
|   cerr << "Usage: "
 | |
|        << "colxml [options] dbName" << endl
 | |
|        << endl;
 | |
|   cerr << "Options: " << endl;
 | |
|   cerr << "   -d Delimiter (default '|')\n";
 | |
|   cerr << "   -e Maximum allowable errors (per table)\n";
 | |
|   cerr << "   -h Print this message\n";
 | |
|   cerr << "   -j Job id (numeric)\n";
 | |
|   cerr << "   -l Load file name\n";
 | |
|   cerr << "   -n \"name in quotes\"\n";
 | |
|   cerr << "   -p Path for XML job description file that is generated\n";
 | |
|   cerr << "   -s \"Description in quotes\"\n";
 | |
|   cerr << "   -t Table name\n";
 | |
|   cerr << "   -u User\n";
 | |
|   cerr << "   -r Number of read buffers\n";
 | |
|   cerr << "   -c Application read buffer size (in bytes)\n";
 | |
|   cerr << "   -w I/O library buffer size (in bytes), used to read files\n";
 | |
|   cerr << "   -x Extension of file name (default \".tbl\")\n";
 | |
|   cerr << "   -E EnclosedByChar (if data has enclosed values)\n";
 | |
|   cerr << "   -C EscapeChar\n";
 | |
|   cerr << "   -b Debug level (1-3)\n\n";
 | |
|   cerr << "   dbName - Required parm specifying the name of the database;" << endl
 | |
|        << "            all others are optional\n\n";
 | |
|   cerr << "Example:\n\t"
 | |
|        << "colxml -t lineitem -j 123 tpch\n";
 | |
|   //    exit(0);
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Provide input to this class through argc/argv interface.
 | |
| //------------------------------------------------------------------------------
 | |
| bool InputMgr::input(int argc, char** argv)
 | |
| {
 | |
|   std::vector<std::string> l_tableList;
 | |
|   int ch;
 | |
| 
 | |
|   while ((ch = getopt(argc, argv, "b:d:s:j:l:e:n:p:t:u:r:c:w:x:hE:C:")) != EOF)
 | |
|   {
 | |
|     switch (ch)
 | |
|     {
 | |
|       case 't':
 | |
|       {
 | |
|         l_tableList.push_back(optarg);
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       case 'l':
 | |
|       {
 | |
|         fLoadNames.push_back(optarg);
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       case 'r':
 | |
|       case 'c':
 | |
|       case 'w':
 | |
|       case 'j':
 | |
|       case 'b':
 | |
|       case 'e':
 | |
|       {
 | |
|         if (verifyArgument(optarg) < 0)
 | |
|         {
 | |
|           cout << "Argument associated with option -" << (char)ch << " is not a number." << endl;
 | |
|           return false;
 | |
|         }
 | |
| 
 | |
|         errno = 0;
 | |
|         long lValue = strtol(optarg, 0, 10);
 | |
| 
 | |
|         if (errno != 0)
 | |
|         {
 | |
|           cout << "Option -" << (char)ch << " is invalid or out of range" << endl;
 | |
|           return false;
 | |
|         }
 | |
| 
 | |
|         // Limit to INT_MAX because we eventually store in an "int"
 | |
|         if (((ch == 'e') && (lValue < 0)) || ((ch != 'e') && (lValue < 1)) || (lValue > INT_MAX))
 | |
|         {
 | |
|           cout << "Option -" << (char)ch << " is invalid or out of range." << endl;
 | |
|           return false;
 | |
|         }
 | |
|       }
 | |
|       /* FALLTHRU */
 | |
|       case 'd':
 | |
|       case 's':
 | |
|       case 'f':
 | |
|       case 'n':
 | |
|       case 'p':
 | |
|       case 'u':
 | |
|       case 'x':
 | |
|       case 'E':
 | |
|       case 'C':
 | |
|       {
 | |
|         char l_option[4];
 | |
|         snprintf(l_option, sizeof(l_option), "-%c", ch);
 | |
|         ParmList::iterator p = fParms.find(l_option);
 | |
| 
 | |
|         if (fParms.end() != p)
 | |
|           p->second = optarg;
 | |
| 
 | |
|         break;
 | |
|       }
 | |
| 
 | |
|       case 'h':
 | |
|       {
 | |
|         printUsage();
 | |
|         return false;
 | |
|       }
 | |
| 
 | |
|       default:
 | |
|       {
 | |
|         cout << "Try '" << argv[0] << " -h' for more information." << endl;
 | |
|         return false;
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (optind < argc)
 | |
|   {
 | |
|     fSchema = argv[optind++];
 | |
| 
 | |
|     if (optind < argc)
 | |
|     {
 | |
|       cout << "Extraneous arguments are ignored." << endl;
 | |
|     }
 | |
|   }
 | |
|   else
 | |
|   {
 | |
|     cout << "Schema value is required." << endl;
 | |
|     cout << "Try '" << argv[0] << " -h' for more information." << endl;
 | |
|     return false;
 | |
|   }
 | |
| 
 | |
|   for (unsigned ndx = 0; ndx < l_tableList.size(); ndx++)
 | |
|   {
 | |
|     fTables.push_back(execplan::CalpontSystemCatalog::TableName(fSchema, l_tableList[ndx]));
 | |
|   }
 | |
| 
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Get list of tables for fSchema, and store the list in fTables.
 | |
| //------------------------------------------------------------------------------
 | |
| bool InputMgr::loadCatalogTables()
 | |
| {
 | |
|   boost::shared_ptr<execplan::CalpontSystemCatalog> systemCatPtr =
 | |
|       execplan::CalpontSystemCatalog::makeCalpontSystemCatalog(BULK_SYSCAT_SESSION_ID);
 | |
|   systemCatPtr->identity(execplan::CalpontSystemCatalog::EC);
 | |
|   const vector<pair<CalpontSystemCatalog::OID, CalpontSystemCatalog::TableName> > tables =
 | |
|       systemCatPtr->getTables(fSchema);
 | |
| 
 | |
|   for (vector<pair<CalpontSystemCatalog::OID, CalpontSystemCatalog::TableName> >::const_iterator it =
 | |
|            tables.begin();
 | |
|        it != tables.end(); ++it)
 | |
|   {
 | |
|     fTables.push_back((*it).second);
 | |
|   }
 | |
| 
 | |
|   return (!fTables.empty());
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Verify that string argument is numeric
 | |
| //------------------------------------------------------------------------------
 | |
| int InputMgr::verifyArgument(char* arg)
 | |
| {
 | |
|   while (*arg != 0)
 | |
|   {
 | |
|     if (!isdigit(*arg))
 | |
|     {
 | |
|       return -1;
 | |
|     }
 | |
| 
 | |
|     arg++;
 | |
|   }
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // print contents to specified stream
 | |
| //------------------------------------------------------------------------------
 | |
| /* virtual */
 | |
| void InputMgr::print(std::ostream& os) const
 | |
| {
 | |
|   os << *this;
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // operator<< for InputMgr
 | |
| //------------------------------------------------------------------------------
 | |
| std::ostream& operator<<(std::ostream& os, const InputMgr& m)
 | |
| {
 | |
|   os << "\n\tSchema:\t" << m.fSchema << "\n\t"
 | |
|      << "Tables:\t";
 | |
| 
 | |
|   for (InputMgr::TableList::const_iterator i = m.fTables.begin(); i != m.fTables.end(); ++i)
 | |
|     os << i->table << "  ";
 | |
| 
 | |
|   os << "\n\t"
 | |
|      << "Load Files: ";
 | |
| 
 | |
|   for (InputMgr::LoadNames::const_iterator i = m.fLoadNames.begin(); i != m.fLoadNames.end(); ++i)
 | |
|     os << *i << "  ";
 | |
| 
 | |
|   for (InputMgr::ParmList::const_iterator i = m.fParms.begin(); i != m.fParms.end(); ++i)
 | |
|   {
 | |
|     // Don't report the enclosedBy if not enabled by user
 | |
|     if ((i->first == XMLGenData::ENCLOSED_BY_CHAR) && (i->second.length() < 1))
 | |
|       continue;
 | |
| 
 | |
|     os << "\n\t" << i->first << "\t" << i->second;
 | |
|   }
 | |
| 
 | |
|   os << std::endl;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| }  // namespace bulkloadxml
 |