2019-07-17 13:37:18 -04:00
# pragma once
# include <Definitions.h>
# include <map>
# include <vector>
# include <chrono>
# include <PermissionManager.h>
# include <Properties.h>
# include <cstdint>
namespace ts {
namespace server {
2020-01-26 12:04:38 -05:00
class VirtualServer ;
2019-07-17 13:37:18 -04:00
class DataClient ;
struct ClientDatabaseInfo {
ServerId sid ;
ClientDbId cldbid ;
std : : chrono : : time_point < std : : chrono : : system_clock > created ;
std : : chrono : : time_point < std : : chrono : : system_clock > lastjoin ;
std : : string uniqueId ;
std : : string lastName ;
uint32_t connections ;
} ;
struct CachedPermissionManager {
ServerId sid ;
ClientDbId cldbid ;
std : : weak_ptr < permission : : v2 : : PermissionManager > manager ;
std : : shared_ptr < permission : : v2 : : PermissionManager > ownLock ;
std : : chrono : : time_point < std : : chrono : : system_clock > lastAccess ;
} ;
struct CachedProperties {
ServerId sid ;
ClientDbId cldbid ;
std : : weak_ptr < Properties > properties ;
std : : shared_ptr < Properties > ownLock ;
std : : chrono : : time_point < std : : chrono : : system_clock > lastAccess ;
} ;
/*
CREATE_TABLE ( " properties " , " `serverId` INTEGER DEFAULT -1, `type` INTEGER, `id` INTEGER, `key` VARCHAR( " UNKNOWN_KEY_LENGTH " ), `value` TEXT " , command_append_utf8 ) ;
2020-01-23 20:57:58 -05:00
CREATE_TABLE ( " permissions " , " `serverId` INT NOT NULL, `type` INT, `id` INT, `channelId` INT, `permId` VARCHAR( " UNKNOWN_KEY_LENGTH " ), `value` INT, `grant` INT " , command_append_utf8 ) ;
2019-07-17 13:37:18 -04:00
*/
struct StartupPermissionEntry {
permission : : PermissionSqlType type = permission : : SQL_PERM_CHANNEL ;
uint64_t id = 0 ;
ChannelId channelId = 0 ;
std : : shared_ptr < permission : : PermissionTypeEntry > permission = permission : : PermissionTypeEntry : : unknown ;
permission : : PermissionValue value = 0 ;
permission : : PermissionValue grant = 0 ;
bool flag_skip = false ;
bool flag_negate = false ;
} ;
struct StartupPropertyEntry {
property : : PropertyType type = property : : PropertyType : : PROP_TYPE_UNKNOWN ;
2020-04-08 07:01:41 -04:00
uint64_t id { 0 } ;
const property : : PropertyDescription * info { & property : : undefined_property_description } ;
2019-07-17 13:37:18 -04:00
std : : string value ;
} ;
struct StartupCacheEntry {
ServerId sid ;
std : : deque < std : : unique_ptr < StartupPermissionEntry > > permissions ;
std : : deque < std : : unique_ptr < StartupPropertyEntry > > properties ;
} ;
struct FastPropertyEntry {
2020-04-08 07:01:41 -04:00
const property : : PropertyDescription * type ;
2020-01-23 20:57:58 -05:00
std : : string value ;
2019-07-17 13:37:18 -04:00
} ;
class DatabaseHelper {
public :
2019-10-16 15:11:54 -04:00
static std : : shared_ptr < Properties > default_properties_client ( std : : shared_ptr < Properties > /* properties */ , ClientType /* type */ ) ;
2019-07-17 13:37:18 -04:00
static bool assignDatabaseId ( sql : : SqlManager * , ServerId id , std : : shared_ptr < DataClient > ) ;
explicit DatabaseHelper ( sql : : SqlManager * ) ;
~ DatabaseHelper ( ) ;
void loadStartupCache ( ) ;
size_t cacheBinarySize ( ) ;
void clearStartupCache ( ServerId sid = 0 ) ;
2020-01-26 12:04:38 -05:00
void deleteClient ( const std : : shared_ptr < VirtualServer > & , ClientDbId ) ;
bool validClientDatabaseId ( const std : : shared_ptr < VirtualServer > & , ClientDbId ) ;
std : : deque < std : : shared_ptr < ClientDatabaseInfo > > queryDatabaseInfo ( const std : : shared_ptr < VirtualServer > & , const std : : deque < ClientDbId > & ) ;
std : : deque < std : : shared_ptr < ClientDatabaseInfo > > queryDatabaseInfoByUid ( const std : : shared_ptr < VirtualServer > & , std : : deque < std : : string > ) ;
2019-07-17 13:37:18 -04:00
2020-02-01 08:32:16 -05:00
std : : shared_ptr < permission : : v2 : : PermissionManager > loadClientPermissionManager ( const std : : shared_ptr < VirtualServer > & , ClientDbId ) ;
2020-01-26 12:04:38 -05:00
void saveClientPermissions ( const std : : shared_ptr < VirtualServer > & , ClientDbId , const std : : shared_ptr < permission : : v2 : : PermissionManager > & /* permission manager */ ) ;
2019-07-17 13:37:18 -04:00
2020-02-01 08:32:16 -05:00
std : : shared_ptr < permission : : v2 : : PermissionManager > loadChannelPermissions ( const std : : shared_ptr < VirtualServer > & , ChannelId ) ;
2020-01-26 12:04:38 -05:00
void saveChannelPermissions ( const std : : shared_ptr < VirtualServer > & , ChannelId , const std : : shared_ptr < permission : : v2 : : PermissionManager > & /* permission manager */ ) ;
2019-07-17 13:37:18 -04:00
2020-02-01 08:32:16 -05:00
std : : shared_ptr < permission : : v2 : : PermissionManager > loadGroupPermissions ( const std : : shared_ptr < VirtualServer > & , GroupId ) ;
2020-01-26 12:04:38 -05:00
void saveGroupPermissions ( const std : : shared_ptr < VirtualServer > & , GroupId , const std : : shared_ptr < permission : : v2 : : PermissionManager > & /* permission manager */ ) ;
2019-07-17 13:37:18 -04:00
2020-02-01 08:32:16 -05:00
std : : shared_ptr < permission : : v2 : : PermissionManager > loadPlaylistPermissions ( const std : : shared_ptr < VirtualServer > & , PlaylistId /* playlist id */ ) ;
void savePlaylistPermissions ( const std : : shared_ptr < VirtualServer > & , PlaylistId , const std : : shared_ptr < permission : : v2 : : PermissionManager > & /* permission manager */ ) ;
2019-07-17 13:37:18 -04:00
2020-01-26 12:04:38 -05:00
std : : shared_ptr < Properties > loadServerProperties ( const std : : shared_ptr < VirtualServer > & ) ; //Read and write
std : : shared_ptr < Properties > loadPlaylistProperties ( const std : : shared_ptr < VirtualServer > & , PlaylistId ) ; //Read and write
std : : shared_ptr < Properties > loadChannelProperties ( const std : : shared_ptr < VirtualServer > & , ChannelId ) ; //Read and write
std : : shared_ptr < Properties > loadClientProperties ( const std : : shared_ptr < VirtualServer > & , ClientDbId , ClientType ) ;
2019-07-17 13:37:18 -04:00
2020-01-26 12:04:38 -05:00
bool deleteGroupPermissions ( const std : : shared_ptr < VirtualServer > & , GroupId ) ;
bool deleteChannelPermissions ( const std : : shared_ptr < VirtualServer > & , ChannelId ) ;
bool deletePlaylist ( const std : : shared_ptr < VirtualServer > & , PlaylistId /* playlist id */ ) ;
2020-01-23 20:57:58 -05:00
std : : deque < std : : unique_ptr < FastPropertyEntry > > query_properties ( ServerId /* server */ , property : : PropertyType /* type */ , uint64_t /* id */ ) ; /* required for server snapshots */
2019-07-17 13:37:18 -04:00
void tick ( ) ;
private :
void loadStartupPermissionCache ( ) ;
void loadStartupPropertyCache ( ) ;
bool use_startup_cache = false ;
threads : : Mutex startup_lock ;
std : : deque < std : : shared_ptr < StartupCacheEntry > > startup_entries ;
sql : : SqlManager * sql = nullptr ;
threads : : Mutex permManagerLock ;
std : : deque < CachedPermissionManager * > cachedPermissionManagers ;
threads : : Mutex propsLock ;
std : : deque < CachedProperties * > cachedProperties ;
} ;
}
}