/*
* @file LevelMatching.cpp
* @brief
*
* レベルによるマッチング処理
*
* Copyright MONOBIT Inc. All rights reserved.
*/
#include "./LevelMatching.hpp"
/**
* コンストラクタ
*/
LevelMatching::LevelMatching()
{
}
/**
* デストラクタ
*/
LevelMatching::~LevelMatching()
{
}
/**
* ルームの新規作成
*
* @info 所有者の入室も同時に行う
*
* @param createRoomInfo ルーム作成情報
* @param pCreateTableInfo テーブル作成情報
*
* @return trueなら成功、falseなら失敗
*/
bool LevelMatching::CreateRoom( CreateRoomInfo& createRoomInfo, CreateTableInfo* pCreateTableInfo )
{
return MatchingBase::CreateRoom( createRoomInfo, pCreateTableInfo );
}
/**
* ルームの検索
*
* @param level_min レベル最小値
* @param level_max レベル最大値
* @param searchRoomInfoList 検索用ルーム情報リスト
* @param limit 最大数
* @param offset 開始オフセット
*
* @return trueなら成功、falseなら失敗
*/
bool LevelMatching::SearchRoom( uint32 level_min, uint32 level_max, SearchRoomInfoList& searchRoomInfoList, uint32 limit, uint32 offset )
{
do{
std::string sql;
SqlQueryInfo sqlInfo;
searchRoomInfoList.clear();
// ルームの検索
sql =
"SELECT rooms.id, rooms.max_players, rooms.curt_players, rooms.created_time"
" FROM level_rooms, rooms"
" WHERE level_rooms.level >= ?1"
" AND level_rooms.level <= ?2"
" AND rooms.id = level_rooms.room_id"
" AND rooms.curt_players < rooms.max_players"
" AND rooms.curt_players > 0"
" ORDER BY rooms.created_time"
+ SQL::LIMIT( limit, offset );
sqlInfo.SetQuery( sql );
sqlInfo.SetParam( 1, level_min );
sqlInfo.SetParam( 2, level_max );
if ( ! m_DbAgent.ExecuteQuery( sqlInfo ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
// ルームなし
if ( ! sqlInfo.IsRow() ){
return true;
}
// データの取得
do{
SearchRoomInfo info;
sqlInfo.GetColumnData( 0, &info.roomInfo.room_id );
sqlInfo.GetColumnData( 1, &info.roomInfo.max_players );
sqlInfo.GetColumnData( 2, &info.roomInfo.curt_players );
uint64 createdTime;
sqlInfo.GetColumnData( 3, &createdTime );
SQL::Time2Str( createdTime, info.roomInfo.created, sizeof( info.roomInfo.created ) );
searchRoomInfoList.push_back( info );
}while ( sqlInfo.Next() );
return true;
}while ( false );
return false;
}
/**
* テーブル作成クエリ
*
* @return trueなら成功、falseなら失敗
*/
bool LevelMatching::QueryCreateTable()
{
do{
std::string sql;
// マッチング用テーブルの作成
sql =
"CREATE TABLE level_rooms ("
"room_id INTEGER"
",level INTEGER"
")";
if ( ! m_DbAgent.ExecuteQuery( sql ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
// マッチング用テーブルインデックスの作成
// (SQLiteの場合、インデックス名はデータベースレベルでユニークにする)
sql =
"CREATE UNIQUE INDEX level_rooms_room_id ON level_rooms( room_id )";
if ( ! m_DbAgent.ExecuteQuery( sql ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
sql =
"CREATE INDEX level_rooms_level ON level_rooms( level )";
if ( ! m_DbAgent.ExecuteQuery( sql ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
return MatchingBase::QueryCreateTable();
}while ( false );
return false;
}
/**
* ルーム作成クエリ
*
* @param createRoomInfo ルーム作成情報
* @param pArg 汎用引数
*
* @return trueなら成功、falseなら失敗
*/
bool LevelMatching::QueryCreateRoom( CreateRoomInfo& createRoomInfo, void* pArg )
{
do{
std::string sql;
SqlQueryInfo sqlInfo;
CreateTableInfo* pCreateTableInfo = (CreateTableInfo*)pArg;
if ( NULL == pCreateTableInfo ) break;
if ( ! MatchingBase::QueryCreateRoom( createRoomInfo, pCreateTableInfo ) ) break;
// データの登録
sql =
"INSERT INTO level_rooms ( room_id, level ) VALUES ( ?1, ?2 )";
sqlInfo.SetQuery( sql );
sqlInfo.SetParam( 1, createRoomInfo.room_id );
sqlInfo.SetParam( 2, pCreateTableInfo->level );
if ( ! m_DbAgent.ExecuteQuery( sqlInfo ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
// 更新件数チェック
if ( 1 != m_DbAgent.GetChangeNum() ){
DNALOG_ERR_D( "Not Changed." );
break;
}
return true;
}while ( false );
return false;
}
/**
* ルームの削除クエリ
*
* @param roomId ルームID
*
* @return trueなら成功、falseなら失敗
*/
bool LevelMatching::QueryDeleteRoom( uint64 roomId )
{
do{
std::string sql;
SqlQueryInfo sqlInfo;
// データの削除
sql =
"DELETE FROM level_rooms WHERE room_id = ?1";
sqlInfo.SetQuery( sql );
sqlInfo.SetParam( 1, roomId );
if ( ! m_DbAgent.ExecuteQuery( sqlInfo ) ){
DNALOG_ERR_D( "Error Query." );
break;
}
return MatchingBase::QueryDeleteRoom( roomId );
}while ( false );
return false;
}