- 论坛徽章:
- 0
|
/*
* =====================================================================================
*
* Filename: online_time.c
*
* Description:
*
* Version: 1.0
* Created: 2007年12月29日 15时17分59秒 CST
* Revision: none
* Compiler: gcc
*
* Author: liping (fl), lxy9805287@163.com
* Company: Free company
*
* =====================================================================================
*/
#include "online_time.h"
#include <time.h>
#define LOGIN_SQL "SELECT UNIX_TIMESTAMP(LoginTime) FROM player_action where LoginTime >= '%s 00:00:00' and \
LoginTime <= '%s 23:59:59' and PlayerAccount ='%s' and Action='Login' order by LoginTime" /* */
#define LOGOUT_SQL "SELECT UNIX_TIMESTAMP(LoginTime) FROM player_action where LoginTime >= '%s 00:00:00' and \
LoginTime <= '%s 23:59:59' and PlayerAccount ='%s' and Action='Logout' order by LoginTime" /* */
#define CREATE_LIST "SELECT PlayerAccount,LoginIp FROM player_action where LoginTime >= '%s 00:00:00' and \
LoginTime <= '%s 23:59:59' and LoginIp is NOT NULL group by PlayerAccount"
#define CONFIG "db.cfg" /* */
#define LOGNAME "run.log" /* 程序的运行日志 */
int main ( int argc, char *argv[] )
{
time_t timep;
static u64 LoginPatchTime;
static u64 LogoutPatchTime;
int PastTm;
PlayerAccountQueue PlayerList;
PlayerAccountQueue *PlayerQueue;
PlayerDetail PlayerOnlineInfo;
MYSQL_ROW row;
MYSQL_ROW LoginRow;
MYSQL_ROW LogoutRow;
MYSQL_RES *Res_t;
MYSQL_RES *result;
MYSQL_RES *LoginRes;
MYSQL_RES *LogoutRes;
s8 IpAddress[18];
u16 LoginNumRows;
u16 LogoutNumRows;
s8 Account[40];
s8 sql[1024];
s8 yesterday[12];
FILE *RunLog;
RunLog = fopen (LOGNAME,"a");
// 读取配置mysql文件,包括统计几天前的日志
struct Config *my,cf;
my = GetConfig(CONFIG,&cf);
PastTm=atoi(my->PastTm);
if(PastTm < 0 ){ /* 如果间隔时间错误,默认置为1天 */
PastTm = 1;
}
get_time(PastTm,yesterday);
PlayerQueue=InitAccountQueue(&PlayerList); /* 初始化队列 */
if(!OpenMysqlConnect(my)){ /* 打开数据库连接 */
fprintf(RunLog,"%s [%d] Open Mysql Error %s\n",argv[0],(int)time(&timep),mysql_error(&mysql));
fprintf(RunLog,"%s [%d] Exiting\n",argv[0],(int)time(&timep));
exit(1);
}
//生成 时间,用来补登录和登出
LoginPatchTime = (u64)MkPathTime(PastTm,timep,0,0,0); /* 00:00:00 */
LogoutPatchTime = (u64)MkPathTime(PastTm,timep,23,59,59); /* 23:59:59 */
//提取用户帐号 (唯一帐号)
sprintf(sql,CREATE_LIST,yesterday,yesterday);
result = GetMysqlData(sql);
if(result){
while((row = mysql_fetch_row(result)))
if(row[0] && row[1]){
PlayerQueue=CreateAccountQueue(PlayerQueue,row[0],row[1]); /* 创建玩家帐号队列 */
}
mysql_free_result(result);
}
//主 计算程序
while(PlayerQueue->front!=NULL){
memset(sql,0,sizeof(sql));
if(!OutAccountQueue(PlayerQueue,Account,IpAddress)){ /* 出对,将用户帐号付给 Account 字符篡变量*/
fprintf(RunLog,"%s [%d] Queue is null or PlayerAccount empty \n",argv[0],(int)time(&timep));
fprintf(RunLog,"%s [%d] Exiting\n",argv[0],(int)time(&timep));
exit(0);
}
sprintf(sql,LOGIN_SQL,yesterday,yesterday,Account);
LoginRes = GetMysqlData(sql);
if(!LoginRes)
continue;
Res_t = GetMysqlData(sql);
LoginNumRows = (u16)mysql_num_rows(Res_t); /* 获取登录的记录行数 */
LoginRow = mysql_fetch_row(Res_t);
sprintf(sql,LOGOUT_SQL,yesterday,yesterday,Account);
LogoutRes = GetMysqlData(sql);
if(!LogoutRes)
continue;
Res_t = GetMysqlData(sql);
LogoutNumRows = (u16)mysql_num_rows(Res_t); /* 获取登出的记录行数 */
LogoutRow = mysql_fetch_row(Res_t);
PlayerOnlineInfo.LoginTimeCount =0;
PlayerOnlineInfo.LogoutTimeCount = 0;
PlayerOnlineInfo.RealOnlineTime = 0;
if( LoginNumRows == LogoutNumRows ){ /* 登录和退出次数匹配 */
if( atol(LoginRow[0]) < atol(LogoutRow[0]) ){ /* 先退出在上线,最后没有下线 */
while((row = mysql_fetch_row(LoginRes))){
PlayerOnlineInfo.LoginTimeCount += atol(row[0]);
}
while((row = mysql_fetch_row(LogoutRes))){
PlayerOnlineInfo.LogoutTimeCount += atol(row[0]);
}
PlayerOnlineInfo.RealOnlineTime = PlayerOnlineInfo.LogoutTimeCount - PlayerOnlineInfo.LoginTimeCount;
sprintf(sql,"INSERT INTO player_onlinetime values('%s','%llu','%s','%s')" \
,Account,PlayerOnlineInfo.RealOnlineTime,IpAddress,yesterday);
mysql_real_query(&mysql,sql,strlen(sql));
}else{ /* 先上线,最后下线 */
while((row = mysql_fetch_row(LoginRes))){
PlayerOnlineInfo.LoginTimeCount += atol(row[0]);
}
PlayerOnlineInfo.LoginTimeCount += LoginPatchTime; /* 补一次登录时间 当天00:00:00 */
while((row = mysql_fetch_row(LogoutRes))){
PlayerOnlineInfo.LogoutTimeCount += atol(row[0]);
}
PlayerOnlineInfo.LogoutTimeCount += LogoutPatchTime; /* 补一次登出时间 当天23:59:59 */
PlayerOnlineInfo.RealOnlineTime = PlayerOnlineInfo.LogoutTimeCount - PlayerOnlineInfo.LoginTimeCount;
sprintf(sql,"INSERT INTO player_onlinetime values('%s','%llu','%s','%s')" \
,Account,PlayerOnlineInfo.RealOnlineTime,IpAddress,yesterday);
mysql_real_query(&mysql,sql,strlen(sql));
}
}else if (LoginNumRows + 1 == LogoutNumRows){ /* 玩家是前00点以前上线,今天下线 */
while((row = mysql_fetch_row(LoginRes))){
PlayerOnlineInfo.LoginTimeCount += atol(row[0]);
}
PlayerOnlineInfo.LoginTimeCount += LoginPatchTime; /* 补一次登录时间 当天00:00:00 */
while((row = mysql_fetch_row(LogoutRes))){
PlayerOnlineInfo.LogoutTimeCount += atol(row[0]);
}
PlayerOnlineInfo.RealOnlineTime = PlayerOnlineInfo.LogoutTimeCount - PlayerOnlineInfo.LoginTimeCount;
sprintf(sql,"INSERT INTO player_onlinetime values('%s','%llu','%s','%s')" \
,Account,PlayerOnlineInfo.RealOnlineTime,IpAddress,yesterday);
mysql_real_query(&mysql,sql,strlen(sql));
}else if (LoginNumRows - 1 == LogoutNumRows){ /* 玩家今天上线,24点之前没有下线 */
while((row = mysql_fetch_row(LoginRes))){
PlayerOnlineInfo.LoginTimeCount += atol(row[0]);
}
while((row = mysql_fetch_row(LogoutRes))){
PlayerOnlineInfo.LogoutTimeCount += atol(row[0]);
}
PlayerOnlineInfo.LogoutTimeCount += LogoutPatchTime; /* 补一次登出时间 当天23:59:59 */
PlayerOnlineInfo.RealOnlineTime = PlayerOnlineInfo.LogoutTimeCount - PlayerOnlineInfo.LoginTimeCount;
sprintf(sql,"INSERT INTO player_onlinetime values('%s','%llu','%s','%s')" \
,Account,PlayerOnlineInfo.RealOnlineTime,IpAddress,yesterday);
mysql_real_query(&mysql,sql,strlen(sql));
}else{
fprintf(RunLog,"%d %s: Status unknown \n",(int)time(&timep),Account);
}
mysql_free_result(LoginRes);
mysql_free_result(LogoutRes);
} /* ---------- end of function main ---------- */
mysql_close(&mysql);
return EXIT_SUCCESS;
} |
|