Files
SLikeNet/DependentExtensions/Lobby2/PGSQL/Lobby2Server_PGSQL.cpp
2025-11-24 14:19:51 +05:30

120 lines
3.6 KiB
C++

/*
* Original work: Copyright (c) 2014, Oculus VR, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* RakNet License.txt file in the licenses directory of this source tree. An additional grant
* of patent rights can be found in the RakNet Patents.txt file in the same directory.
*
*
* Modified work: Copyright (c) 2017, SLikeSoft UG (haftungsbeschränkt)
*
* This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style
* license found in the license.txt file in the root directory of this source tree.
*/
#include "Lobby2Server_PGSQL.h"
#include "PostgreSQLInterface.h"
using namespace SLNet;
STATIC_FACTORY_DEFINITIONS(Lobby2Server_PGSQL,Lobby2Server_PGSQL);
Lobby2ServerCommand Lobby2ServerWorkerThread(Lobby2ServerCommand input, bool *returnOutput, void* perThreadData)
{
PostgreSQLInterface *postgreSQLInterface = (PostgreSQLInterface *) perThreadData;
input.returnToSender = input.lobby2Message->ServerDBImpl(&input, postgreSQLInterface);
*returnOutput=input.returnToSender;
if (input.deallocMsgWhenDone && input.returnToSender==false)
SLNet::OP_DELETE(input.lobby2Message, _FILE_AND_LINE_);
return input;
}
Lobby2Server_PGSQL::Lobby2Server_PGSQL()
{
}
Lobby2Server_PGSQL::~Lobby2Server_PGSQL()
{
Clear();
}
void Lobby2Server_PGSQL::AddInputFromThread(Lobby2Message *msg, unsigned int targetUserId, SLNet::RakString targetUserHandle)
{
Lobby2ServerCommand command;
command.lobby2Message=msg;
command.deallocMsgWhenDone=true;
command.returnToSender=true;
command.callerUserId=targetUserId;
command.callingUserName=targetUserHandle;
command.server=this;
AddInputCommand(command);
}
void Lobby2Server_PGSQL::AddInputCommand(Lobby2ServerCommand command)
{
threadPool.AddInput(Lobby2ServerWorkerThread, command);
}
void Lobby2Server_PGSQL::AddOutputFromThread(Lobby2Message *msg, unsigned int targetUserId, SLNet::RakString targetUserHandle)
{
Lobby2ServerCommand command;
command.lobby2Message=msg;
command.deallocMsgWhenDone=true;
command.returnToSender=true;
command.callerUserId=targetUserId;
command.callingUserName=targetUserHandle;
command.server=this;
msg->resultCode=L2RC_SUCCESS;
threadPool.AddOutput(command);
}
bool Lobby2Server_PGSQL::ConnectToDB(const char *conninfo, int numWorkerThreads)
{
if (numWorkerThreads<=0)
return false;
StopThreads();
int i;
PostgreSQLInterface *connection;
for (i=0; i < numWorkerThreads; i++)
{
connection = SLNet::OP_NEW<PostgreSQLInterface>( _FILE_AND_LINE_ );
if (connection->Connect(conninfo)==false)
{
SLNet::OP_DELETE(connection, _FILE_AND_LINE_);
ClearConnections();
return false;
}
connectionPoolMutex.Lock();
connectionPool.Insert(connection, _FILE_AND_LINE_ );
connectionPoolMutex.Unlock();
}
threadPool.SetThreadDataInterface(this,0);
threadPool.StartThreads(numWorkerThreads,0,0,0);
return true;
}
void* Lobby2Server_PGSQL::PerThreadFactory(void *context)
{
(void)context;
PostgreSQLInterface* p;
connectionPoolMutex.Lock();
p=connectionPool.Pop();
connectionPoolMutex.Unlock();
return p;
}
void Lobby2Server_PGSQL::PerThreadDestructor(void* factoryResult, void *context)
{
(void)context;
PostgreSQLInterface* p = (PostgreSQLInterface*)factoryResult;
SLNet::OP_DELETE(p, _FILE_AND_LINE_);
}
void Lobby2Server_PGSQL::ClearConnections(void)
{
unsigned int i;
connectionPoolMutex.Lock();
for (i=0; i < connectionPool.Size(); i++)
SLNet::OP_DELETE(connectionPool[i], _FILE_AND_LINE_);
connectionPool.Clear(false, _FILE_AND_LINE_);
connectionPoolMutex.Unlock();
}