Add database client options to the configuration file
This commit is contained in:
parent
4b8971b258
commit
d3931c73fd
|
@ -26,6 +26,26 @@
|
|||
"key": ""
|
||||
}
|
||||
],*/
|
||||
"db_clients":[
|
||||
{
|
||||
//name:Name of the client,'default' by default
|
||||
//"name":"",
|
||||
//rdbms:server type, "postgreSQL" by default
|
||||
"rdbms": "postgreSQL",
|
||||
//host:server address,localhost by default
|
||||
"host": "127.0.0.1",
|
||||
//port:server port, 5432 by default
|
||||
"port": 5432,
|
||||
//dbname:Database name
|
||||
"dbname": "test",
|
||||
//user:'postgres' by default
|
||||
"user": "",
|
||||
//passwd:'' by default
|
||||
"passwd": "",
|
||||
//connection_number:1 by default
|
||||
"connection_number":1
|
||||
}
|
||||
],
|
||||
"app": {
|
||||
//threads_num:num of threads,1 by default
|
||||
"threads_num": 16,
|
||||
|
|
|
@ -26,6 +26,27 @@
|
|||
"key": ""
|
||||
}
|
||||
],*/
|
||||
/*
|
||||
"db_clients": [
|
||||
{
|
||||
//name:Name of the client,'default' by default
|
||||
//"name":"",
|
||||
//rdbms:server type, "postgreSQL" by default
|
||||
"rdbms": "postgreSQL",
|
||||
//host:server address,localhost by default
|
||||
"host": "127.0.0.1",
|
||||
//port:server port, 5432 by default
|
||||
"port": 5432,
|
||||
//dbname:Database name
|
||||
"dbname": "test",
|
||||
//user:'postgres' by default
|
||||
"user": "",
|
||||
//passwd:'' by default
|
||||
"passwd": "",
|
||||
//connection_number:1 by default
|
||||
"connection_number": 1
|
||||
}
|
||||
],*/
|
||||
"app": {
|
||||
//threads_num:num of threads,1 by default
|
||||
"threads_num": 16,
|
||||
|
@ -89,18 +110,23 @@
|
|||
"use_gzip": true,
|
||||
//static_files_cache_time:5 (seconds) by default,the time in which static file response is cached,
|
||||
//0 means cache forever,the negative value means no cache
|
||||
"static_files_cache_time":5,
|
||||
"static_files_cache_time": 5,
|
||||
//simple_controllers_map:Configuring mapping from path to simple controller
|
||||
"simple_controllers_map": [
|
||||
{
|
||||
"path": "/path/name",
|
||||
"controller": "controllerClassName",
|
||||
"http_methods": ["get","post"],
|
||||
"filters": ["FilterClassName"]
|
||||
"http_methods": [
|
||||
"get",
|
||||
"post"
|
||||
],
|
||||
"filters": [
|
||||
"FilterClassName"
|
||||
]
|
||||
}
|
||||
],
|
||||
//idle_connection_timeout: defaults to 60 seconds, the lifetime
|
||||
//of the connection without read or write
|
||||
"idle_connection_timeout":60
|
||||
"idle_connection_timeout": 60
|
||||
}
|
||||
}
|
||||
}
|
|
@ -15,6 +15,9 @@
|
|||
#pragma once
|
||||
|
||||
#include <drogon/config.h>
|
||||
#if USE_POSTGRESQL
|
||||
#include <drogon/orm/DbClient.h>
|
||||
#endif
|
||||
#include <drogon/utils/Utilities.h>
|
||||
#include <drogon/HttpApiBinder.h>
|
||||
#include <trantor/utils/NonCopyable.h>
|
||||
|
@ -137,6 +140,17 @@ class HttpAppFramework : public trantor::NonCopyable
|
|||
virtual void setStaticFilesCacheTime(int cacheTime) = 0;
|
||||
virtual int staticFilesCacheTime() const = 0;
|
||||
virtual void setIdleConnectionTimeout(size_t timeout) = 0;
|
||||
#if USE_POSTGRESQL
|
||||
virtual orm::DbClientPtr getDbClient(const std::string &name = "default") = 0;
|
||||
virtual void createDbClient(const std::string &dbType,
|
||||
const std::string &host,
|
||||
const u_short port,
|
||||
const std::string &databaseName,
|
||||
const std::string &userName,
|
||||
const std::string &password,
|
||||
const size_t connectionNum = 1,
|
||||
const std::string &name = "default") = 0;
|
||||
#endif
|
||||
|
||||
private:
|
||||
virtual void registerHttpApiController(const std::string &pathPattern,
|
||||
|
|
|
@ -216,6 +216,28 @@ static void loadApp(const Json::Value &app)
|
|||
auto kickOffTimeout = app.get("idle_connection_timeout", 60).asUInt64();
|
||||
HttpAppFramework::instance().setIdleConnectionTimeout(kickOffTimeout);
|
||||
}
|
||||
static void loadDbClients(const Json::Value &dbClients)
|
||||
{
|
||||
if (!dbClients)
|
||||
return;
|
||||
for (auto &client : dbClients)
|
||||
{
|
||||
auto type = client.get("rdbms", "postgreSQL").asString();
|
||||
auto host = client.get("host", "127.0.0.1").asString();
|
||||
auto port = client.get("port", 5432).asUInt();
|
||||
auto dbname = client.get("dbname", "").asString();
|
||||
if (dbname == "")
|
||||
{
|
||||
std::cerr << "Please configure dbname in the configuration file" << std::endl;
|
||||
exit(1);
|
||||
}
|
||||
auto user = client.get("user", "postgres").asString();
|
||||
auto password = client.get("passwd", "").asString();
|
||||
auto connNum = client.get("connection_number", 1).asUInt();
|
||||
auto name = client.get("name", "default").asString();
|
||||
HttpAppFramework::instance().createDbClient(type, host, (u_short)port, dbname, user, password, connNum, name);
|
||||
}
|
||||
}
|
||||
static void loadListeners(const Json::Value &listeners)
|
||||
{
|
||||
if (!listeners)
|
||||
|
@ -246,4 +268,5 @@ void ConfigLoader::load()
|
|||
loadApp(_configJsonRoot["app"]);
|
||||
loadSSL(_configJsonRoot["ssl"]);
|
||||
loadListeners(_configJsonRoot["listeners"]);
|
||||
loadDbClients(_configJsonRoot["db_clients"]);
|
||||
}
|
||||
|
|
|
@ -1215,3 +1215,32 @@ HttpAppFramework &HttpAppFramework::instance()
|
|||
HttpAppFramework::~HttpAppFramework()
|
||||
{
|
||||
}
|
||||
|
||||
#if USE_POSTGRESQL
|
||||
orm::DbClientPtr HttpAppFrameworkImpl::getDbClient(const std::string &name)
|
||||
{
|
||||
return _dbClientsMap[name];
|
||||
}
|
||||
|
||||
void HttpAppFrameworkImpl::createDbClient(const std::string &dbType,
|
||||
const std::string &host,
|
||||
const u_short port,
|
||||
const std::string &databaseName,
|
||||
const std::string &userName,
|
||||
const std::string &password,
|
||||
const size_t connectionNum,
|
||||
const std::string &name)
|
||||
{
|
||||
if (dbType == "postgreSQL")
|
||||
{
|
||||
auto connStr = formattedString("host=%s port=%u dbname=%s user=%s", host.c_str(), port, databaseName.c_str(), userName.c_str());
|
||||
if (!password.empty())
|
||||
{
|
||||
connStr += " password=";
|
||||
connStr += password;
|
||||
}
|
||||
auto client = drogon::orm::DbClient::newPgClient(connStr, connectionNum);
|
||||
_dbClientsMap[name] = client;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -85,7 +85,17 @@ class HttpAppFrameworkImpl : public HttpAppFramework
|
|||
}
|
||||
|
||||
trantor::EventLoop *loop();
|
||||
|
||||
#if USE_POSTGRESQL
|
||||
virtual orm::DbClientPtr getDbClient(const std::string &name = "default") override;
|
||||
virtual void createDbClient(const std::string &dbType,
|
||||
const std::string &host,
|
||||
const u_short port,
|
||||
const std::string &databaseName,
|
||||
const std::string &userName,
|
||||
const std::string &password,
|
||||
const size_t connectionNum = 1,
|
||||
const std::string &name = "default") override;
|
||||
#endif
|
||||
private:
|
||||
virtual void registerHttpApiController(const std::string &pathPattern,
|
||||
const HttpApiBinderBasePtr &binder,
|
||||
|
@ -203,5 +213,9 @@ class HttpAppFrameworkImpl : public HttpAppFramework
|
|||
int _staticFilesCacheTime = 5;
|
||||
std::unordered_map<std::string, std::weak_ptr<HttpResponse>> _staticFilesCache;
|
||||
std::mutex _staticFilesCacheMutex;
|
||||
#if USE_POSTGRESQL
|
||||
std::map<std::string, orm::DbClientPtr> _dbClientsMap;
|
||||
#endif
|
||||
};
|
||||
|
||||
} // namespace drogon
|
||||
|
|
Loading…
Reference in New Issue