/* * * 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; }