blob: 7d514d336ae877ea9f1bdf1957e6761792857a0c [file] [log] [blame]
/*********************************************************************
* Copyright (c) 2017 fortiss GmbH
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
**********************************************************************/
#include <extevhan.h>
#include <commfb.h>
#include <string.h>
#include "../../arch/devlog.h"
#include <xqueryClientLayer.h>
#include "xqueryHandler.h"
extern "C" {
#include <basexdbc.h>
}
using namespace forte::com_infra;
const char *CXqueryClientLayer::scmParameterSeperator = " ;:";
CXqueryClientLayer::CXqueryClientLayer(CComLayer* pa_poUpperLayer, CBaseCommFB* pa_poComFB) : CComLayer(pa_poUpperLayer, pa_poComFB){
sfd = -1;
command = NULL;
host = NULL;
port = NULL;
usr = NULL;
psw = NULL;
dbName = NULL;
}
CXqueryClientLayer::~CXqueryClientLayer() {
}
bool CXqueryClientLayer::parseParameters(char *pa_acLayerParameter){
bool retVal = true;
host = strtok(pa_acLayerParameter, scmParameterSeperator);
port = strtok(NULL, scmParameterSeperator);
dbName = strtok(NULL, scmParameterSeperator);
usr = strtok(NULL, scmParameterSeperator);
psw = strtok(NULL, scmParameterSeperator);
if(NULL == host || NULL == port || NULL == usr || NULL == psw || NULL == dbName){
retVal = false;
}
return retVal;
}
forte::com_infra::EComResponse CXqueryClientLayer::openConnection(char *pa_acLayerParameter){
EComResponse retVal = e_InitTerminated;
if(e_Client == m_poFb->getComServiceType() && m_poFb->getNumRD() == 1 && m_poFb->getNumSD() == 1 && parseParameters(pa_acLayerParameter)){
sfd = basex_connect(host, port);
if (sfd == -1) {
DEVLOG_ERROR("Can not connect to BaseX server.\n");
}else{
int rc = basex_authenticate(sfd, usr, psw);
if (rc == -1) {
DEVLOG_ERROR("Access to DB denied.\n");
}else{
m_poFb->QO() = true;
DEVLOG_INFO("Connected to DB.\n");
openDB();
retVal = e_InitOk;
}
}
}else{
DEVLOG_ERROR("[xquery] supports only CLIENT_1 with ID = xquery[IP:port; dbName; usr; psw]\n");
}
return retVal;
}
void CXqueryClientLayer::openDB(){
char *r = NULL;
char *i = NULL;
command = new char[strlen(dbName) + 6];
strcpy(command, "open ");
strcat(command, dbName);
int ret = basex_execute(sfd, command, &r, &i);
if(ret == -1){ // general (i/o or the like) error
DEVLOG_ERROR("An error occured during opening of DB'.\n");
free(r);
free(i);
}
if(ret == 1){ // database error while processing command
DEVLOG_ERROR("Processing of '%s' failed.\n", command);
}else{
DEVLOG_INFO("DB %s opend.\n", dbName);
}
}
void CXqueryClientLayer::closeConnection(){
if (sfd > -1) {
basex_close(sfd);
DEVLOG_INFO("Disonnected from DB.\n");
}
}
forte::com_infra::EComResponse CXqueryClientLayer::sendData(void *pa_pvData, unsigned int pa_unSize){
EComResponse retVal = e_ProcessDataOk;
if(0 == pa_unSize){
retVal = e_ProcessDataInvalidObject;
}else{
CIEC_ANY const *SDs(static_cast<TConstIEC_ANYPtr>(pa_pvData));
if(SDs[0].getDataTypeID() == CIEC_ANY::e_STRING){
command = ((CIEC_STRING &)SDs[0]).getValue();
getExtEvHandler<CXqueryHandler>().registerLayer(this);
}else{
retVal = e_ProcessDataInvalidObject;
}
}
return retVal;
}
forte::com_infra::EComResponse CXqueryClientLayer::recvData(const void *pa_pvData, unsigned int pa_unSize){
EComResponse retVal = e_Nothing;
if(pa_unSize > 0) {
m_poFb->getRDs()[0].fromString(static_cast<const char *>(pa_pvData));
m_poFb->interruptCommFB(this);
retVal = e_ProcessDataOk;
}
return retVal;
}
forte::com_infra::EComResponse CXqueryClientLayer::processInterrupt(){
return e_ProcessDataOk;
}