allow a request to be processed in a job

Now we allow a request to be passed into a job queue,
and after the job finishes the request is passed into
a controller again. In order to achieve this we have
a requests queue in System, when we put a request
to the job this Request structure is preserved in the
queue and for a new request a new Request is added to
the queue.

while here:
- remove App::Lock()/Unlock(), use scoped locking
- fix: Plugin now has a Call method which takes ModelConnector
  and a logger (used in multithreaded environment)
- BaseThread has a main_model_connector pointer
  to the main (from the main thread) model connector
- the FastCGI structure fcgi_request moved from App to Request
- some methods for handling requests moved from App to Request
- small refactoring in main.cpp
- add Http class (a http client)
This commit is contained in:
2022-07-25 14:21:21 +02:00
parent b2d92b85a0
commit 979ef907fe
65 changed files with 7018 additions and 4437 deletions

View File

@@ -5,7 +5,7 @@
*/
/*
* Copyright (c) 2008-2018, Tomasz Sowa
* Copyright (c) 2008-2022, Tomasz Sowa
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -48,47 +48,6 @@ namespace Winix
{
/*
*
* PluginInfo
*
*
*/
void PluginInfo::set_dependency_for(WinixBase * winix_base)
{
plugin->SetDependencyFor(winix_base);
}
void PluginInfo::set_dependency_for(WinixBase & winix_base)
{
set_dependency_for(&winix_base);
}
void PluginInfo::set_dependency_for(WinixModelDeprecated * winix_model)
{
plugin->SetDependencyFor(winix_model);
//model_connector = winix_model->get_model_connector();
// CHECKME what about model_connector here?
}
void PluginInfo::set_dependency_for(WinixModelDeprecated & winix_model)
{
set_dependency_for(&winix_model);
}
/*
*
* Plugin
*
*
*/
void Plugin::UnloadPlugins()
{
size_t i;
@@ -113,6 +72,8 @@ Plugin::Plugin()
templates = nullptr;
session_manager = nullptr;
winix_request = nullptr;
plugin = this;
}
@@ -127,17 +88,6 @@ void Plugin::SetDb(Db * pdb)
db = pdb;
}
//void Plugin::SetConfig(Config * pconfig)
//{
// config = pconfig;
//}
void Plugin::SetCur(Cur * pcur)
{
cur = pcur;
}
void Plugin::SetSystem(System * psystem)
{
@@ -145,6 +95,12 @@ void Plugin::SetSystem(System * psystem)
}
void Plugin::SetCur(Cur * cur)
{
this->cur = cur;
}
void Plugin::SetFunctions(Functions * pfunctions)
{
functions = pfunctions;
@@ -157,12 +113,6 @@ void Plugin::SetTemplates(Templates * ptemplates)
}
//void Plugin::SetSynchro(Synchro * psynchro)
//{
// synchro = psynchro;
//}
void Plugin::SetSessionManager(SessionManager * psession_manager)
{
session_manager = psession_manager;
@@ -192,10 +142,10 @@ void Plugin::Unlock()
bool Plugin::SetDependency(PluginInfo & info)
bool Plugin::SetDependencyForPluginInfo(morm::ModelConnector * pmodel_connector, Log * plog, Cur * pcur, PluginInfo & info)
{
// for safety we call a plugin function only when all our pointers are not null
bool res = (db && config && cur && system && functions && templates && synchro && session_manager && winix_request);
bool res = (pmodel_connector && plog && pcur && db && config && system && functions && templates && synchro && session_manager && winix_request);
if( !res )
{
@@ -204,39 +154,22 @@ bool Plugin::SetDependency(PluginInfo & info)
info.db = db;
info.config = config;
info.cur = cur;
info.cur = pcur;
info.system = system;
info.functions = functions;
info.templates = templates;
info.synchro = synchro;
info.session_manager = session_manager;
info.plugin = this;
info.model_connector = pmodel_connector;;
/*
* FIXME
* if we call a message from a different thread then a different model connector is needed
* (each thread should have its own model connector)
*
*/
info.model_connector = system->get_model_connector();
info.log.set_log_buffer(plog->get_log_buffer());
info.log.set_file_log(plog->get_file_log());
info.log.SetDependency(&log);
return res;
return res;
}
void Plugin::SetDependencyFor(WinixBase * winix_base)
{
winix_base->set_dependency(winix_request);
}
void Plugin::SetDependencyFor(WinixModelDeprecated * winix_model)
{
winix_model->set_dependency(winix_request);
}
void Plugin::LoadPlugins(const std::wstring & plugins_dir, const std::vector<std::wstring> & plugins)
{
@@ -304,7 +237,7 @@ void * plugin_handle;
int old_current_plugin;
PluginInfo info;
if( !SetDependency(info) )
if( !SetDependencyForPluginInfo(model_connector, &log, cur, info) )
return;
if( !(plugin_handle = LoadInitFun(filename, fun_init)) )
@@ -315,6 +248,10 @@ PluginInfo info;
current_plugin = (int)plugins.size();
info.plugin_id = current_plugin;
/*
* WARNING:
* all pointers from Cur are null pointers here
*/
fun_init(info);
PluginsItem item;
@@ -362,19 +299,18 @@ bool Plugin::HasMessage(int message)
}
void Plugin::Call(Session * ses, int message, Slots::iterator & slot, PluginInfo & info)
void Plugin::Call(morm::ModelConnector * model_connector, Log * plog, Cur * cur, int message, Slots::iterator & slot, PluginInfo & info)
{
if( !SetDependency(info) )
if( !SetDependencyForPluginInfo(model_connector, plog, cur, info) )
return;
current_plugin = slot->second.index;
info.plugin_id = current_plugin;
info.session = ses;
if( current_plugin != -1 && ses )
info.plugin_data_base = ses->plugin_data.Get(current_plugin);
if( current_plugin != -1 && cur->session && !cur->session->is_temporary_session() )
info.plugin_data_base = cur->session->plugin_data.Get(current_plugin);
else
info.plugin_data_base = 0;
info.plugin_data_base = nullptr;
if( !slot->second.is_running )
{
@@ -411,136 +347,104 @@ void Plugin::Call(Session * ses, int message, Slots::iterator & slot, PluginInfo
PluginRes Plugin::Call(Session * ses, int message, void * p1_, void * p2_, long l1_, long l2_)
PluginRes Plugin::Call(morm::ModelConnector * model_connector, Log * plog, Cur * cur, int message, void * p1, void * p2, long l1, long l2)
{
PluginRes res;
int old_current_plugin = current_plugin;
PluginInfo info;
PluginRes res;
int old_current_plugin = current_plugin;
PluginInfo info;
Cur local_cur;
if( !cur )
cur = &local_cur;
Slots::iterator i = slots.lower_bound(message);
for( ; i!=slots.end() && i->first==message ; ++i )
{
info.Clear();
info.p1 = p1_;
info.p2 = p2_;
info.l1 = l1_;
info.l2 = l2_;
info.p1 = p1;
info.p2 = p2;
info.l1 = l1;
info.l2 = l2;
Call(ses, message, i, info);
Call(model_connector, plog, cur, message, i, info);
if( info.res )
++res.res_true;
else
++res.res_false;
}
current_plugin = old_current_plugin;
return res;
return res;
}
PluginRes Plugin::Call(morm::ModelConnector * model_connector, Log * plog, Session * session, Request * request, Mount * mount, int message, void * p1, void * p2, long l1, long l2)
{
Cur local_cur;
local_cur.session = session;
local_cur.request = request;
local_cur.mount = mount;
return Call(model_connector, plog, &local_cur, message, p1, p2, l1, l2);
}
PluginRes Plugin::Call(int message)
{
return Call(cur->session, message, 0, 0, 0, 0);
return Call(model_connector, &log, cur, message, 0, 0, 0, 0);
}
PluginRes Plugin::Call(int message, void * p1_)
{
return Call(cur->session, message, p1_, 0, 0, 0);
return Call(model_connector, &log, cur, message, p1_, 0, 0, 0);
}
PluginRes Plugin::Call(int message, void * p1_, void * p2_)
{
return Call(cur->session, message, p1_, p2_, 0, 0);
return Call(model_connector, &log, cur, message, p1_, p2_, 0, 0);
}
PluginRes Plugin::Call(int message, long l1_)
{
return Call(cur->session, message, 0, 0, l1_, 0);
return Call(model_connector, &log, cur, message, 0, 0, l1_, 0);
}
PluginRes Plugin::Call(int message, long l1_, long l2_)
{
return Call(cur->session, message, 0, 0, l1_, l2_);
return Call(model_connector, &log, cur, message, 0, 0, l1_, l2_);
}
PluginRes Plugin::Call(int message, void * p1_, long l1_)
{
return Call(cur->session, message, p1_, 0, l1_, 0);
return Call(model_connector, &log, cur, message, p1_, 0, l1_, 0);
}
PluginRes Plugin::Call(int message, void * p1_, long l1_, long l2_)
{
return Call(cur->session, message, p1_, 0, l1_, l2_);
return Call(model_connector, &log, cur, message, p1_, 0, l1_, l2_);
}
PluginRes Plugin::Call(int message, void * p1_, void * p2_, long l1_)
{
return Call(cur->session, message, p1_, p2_, l1_, 0);
return Call(model_connector, &log, cur, message, p1_, p2_, l1_, 0);
}
PluginRes Plugin::Call(Session * ses, int message)
{
return Call(ses, message, 0, 0, 0, 0);
}
PluginRes Plugin::Call(Session * ses, int message, void * p1_)
{
return Call(ses, message, p1_, 0, 0, 0);
}
PluginRes Plugin::Call(Session * ses, int message, void * p1_, void * p2_)
{
return Call(ses, message, p1_, p2_, 0, 0);
}
PluginRes Plugin::Call(Session * ses, int message, long l1_)
{
return Call(ses, message, 0, 0, l1_, 0);
}
PluginRes Plugin::Call(Session * ses, int message, long l1_, long l2_)
{
return Call(ses, message, 0, 0, l1_, l2_);
}
PluginRes Plugin::Call(Session * ses, int message, void * p1_, long l1_)
{
return Call(ses, message, p1_, 0, l1_, 0);
}
PluginRes Plugin::Call(Session * ses, int message, void * p1_, long l1_, long l2_)
{
return Call(ses, message, p1_, 0, l1_, l2_);
}
PluginRes Plugin::Call(Session * ses, int message, void * p1_, void * p2_, long l1_)
{
return Call(ses, message, p1_, p2_, l1_, 0);
}
size_t Plugin::Size()
{
return plugins.size();