⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localconfig.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
字号:
/* Copyright (C) 2003 MySQL AB   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; either version 2 of the License, or   (at your option) any later version.   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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include "LocalConfig.hpp"#include <NdbEnv.h>#include <NdbConfig.h>#include <NdbAutoPtr.hpp>#include <NdbMem.h>LocalConfig::LocalConfig(){  error_line = 0; error_msg[0] = 0;  _ownNodeId= 0;}boolLocalConfig::init(const char *connectString,		  const char *fileName){  DBUG_ENTER("LocalConfig::init");  /**    * Escalation:   *  1. Check connectString   *  2. Check given filename   *  3. Check environment variable NDB_CONNECTSTRING   *  4. Check Ndb.cfg in NDB_HOME   *  5. Check Ndb.cfg in cwd   *  6. Check defaultConnectString   */    _ownNodeId= 0;  //1. Check connectString  if(connectString != 0 && connectString[0] != 0){    if(readConnectString(connectString, "connect string")){      if (ids.size())	DBUG_RETURN(true);      // only nodeid given, continue to find hosts    } else      DBUG_RETURN(false);  }  //2. Check given filename  if (fileName && strlen(fileName) > 0) {    bool fopenError;    if(readFile(fileName, fopenError)){      DBUG_RETURN(true);    }    DBUG_RETURN(false);  }  //3. Check environment variable  char buf[255];    if(NdbEnv_GetEnv("NDB_CONNECTSTRING", buf, sizeof(buf)) &&     strlen(buf) != 0){    if(readConnectString(buf, "NDB_CONNECTSTRING")){      DBUG_RETURN(true);    }    DBUG_RETURN(false);  }    //4. Check Ndb.cfg in NDB_HOME  {    bool fopenError;    char *buf= NdbConfig_NdbCfgName(1 /*true*/);    NdbAutoPtr<char> tmp_aptr(buf);    if(readFile(buf, fopenError))      DBUG_RETURN(true);    if (!fopenError)      DBUG_RETURN(false);  }  //5. Check Ndb.cfg in cwd  {    bool fopenError;    char *buf= NdbConfig_NdbCfgName(0 /*false*/);    NdbAutoPtr<char> tmp_aptr(buf);    if(readFile(buf, fopenError))      DBUG_RETURN(true);    if (!fopenError)      DBUG_RETURN(false);  }  //7. Check  {    char buf[256];    BaseString::snprintf(buf, sizeof(buf), "host=localhost:%s", NDB_PORT);    if(readConnectString(buf, "default connect string"))      DBUG_RETURN(true);  }  setError(0, "");  DBUG_RETURN(false);}LocalConfig::~LocalConfig(){}  void LocalConfig::setError(int lineNumber, const char * _msg) {  error_line = lineNumber;  strncpy(error_msg, _msg, sizeof(error_msg));}void LocalConfig::printError() const {  ndbout << "Configuration error" << endl;  if (error_line)    ndbout << "Line: "<< error_line << ", ";  ndbout << error_msg << endl << endl;}void LocalConfig::printUsage() const {  ndbout << "This node needs information on how to connect"<<endl	 << "to the NDB Management Server."<<endl	 << "The information can be supplied in one of the following ways:"	 << endl;      ndbout << "1. Put a Ndb.cfg file in the directory where you start"<<endl 	 << "   the node. "<< endl	 << "   Ex: Ndb.cfg" << endl	 << "   | host=localhost:"<<NDB_PORT<<endl;      ndbout << "2. Use the environment variable NDB_CONNECTSTRING to "<<endl	 << "   provide this information." <<endl	 << "   Ex: " << endl	 << "   >export NDB_CONNECTSTRING=\"host=localhost:"<<NDB_PORT<<"\""	 <<endl<<endl;}  const char *nodeIdTokens[] = {  "OwnProcessId %i",  "nodeid=%i",  0};const char *hostNameTokens[] = {  "host://%[^:]:%i",  "host=%[^:]:%i",  "mgmd=%[^:]:%i",  "%[^:^=^ ]:%i",  "%s %i",  0};const char *fileNameTokens[] = {  "file://%s",  "file=%s",  0};boolLocalConfig::parseNodeId(const char * buf){  for(int i = 0; nodeIdTokens[i] != 0; i++)    if (sscanf(buf, nodeIdTokens[i], &_ownNodeId) == 1)      return true;  return false;}boolLocalConfig::parseHostName(const char * buf){  char tempString[1024];  char tempString2[1024];  int port;  do {    for(int i = 0; hostNameTokens[i] != 0; i++) {      if (sscanf(buf, hostNameTokens[i], tempString, &port) == 2) {	MgmtSrvrId mgmtSrvrId;	mgmtSrvrId.type = MgmId_TCP;	mgmtSrvrId.name.assign(tempString);	mgmtSrvrId.port = port;	ids.push_back(mgmtSrvrId);	return true;      }    }    if (buf == tempString2)      break;    // try to add default port to see if it works    snprintf(tempString2, sizeof(tempString2),"%s:%s", buf, NDB_PORT);    buf= tempString2;  } while(1);  return false;}boolLocalConfig::parseFileName(const char * buf){  char tempString[1024];  for(int i = 0; fileNameTokens[i] != 0; i++) {    if (sscanf(buf, fileNameTokens[i], tempString) == 1) {      MgmtSrvrId mgmtSrvrId;      mgmtSrvrId.type = MgmId_File;      mgmtSrvrId.name.assign(tempString);      ids.push_back(mgmtSrvrId);      return true;    }  }  return false;}boolLocalConfig::parseString(const char * connectString, BaseString &err){  char * for_strtok;  char * copy = strdup(connectString);  NdbAutoPtr<char> tmp_aptr(copy);  for (char *tok = strtok_r(copy,";,",&for_strtok); tok != 0;       tok = strtok_r(NULL, ";,", &for_strtok)) {    if (tok[0] == '#') continue;    if (!_ownNodeId) // only one nodeid definition allowed      if (parseNodeId(tok))	continue;    if (parseHostName(tok))      continue;    if (parseFileName(tok))      continue;        err.assfmt("Unexpected entry: \"%s\"", tok);    return false;  }  return true;}bool LocalConfig::readFile(const char * filename, bool &fopenError){  char line[1024];    fopenError = false;    FILE * file = fopen(filename, "r");  if(file == 0){    BaseString::snprintf(line, sizeof(line),	     "Unable to open local config file: %s", filename);    setError(0, line);    fopenError = true;    return false;  }  BaseString theString;  while(fgets(line, sizeof(line), file)){    BaseString tmp(line);    tmp.trim(" \t\n\r");    if(tmp.length() > 0 && tmp.c_str()[0] != '#'){      theString.append(tmp);      break;    }  }  while (fgets(line, sizeof(line), file)) {    BaseString tmp(line);    tmp.trim(" \t\n\r");    if(tmp.length() > 0 && tmp.c_str()[0] != '#'){      theString.append(";");      theString.append(tmp);    }  }    BaseString err;  bool return_value = parseString(theString.c_str(), err);  if (!return_value) {    BaseString tmp;    tmp.assfmt("Reading %s: %s", filename, err.c_str());    setError(0, tmp.c_str());  }  fclose(file);  return return_value;}boolLocalConfig::readConnectString(const char * connectString,			       const char * info){  BaseString err;  bool return_value = parseString(connectString, err);  if (!return_value) {    BaseString err2;    err2.assfmt("Reading %d \"%s\": %s", info, connectString, err.c_str());    setError(0,err2.c_str());  }  return return_value;}char *LocalConfig::makeConnectString(char *buf, int sz){  int p= BaseString::snprintf(buf,sz,"nodeid=%d", _ownNodeId);  if (p < sz)    for (unsigned i = 0; i < ids.size(); i++)    {      if (ids[i].type != MgmId_TCP)	continue;      int new_p= p+BaseString::snprintf(buf+p,sz-p,",%s:%d",					ids[i].name.c_str(), ids[i].port);      if (new_p < sz)	p= new_p;      else       {	buf[p]= 0;	break;      }    }  buf[sz-1]=0;  return buf;}template class Vector<MgmtSrvrId>;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -