2010-09-11 19:44:37 -07:00
|
|
|
/* -*-mode: C; fill-column: 78; c-basic-offset: 4; -*- */
|
|
|
|
|
|
|
|
/*
|
2012-01-04 18:14:12 -08:00
|
|
|
* Copyright 2010 - 2012 by Eric House (xwords@eehouse.org). All rights
|
|
|
|
* reserved.
|
2010-09-11 19:44:37 -07:00
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _DBMGR_H_
|
|
|
|
#define _DBMGR_H_
|
|
|
|
|
2010-09-21 06:27:31 -07:00
|
|
|
#include <string>
|
2013-08-15 07:24:30 -07:00
|
|
|
#include <set>
|
2010-09-21 06:27:31 -07:00
|
|
|
|
2013-09-24 08:36:21 -07:00
|
|
|
#include <libpq-fe.h>
|
|
|
|
|
2013-09-14 21:39:18 -07:00
|
|
|
#include "strwpf.h"
|
2010-09-11 19:44:37 -07:00
|
|
|
#include "xwrelay.h"
|
2010-09-23 05:33:27 -07:00
|
|
|
#include "xwrelay_priv.h"
|
2012-11-03 10:58:01 -07:00
|
|
|
#include "devid.h"
|
2013-09-14 21:06:14 -07:00
|
|
|
#include "strwpf.h"
|
2014-04-25 18:45:51 -07:00
|
|
|
#include "querybld.h"
|
2010-09-11 19:44:37 -07:00
|
|
|
|
2010-09-21 06:27:31 -07:00
|
|
|
using namespace std;
|
|
|
|
|
2010-09-11 19:44:37 -07:00
|
|
|
class DBMgr {
|
|
|
|
public:
|
2012-11-03 10:58:01 -07:00
|
|
|
/* DevIDs on various platforms are stored in devices table. This is the
|
|
|
|
key, and used in msgs and games tables as a shorter way to refer to
|
|
|
|
them. */
|
|
|
|
static const DevIDRelay DEVID_NONE = 0;
|
|
|
|
|
2013-07-25 06:37:53 -07:00
|
|
|
class MsgInfo {
|
|
|
|
public:
|
2013-08-29 06:37:22 -07:00
|
|
|
MsgInfo( int id, AddrInfo::ClientToken tok, bool hc ) {
|
|
|
|
m_msgID = id; m_token = tok; m_hasConnname = hc;
|
2013-07-25 06:37:53 -07:00
|
|
|
}
|
2013-08-29 06:37:22 -07:00
|
|
|
bool hasConnname() const { return m_hasConnname; }
|
|
|
|
AddrInfo::ClientToken token() const { return m_token; }
|
|
|
|
int msgID() const { return m_msgID; }
|
|
|
|
|
2013-08-28 20:33:42 -07:00
|
|
|
vector<uint8_t> msg;
|
2013-08-29 06:37:22 -07:00
|
|
|
private:
|
|
|
|
bool m_hasConnname;
|
|
|
|
AddrInfo::ClientToken m_token;
|
|
|
|
int m_msgID;
|
2013-07-25 06:37:53 -07:00
|
|
|
};
|
|
|
|
|
2010-09-12 04:49:03 -07:00
|
|
|
static DBMgr* Get();
|
|
|
|
|
2010-09-11 19:44:37 -07:00
|
|
|
~DBMgr();
|
|
|
|
|
2015-07-11 07:03:22 -07:00
|
|
|
void WaitDBConn( void );
|
|
|
|
|
2010-09-15 01:14:28 -07:00
|
|
|
void ClearCIDs( void );
|
|
|
|
|
2010-09-11 19:44:37 -07:00
|
|
|
void AddNew( const char* cookie, const char* connName, CookieID cid,
|
2010-09-14 21:20:11 -07:00
|
|
|
int langCode, int nPlayersT, bool isPublic );
|
2010-09-11 19:44:37 -07:00
|
|
|
|
2013-02-04 06:08:39 -08:00
|
|
|
bool FindPlayer( DevIDRelay relayID, AddrInfo::ClientToken,
|
|
|
|
string& connName, HostID* hid, unsigned short* seed );
|
2013-09-14 21:06:14 -07:00
|
|
|
bool FindRelayIDFor( const char* connName, HostID hid, unsigned short seed,
|
|
|
|
const DevID* host, DevIDRelay* devID );
|
2013-02-04 06:08:39 -08:00
|
|
|
|
2017-11-12 20:25:29 -08:00
|
|
|
CookieID FindGame( const char* connName, HostID hid, char* cookieBuf, int bufLen,
|
2010-11-11 06:40:50 -08:00
|
|
|
int* langP, int* nPlayersTP, int* nPlayersHP,
|
|
|
|
bool* isDead );
|
2017-11-12 20:25:29 -08:00
|
|
|
CookieID FindGame( const AddrInfo::ClientToken clientToken, HostID hid,
|
|
|
|
char* connNameBuf, int connNameBufLen,
|
|
|
|
char* cookieBuf, int cookieBufLen,
|
|
|
|
int* langP, int* nPlayersTP, int* nPlayersHP );
|
2011-06-20 18:13:15 -07:00
|
|
|
|
2013-06-26 00:38:34 -07:00
|
|
|
bool FindGameFor( const char* connName, char* cookieBuf, int bufLen,
|
|
|
|
unsigned short seed, HostID hid,
|
|
|
|
int nPlayersH, int nPlayersS,
|
|
|
|
int* langP, bool* isDead, CookieID* cidp );
|
|
|
|
|
2011-06-20 18:13:15 -07:00
|
|
|
bool SeenSeed( const char* cookie, unsigned short seed,
|
|
|
|
int langCode, int nPlayersT, bool wantsPublic,
|
|
|
|
char* connNameBuf, int bufLen, int* nPlayersHP,
|
|
|
|
CookieID* cid );
|
|
|
|
|
2010-09-12 04:49:03 -07:00
|
|
|
CookieID FindOpen( const char* cookie, int lang, int nPlayersT,
|
2010-09-15 14:05:51 -07:00
|
|
|
int nPlayersH, bool wantsPublic,
|
2010-09-16 18:59:56 -07:00
|
|
|
char* connNameBuf, int bufLen, int* nPlayersHP );
|
2011-06-20 18:13:15 -07:00
|
|
|
bool AllDevsAckd( const char* const connName );
|
2010-09-12 04:49:03 -07:00
|
|
|
|
2013-02-04 06:08:39 -08:00
|
|
|
DevIDRelay RegisterDevice( const DevID* host );
|
2013-08-20 08:09:45 -07:00
|
|
|
DevIDRelay RegisterDevice( const DevID* host, int clientVersion,
|
2013-09-07 16:17:07 -07:00
|
|
|
const char* const desc, const char* const model,
|
2019-03-07 18:12:26 -08:00
|
|
|
const char* const osVers,
|
|
|
|
unsigned short variantCode );
|
2013-09-14 21:06:14 -07:00
|
|
|
void ReregisterDevice( DevIDRelay relayID, const DevID* host,
|
|
|
|
const char* const desc, int clientVersion,
|
2019-01-25 17:44:46 -08:00
|
|
|
const char* const model, const char* const osVers,
|
2019-03-07 18:12:26 -08:00
|
|
|
unsigned short variantCode );
|
2013-09-14 21:06:14 -07:00
|
|
|
bool UpdateDevice( DevIDRelay relayID, const char* const desc,
|
|
|
|
int clientVersion, const char* const model,
|
2019-03-07 18:12:26 -08:00
|
|
|
const char* const osVers, unsigned short variantCode,
|
2019-01-25 17:44:46 -08:00
|
|
|
bool check );
|
2012-11-03 10:58:01 -07:00
|
|
|
|
2013-09-14 21:06:14 -07:00
|
|
|
HostID AddToGame( const char* const connName, HostID curID, int clientVersion,
|
2013-01-12 16:09:24 -08:00
|
|
|
int nToAdd, unsigned short seed, const AddrInfo* addr,
|
2012-11-03 10:58:01 -07:00
|
|
|
DevIDRelay devID, bool unAckd );
|
2011-06-20 18:13:15 -07:00
|
|
|
void NoteAckd( const char* const connName, HostID id );
|
2011-07-05 21:39:38 -07:00
|
|
|
HostID HIDForSeed( const char* const connName, unsigned short seed );
|
2011-06-20 18:13:15 -07:00
|
|
|
bool RmDeviceByHid( const char* const connName, HostID id );
|
|
|
|
void RmDeviceBySeed( const char* const connName, unsigned short seed );
|
2010-11-11 06:40:50 -08:00
|
|
|
bool HaveDevice( const char* const connName, HostID id, int seed );
|
2011-06-23 07:12:50 -07:00
|
|
|
bool AddCID( const char* const connName, CookieID cid );
|
2010-09-16 04:47:17 -07:00
|
|
|
void ClearCID( const char* connName );
|
2010-12-01 21:08:22 -08:00
|
|
|
void RecordSent( const char* const connName, HostID hid, int nBytes );
|
2011-08-17 18:07:21 -07:00
|
|
|
void RecordSent( const int* msgID, int nMsgIDs );
|
2012-01-04 18:14:12 -08:00
|
|
|
void RecordAddress( const char* const connName, HostID hid,
|
2013-01-12 16:09:24 -08:00
|
|
|
const AddrInfo* addr );
|
2010-10-22 22:34:43 -07:00
|
|
|
void GetPlayerCounts( const char* const connName, int* nTotal,
|
|
|
|
int* nHere );
|
2010-09-12 04:49:03 -07:00
|
|
|
|
2010-11-11 06:40:50 -08:00
|
|
|
void KillGame( const char* const connName, int hid );
|
|
|
|
|
2010-10-14 22:16:21 -07:00
|
|
|
/* Return list of roomName/playersStillWanted/age for open public games
|
2010-09-21 06:27:31 -07:00
|
|
|
matching this language and total game size. Will probably want to cache
|
|
|
|
lists locally and only update them every few seconds to avoid to many
|
|
|
|
queries.*/
|
|
|
|
void PublicRooms( int lang, int nPlayers, int* nNames, string& names );
|
|
|
|
|
2013-02-04 06:08:39 -08:00
|
|
|
/* Get stored address info, if available and valid */
|
|
|
|
bool TokenFor( const char* const connName, int hid, DevIDRelay* devid,
|
|
|
|
AddrInfo::ClientToken* token );
|
|
|
|
|
2010-09-23 06:31:29 -07:00
|
|
|
/* message storage -- different DB */
|
|
|
|
int CountStoredMessages( const char* const connName );
|
2013-02-04 06:08:39 -08:00
|
|
|
int CountStoredMessages( DevIDRelay relayID );
|
2017-11-12 20:25:29 -08:00
|
|
|
int StoreMessage( DevIDRelay destRelayID, const uint8_t* const buf,
|
|
|
|
int len );
|
|
|
|
int StoreMessage( const char* const connName, int destHid,
|
|
|
|
const uint8_t* const buf, int len );
|
2013-07-25 06:37:53 -07:00
|
|
|
void GetStoredMessages( DevIDRelay relayID, vector<MsgInfo>& msgs );
|
|
|
|
void GetStoredMessages( const char* const connName, HostID hid,
|
|
|
|
vector<DBMgr::MsgInfo>& msgs );
|
2013-02-04 06:08:39 -08:00
|
|
|
|
2011-03-31 18:15:03 -07:00
|
|
|
void RemoveStoredMessages( const int* msgID, int nMsgIDs );
|
2013-08-01 07:49:12 -07:00
|
|
|
void RemoveStoredMessage( const int msgID );
|
2013-02-04 06:08:39 -08:00
|
|
|
void RemoveStoredMessages( vector<int>& ids );
|
2010-09-23 06:31:29 -07:00
|
|
|
|
2015-07-11 08:08:22 -07:00
|
|
|
DevIDRelay getDevID( string& relayID );
|
|
|
|
|
2010-09-11 19:44:37 -07:00
|
|
|
private:
|
2010-09-12 04:49:03 -07:00
|
|
|
DBMgr();
|
2012-11-15 06:15:44 -08:00
|
|
|
bool execSql( const string& query );
|
2011-08-17 18:07:21 -07:00
|
|
|
bool execSql( const char* const query ); /* no-results query */
|
2014-04-25 18:45:51 -07:00
|
|
|
bool execParams( QueryBuilder& qb );
|
2013-06-17 06:48:22 -07:00
|
|
|
void readArray( const char* const connName, const char* column, int arr[] );
|
2012-11-03 10:58:01 -07:00
|
|
|
DevIDRelay getDevID( const char* connName, int hid );
|
|
|
|
DevIDRelay getDevID( const DevID* devID );
|
2013-02-04 06:08:39 -08:00
|
|
|
int getCountWhere( const char* table, string& test );
|
|
|
|
void RemoveStoredMessages( string& msgIDs );
|
2013-07-25 06:37:53 -07:00
|
|
|
void decodeMessage( PGresult* result, bool useB64, int rowIndx, int b64indx,
|
2018-05-21 21:07:33 -07:00
|
|
|
int byteaIndex, vector<uint8_t>& buf );
|
|
|
|
|
2013-08-29 06:37:22 -07:00
|
|
|
void storedMessagesImpl( string query, vector<DBMgr::MsgInfo>& msgs,
|
|
|
|
bool nullConnnameOK );
|
2013-07-25 06:37:53 -07:00
|
|
|
int CountStoredMessages( const char* const connName, int hid );
|
2013-08-20 08:09:45 -07:00
|
|
|
bool UpdateDevice( DevIDRelay relayID );
|
2014-04-25 18:45:51 -07:00
|
|
|
void formatUpdate( QueryBuilder& qb, bool append, const char* const desc,
|
2013-09-15 12:54:47 -07:00
|
|
|
int clientVersion, const char* const model,
|
2019-03-07 18:12:26 -08:00
|
|
|
const char* const osVers, unsigned short variantCode,
|
2019-02-02 21:49:50 -08:00
|
|
|
DevIDRelay relayID );
|
2010-09-23 05:33:27 -07:00
|
|
|
|
2010-10-04 20:04:14 -07:00
|
|
|
PGconn* getThreadConn( void );
|
2013-07-03 07:36:15 -07:00
|
|
|
void clearThreadConn();
|
2012-01-26 05:48:10 -08:00
|
|
|
|
2013-09-14 21:39:18 -07:00
|
|
|
bool hasNoMessages( const char* const connName, HostID hid );
|
|
|
|
void setHasNoMessages( const char* const connName, HostID hid );
|
|
|
|
void clearHasNoMessages( const char* const connName, HostID hid );
|
|
|
|
void formatKey( StrWPF& key, const char* const connName, HostID hid );
|
|
|
|
|
2013-08-15 07:24:30 -07:00
|
|
|
bool hasNoMessages( DevIDRelay devid );
|
|
|
|
void setHasNoMessages( DevIDRelay devid );
|
|
|
|
void clearHasNoMessages( DevIDRelay devid );
|
|
|
|
|
2012-01-26 05:48:10 -08:00
|
|
|
void conn_key_alloc();
|
|
|
|
pthread_key_t m_conn_key;
|
2013-02-04 06:08:39 -08:00
|
|
|
bool m_useB64;
|
2012-01-26 05:48:10 -08:00
|
|
|
|
2013-08-15 07:24:30 -07:00
|
|
|
pthread_mutex_t m_haveNoMessagesMutex;
|
2013-09-14 21:39:18 -07:00
|
|
|
set<DevIDRelay> m_haveNoMessagesDevID;
|
|
|
|
set<StrWPF> m_haveNoMessagesConnname;
|
2010-09-11 19:44:37 -07:00
|
|
|
}; /* DBMgr */
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|