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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user