8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-02-01 20:00:38 +01:00
firebird-mirror/src/common/config/config_file.cpp

244 lines
5.8 KiB
C++
Raw Normal View History

2002-11-03 17:26:12 +01:00
/*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* You may obtain a copy of the Licence at
* http://www.gnu.org/licences/lgpl.html
*
* As a special exception this file can also be included in modules
* with other source code as long as that source code has been
* released under an Open Source Initiative certificed licence.
* More information about OSI certification can be found at:
* http://www.opensource.org
*
* This module 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 Lesser General Public Licence for more details.
*
* This module was created by members of the firebird development
* team. All individual contributions remain the Copyright (C) of
* those individuals and all rights are reserved. Contributors to
* this file are either listed below or can be obtained from a CVS
* history command.
2002-11-03 17:26:12 +01:00
*
* Created by: Mark O'Donohue <skywalker@users.sourceforge.net>
2002-11-03 17:26:12 +01:00
*
* Contributor(s):
2002-11-03 17:26:12 +01:00
*/
#include "firebird.h"
#include "../../common/classes/alloc.h"
2004-03-14 14:14:58 +01:00
#include "../../common/classes/auto.h"
2002-11-03 17:26:12 +01:00
#include "../../common/config/config_file.h"
#include "../jrd/os/fbsyslog.h"
2004-04-29 00:00:03 +02:00
#include <stdio.h>
2002-11-03 17:26:12 +01:00
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
2004-03-14 14:14:58 +01:00
//#include <fstream>
//#include <iostream>
2002-11-03 17:26:12 +01:00
// Invalid or missing CONF_FILE may lead to severe errors
// in applications. That's why for regular SERVER builds
// it's better to exit with appropriate diags rather continue
// with missing / wrong configuration.
2003-05-22 08:39:54 +02:00
#if (! defined(BOOT_BUILD)) && (! defined(EMBEDDED)) && (! defined(SUPERCLIENT))
#define EXIT_ON_NO_CONF
2003-05-22 08:39:54 +02:00
#define INFORM_ON_NO_CONF
#else
2003-07-08 13:49:02 +02:00
#undef EXIT_ON_NO_CONF
2003-05-22 08:39:54 +02:00
#undef INFORM_ON_NO_CONF
#endif
2004-02-08 18:08:34 +01:00
// config_file works with OS case-sensitivity
typedef Firebird::PathName string;
2002-11-03 17:26:12 +01:00
/******************************************************************************
*
* Strip any comments
*/
void ConfigFile::stripComments(string& s)
{
// Note that this is only a hack. It won't work in case inputLine
// contains hash-marks embedded in quotes! Not that I know if we
// should care about that case.
const string::size_type commentPos = s.find('#');
if (commentPos != string::npos)
{
s = s.substr(0, commentPos);
}
}
/******************************************************************************
*
* Check whether the given key exists or not
*/
bool ConfigFile::doesKeyExist(const string& key)
{
checkLoadConfig();
string data = getString(key);
return !data.empty();
}
/******************************************************************************
*
* Return string value corresponding the given key
*/
string ConfigFile::getString(const string& key)
{
checkLoadConfig();
2004-03-14 14:14:58 +01:00
int pos;
return parameters.find(key, pos) ? parameters[pos].second : string();
2002-11-03 17:26:12 +01:00
}
/******************************************************************************
*
* Parse key
*/
string ConfigFile::parseKeyFrom(const string& inputLine, string::size_type& endPos)
{
2004-03-14 14:14:58 +01:00
endPos = inputLine.find_first_of("=");
2002-11-03 17:26:12 +01:00
if (endPos == string::npos)
{
return inputLine;
}
return inputLine.substr(0, endPos);
}
/******************************************************************************
*
* Parse value
*/
string ConfigFile::parseValueFrom(string inputLine, string::size_type initialPos)
{
if (initialPos == string::npos)
{
return string();
}
// skip leading white spaces
unsigned int startPos = inputLine.find_first_not_of("= \t", initialPos);
if (startPos == string::npos)
{
return string();
}
2004-03-14 14:14:58 +01:00
inputLine.rtrim(" \t\r");
2002-11-03 17:26:12 +01:00
return inputLine.substr(startPos);
}
/******************************************************************************
*
* Load file, if necessary
*/
void ConfigFile::checkLoadConfig()
{
if (!isLoadedFlg)
{
loadConfig();
}
}
/******************************************************************************
*
* Load file immediately
*/
2004-03-14 14:14:58 +01:00
namespace {
class FileClose
{
public:
2004-04-29 00:00:03 +02:00
static void clear(FILE *f)
2004-03-14 14:14:58 +01:00
{
if (f) {
2004-04-29 00:00:03 +02:00
fclose(f);
2004-03-14 14:14:58 +01:00
}
}
};
} // namespace
2004-03-14 14:14:58 +01:00
2002-11-03 17:26:12 +01:00
void ConfigFile::loadConfig()
{
isLoadedFlg = true;
parameters.clear();
2004-04-29 00:00:03 +02:00
Firebird::AutoPtr<FILE, FileClose> ifile(fopen(configFile.c_str(), "rt"));
#ifdef EXIT_ON_NO_CONF
int BadLinesCount = 0;
#endif
2004-02-08 18:08:34 +01:00
if (!ifile)
2002-11-03 17:26:12 +01:00
{
// config file does not exist
#ifdef EXIT_ON_NO_CONF
if (fExitOnError)
{
Firebird::string Msg = "Missing configuration file: " +
configFile.ToString() + ", exiting";
Firebird::Syslog::Record(fExitOnError ?
Firebird::Syslog::Error :
Firebird::Syslog::Warning, Msg);
exit(1);
}
#endif //EXIT_ON_NO_CONF
return;
2002-11-03 17:26:12 +01:00
}
string inputLine;
2004-02-08 18:08:34 +01:00
while (!feof(ifile))
2002-11-03 17:26:12 +01:00
{
2004-02-08 18:08:34 +01:00
inputLine.LoadFromFile(ifile);
2002-11-03 17:26:12 +01:00
stripComments(inputLine);
2004-03-14 14:14:58 +01:00
inputLine.ltrim(" \t\r");
2002-11-03 17:26:12 +01:00
if (!inputLine.size())
{
continue; // comment-line or empty line
}
if (inputLine.find('=') == string::npos)
{
2004-02-08 18:08:34 +01:00
Firebird::string Msg = (configFile + ": illegal line \"" +
inputLine + "\"").ToString();
Firebird::Syslog::Record(fExitOnError ?
Firebird::Syslog::Error :
Firebird::Syslog::Warning, Msg);
#ifdef EXIT_ON_NO_CONF
BadLinesCount++;
#endif
2002-11-03 17:26:12 +01:00
continue;
}
string::size_type endPos;
string key = parseKeyFrom(inputLine, endPos);
2004-03-14 14:14:58 +01:00
key.rtrim(" \t\r");
// TODO: here we must check for correct parameter spelling !
2002-11-03 17:26:12 +01:00
string value = parseValueFrom(inputLine, endPos);
2004-03-14 14:14:58 +01:00
parameters.add(Parameter(getPool(), key, value));
2002-11-03 17:26:12 +01:00
}
#ifdef EXIT_ON_NO_CONF
if (BadLinesCount && fExitOnError) {
exit(1);
}
#endif
2002-11-03 17:26:12 +01:00
}