/*
*
* ProLinga-Repository
*
* Copyright (C) 2002-2010 Xobas Software.
* All rights reserved.
*
* This file is part of ProLinga-Repository.
*
* ProLinga-Repository 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 3 of the License, or
* (at your option) any later version.
*
* ProLinga-Repository 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 ProLinga-Repository. If not, see .
*
* More information is available at the following addresses:
*
* Website : http://www.prolinga.org
*
* Email : prolinga-list@prolinga.org
*
*
*/
#include "RepCommon.h"
#include "RCRepositoryCommand.hpp"
#include
#include
#include
#include "RepConfig.hpp"
#include "RCDocumentParse.hpp"
#include "RepMain.hpp"
#include
using namespace DbXml;
/* Make sure global handles keep their value */
static DB_ENV *dbenvStaticPtr;
static XmlManager *mgrStaticPtr;
static XmlContainer *contStaticPtr;
static XmlUpdateContext *updateStaticPtr;
static ConfigRepPtr confRepStaticPtr;
/* Global handles */
DB_ENV *dbenvPtr = dbenvStaticPtr;
XmlManager *mgrPtr = mgrStaticPtr;
XmlContainer *contPtr = contStaticPtr;
XmlUpdateContext *updatePtr = updateStaticPtr;
ConfigRepPtr confRepPtr = confRepStaticPtr;
xmlDocPtr RCProcessError(char *errorString)
{
xmlDocPtr docRepositoryResponse;
char *repositoryResponse;
/* Generate generic error */
repositoryResponse = new char[1024];
strcpy(repositoryResponse, "\n\t\n\t\t\n\t\t\t\n\t\t\t\tError\n\t\t\t\tCan not process Repository Command\n\t\t\t\t");
strcat(repositoryResponse, errorString);
strcat(repositoryResponse, "\n\t\t\t\n\t\t\n\t\n");
/* Load response into xml doc */
docRepositoryResponse = xmlParseMemory(repositoryResponse, strlen(repositoryResponse));
/* Clean up */
delete repositoryResponse;
/* Return */
return docRepositoryResponse;
}
PlRepository::PlRepository()
{
/* Init */
isRepositoryOpen = false;
}
PlRepository::~PlRepository()
{
/* free */
}
void PlRepository::repositoryOpen(const char *configFileName)
{
char *confName, *systemPath;
/* Return if already open */
if (isRepositoryOpen == true)
return;
/* Get Config */
if (configFileName == NULL)
confName = (char *)DEF_CONFIG_FILE;
else
confName = (char *)configFileName;
/* Set global config ptr */
confRepPtr = new ConfigRep(confName);
confRepStaticPtr = confRepPtr;
/* Get System Path */
systemPath = confRepPtr->getStringValue("SystemPath", DEF_SYSTEM_PATH);
/* Set global database handles */
//dbenvPtr = new DbEnv(0);
db_env_create(&dbenvPtr,0);
dbenvStaticPtr = dbenvPtr;
/* Set DB environment */
dbenvPtr->open(dbenvPtr,systemPath, DB_INIT_MPOOL|DB_CREATE, 0);
/* Open Manager */
mgrPtr = new XmlManager(dbenvPtr, DBXML_ADOPT_DBENV);
mgrStaticPtr = mgrPtr;
/* Create and open container */
contPtr = new XmlContainer(mgrPtr->openContainer(REP_SYSTEM_NAME));
contStaticPtr = contPtr;
/* Open context */
updatePtr = new XmlUpdateContext(mgrPtr->createUpdateContext());
updateStaticPtr = updatePtr;
/* Set status */
isRepositoryOpen = true;
}
void PlRepository::repositoryClose(void)
{
/* Return if already closed */
if (isRepositoryOpen == false)
return;
/* Close container */
contPtr->sync();
// dbenvPtr->close(0);
// dbenvPtr->close(dbenvPtr,0);
/* Set status */
isRepositoryOpen = false;
/* Free */
// delete updatePtr;
// delete contPtr;
// delete mgrPtr;
// delete dbenvPtr;
delete confRepPtr;
}
xmlDocPtr PlRepository::executeCommand(const xmlDocPtr repositoryRequest)
{
xmlDocPtr repositoryResponse;
/* Return if repository not open or process command */
if (isRepositoryOpen == false)
repositoryResponse = RCProcessError("Repository not opened.");
else
repositoryResponse = RCRepositoryCommand(repositoryRequest);
/* Return */
return repositoryResponse;
}