JetCore/Global.cpp
2024-11-18 16:59:32 -08:00

141 lines
4.9 KiB
C++

#include "Global.h"
#include "Exception.h"
#include "__mysql.h"
#include "Modifiers.h"
#include <iostream>
#include <stdlib.h>
namespace jet {
Global::Global(char **envp) : envp(envp) {
}
Global::~Global() {
}
void Global::dump() {
for (auto i = variables.begin(); i != variables.end(); i++)
std::cout << i->first << "=[" << i->second << "]" << std::endl;
}
bool Global::sessionExists(coreutils::MString sessionId) {
return sessions.find(sessionId) != sessions.end();
}
void Global::addSession(coreutils::MString sessionId, __mysql *mysql) {
std::cout << "sessionId: " << sessionId << std::endl;
if(sessionExists(sessionId))
coreutils::Exception("sessionid already exists.");
sessions[sessionId] = mysql;
std::cout << "::count: " << sessions.size() << std::endl;
std::cout << "::" << sessionId << std::endl;
}
void Global::removeSession(coreutils::MString sessionId) {
sessions.erase(sessionId);
}
coreutils::MString& Global::processModifier(coreutils::MString &value, coreutils::MString &modifier) {
Modifiers modifiers;
if(modifier.getLength() == 0)
return value;
if(modifier == "tobinary")
modifiers.processToBinaryModifier(value, lastConverted);
if(modifier == "frombinary")
modifiers.processFromBinaryModifier(value, lastConverted);
if(modifier == "tohex")
modifiers.processToHexModifier(value, lastConverted);
if(modifier == "fromhex")
modifiers.processFromHexModifier(value, lastConverted);
if(modifier == "tobase64")
modifiers.processToBase64Modifier(value, lastConverted);
if(modifier == "frombase64")
modifiers.processFromBase64Modifier(value, lastConverted);
if(modifier == "toupper")
modifiers.processToUpperModifier(value, lastConverted);
if(modifier == "tolower")
modifiers.processToLowerModifier(value, lastConverted);
if(modifier == "tocgi")
modifiers.processToCGIModifier(value, lastConverted);
if(modifier == "fromcgi")
modifiers.processFromCGIModifier(value, lastConverted);
return lastConverted;
}
coreutils::ZString Global::getVariable(coreutils::ZString &variable, std::map<coreutils::ZString, coreutils::MString> &lvariables) {
if(variable.ifNext("$[")) {
coreutils::MString name;
coreutils::MString modifier;
if(variable.ifNext("!")) {
renderVariableName(variable, name, modifier, lvariables);
return variables[name];
} if(variable.ifNext(":")) {
// TODO: should only allow CGI variable name. Allow variable substitution.
} if(variable.ifNext("@")) {
// TODO: should only allow session variables. Allow substitution.
} if(variable.ifNext("%")) {
renderVariableName(variable, name, modifier, lvariables);
return getenv(name.c_str());
} else {
renderVariableName(variable, name, modifier, lvariables);
name.split(".");
if(name.getList().size() == 1) {
return processModifier(variables[name[0]], modifier);
}
return getSessionVariable(name);
}
throw coreutils::Exception("expected variable name or type designator.");
} if(variable.ifNext("#[")) {
coreutils::MString name;
coreutils::MString modifier;
renderVariableName(variable, name, modifier, lvariables);
return lvariables[name];
}
throw coreutils::Exception("Expecting a variable initializer ('$[' or '#[').");
}
void Global::renderVariableName(coreutils::ZString &variable, coreutils::MString &name, coreutils::MString &modifier, std::map<coreutils::ZString, coreutils::MString> &lvariables) {
while(!variable.ifNext("]")) {
name << variable.getTokenInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-");
if(variable.ifNext(";")) {
renderVariableName(variable, modifier, modifier, lvariables);
return;
}
else if(variable.startsWith("$[") || variable.startsWith("#["))
name << getVariable(variable, lvariables);
else if(variable.ifNext("]"))
return;
else if(!variable.ifNextInclude("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._-"))
throw coreutils::Exception("invalid variable name.");
}
return;
}
__mysql * Global::getSession(coreutils::MString sessionId) {
if(sessions.find(sessionId) == sessions.end())
throw coreutils::Exception("requested session is not available.");
return sessions[sessionId];
}
coreutils::ZString Global::getSessionVariable(coreutils::MString &splitName) {
if(sessions.find(splitName[0]) == sessions.end())
throw coreutils::Exception("requested session is not available in variable.");
return sessions[splitName[0]]->getColumnValue(splitName[1]);
}
void Global::outputHeaders() {
if(headers.size() > 0) {
for(auto header = headers.begin();
header != headers.end();
++header) {
std::cout << header->first << ": " << header->second << std::endl;
}
std::cout << std::endl;
}
}
}