1. /*
  2.  * File: main.cpp
  3.  * Author: josko
  4.  *
  5.  * Created on October 31, 2010, 5:29 PM
  6.  */
  7.  
  8. #include <cstdlib>
  9. #include <cstdio>
  10. #include <string>
  11. #include <vector>
  12. #include <fstream>
  13. #include <algorithm>
  14.  
  15. #include "sqlite3.h"
  16.  
  17. using namespace std;
  18.  
  19. // GLOBALS
  20.  
  21. sqlite3 *db;
  22. vector<string> Row;
  23.  
  24. // HELPER FUNCTIONS
  25.  
  26. inline int Step( sqlite3_stmt *Statement )
  27. {
  28. int RC = sqlite3_step( Statement );
  29.  
  30. if( RC == SQLITE_ROW )
  31. {
  32. Row.clear( );
  33.  
  34. for( int i = 0; i < sqlite3_column_count( Statement ); ++i )
  35. {
  36. char *ColumnText = (char *)sqlite3_column_text( Statement, i );
  37.  
  38. if( ColumnText )
  39. Row.push_back( ColumnText );
  40. else
  41. Row.push_back( string( ) );
  42. }
  43. }
  44.  
  45. return RC;
  46. }
  47.  
  48. inline vector<string> Tokenize( string s, char delim )
  49. {
  50. vector<string> Tokens;
  51. string Token;
  52.  
  53. for( string :: iterator i = s.begin( ); i != s.end( ); ++i )
  54. {
  55. if( *i == delim )
  56. {
  57. if( Token.empty( ) )
  58. continue;
  59.  
  60. Tokens.push_back( Token );
  61. Token.clear( );
  62. }
  63. else
  64. Token += *i;
  65. }
  66.  
  67. if( !Token.empty( ) )
  68. Tokens.push_back( Token );
  69.  
  70. return Tokens;
  71. }
  72.  
  73. inline bool BanCheck( string server, string user, string ip )
  74. {
  75. transform( user.begin( ), user.end( ), user.begin( ), (int(*)(int))tolower );
  76. bool Ban = false;
  77. sqlite3_stmt *Statement;
  78.  
  79. if( ip.empty( ) )
  80. sqlite3_prepare_v2( db, "SELECT name, ip, date, gamename, admin, reason FROM bans WHERE server=? AND name=?", -1, (sqlite3_stmt **)&Statement, NULL );
  81. else
  82. sqlite3_prepare_v2( db, "SELECT name, ip, date, gamename, admin, reason FROM bans WHERE (server=? AND name=?) OR ip=?", -1, (sqlite3_stmt **)&Statement, NULL );
  83.  
  84. if( Statement )
  85. {
  86. sqlite3_bind_text( Statement, 1, server.c_str( ), -1, SQLITE_TRANSIENT );
  87. sqlite3_bind_text( Statement, 2, user.c_str( ), -1, SQLITE_TRANSIENT );
  88.  
  89. if( !ip.empty( ) )
  90. sqlite3_bind_text( Statement, 3, ip.c_str( ), -1, SQLITE_TRANSIENT );
  91.  
  92. int RC = Step( Statement );
  93.  
  94. if( RC == SQLITE_ROW )
  95. {
  96. if( Row.size( ) == 6 )
  97. Ban = true;
  98. else
  99. printf( "[SQLITE3] error checking ban - row doesn't have 6 columns\n" );
  100. }
  101. else if( RC == SQLITE_ERROR )
  102. printf( "[SQLITE3] error checking ban\n" );
  103.  
  104. sqlite3_finalize( Statement );
  105. }
  106. else
  107. printf( "[SQLITE3] prepare error checking ban\n" );
  108.  
  109. return Ban;
  110. }
  111.  
  112. inline void BanAdd( string server, string user, string ip, string gamename, string admin, string reason )
  113. {
  114. transform( user.begin( ), user.end( ), user.begin( ), (int(*)(int))tolower );
  115. sqlite3_stmt *Statement;
  116. sqlite3_prepare_v2( db, "INSERT INTO bans ( server, name, ip, date, gamename, admin, reason ) VALUES ( ?, ?, ?, date('now'), ?, ?, ? )", -1, (sqlite3_stmt **)&Statement, NULL );
  117.  
  118. if( Statement )
  119. {
  120. sqlite3_bind_text( Statement, 1, server.c_str( ), -1, SQLITE_TRANSIENT );
  121. sqlite3_bind_text( Statement, 2, user.c_str( ), -1, SQLITE_TRANSIENT );
  122. sqlite3_bind_text( Statement, 3, ip.c_str( ), -1, SQLITE_TRANSIENT );
  123. sqlite3_bind_text( Statement, 4, gamename.c_str( ), -1, SQLITE_TRANSIENT );
  124. sqlite3_bind_text( Statement, 5, admin.c_str( ), -1, SQLITE_TRANSIENT );
  125. sqlite3_bind_text( Statement, 6, reason.c_str( ), -1, SQLITE_TRANSIENT );
  126.  
  127. int RC = Step( Statement );
  128.  
  129. if( RC == SQLITE_DONE )
  130. return;
  131. else if( RC == SQLITE_ERROR )
  132. printf( "[SQLITE3] error adding ban\n" );
  133.  
  134. sqlite3_finalize( Statement );
  135. }
  136. else
  137. printf( "[SQLITE3] prepare error adding ban\n" );
  138. }
  139.  
  140. // MAIN
  141.  
  142. int main(int argc, char** argv)
  143. {
  144. if( argc > 2 )
  145. {
  146. if( sqlite3_open_v2( argv[1], (sqlite3 **)&db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL ) != SQLITE_OK )
  147. printf( "Couldn't open SQLite3 database\n" );
  148.  
  149. ifstream in;
  150. in.open( argv[2] );
  151.  
  152. if( !in.fail( ) )
  153. {
  154. string Line;
  155. unsigned int BanCheckCounter = 0, BanAddCounter = 0;
  156.  
  157. while( !in.eof( ) )
  158. {
  159. getline( in, Line );
  160.  
  161. if( Line.empty( ) || Line[0] != '(' )
  162. continue;
  163.  
  164. // SQL DUMP EXAMPLE:
  165. // (3467, 1, 'europe.battle.net', 'micheal1', '80.216.136.90', '2010-08-18 00:00:00.0', 'CF! rr2 na fow mp2 fi ur 2v2!', 'Tikka7', 'liiveri'),
  166.  
  167. Line = Line.substr( 1, Line.size() - 1 ); // 3467, 1, 'europe.battle.net', 'micheal1', '80.216.136.90', '2010-08-18 00:00:00.0', 'CF! rr2 na fow mp2 fi ur 2v2!', 'Tikka7', 'väkisin sitten'
  168.  
  169. vector<string> Parts = Tokenize( Line, ',' );
  170.  
  171. string server, user, ip, date, gamename, admin, reason;
  172.  
  173. server = Parts[2].substr( 2, Parts[2].size( ) - 2 );
  174. user = Parts[3].substr( 2, Parts[3].size( ) - 2 );
  175. ip = Parts[4].substr( 2, Parts[4].size( ) - 2 );
  176.  
  177. // printf( "DEBUG: \"%s\" \"%s\" \"%s\"\n", server.c_str(), user.c_str(), ip.c_str() );
  178.  
  179. ++BanCheckCounter;
  180.  
  181. if( !BanCheck( server, user, ip ) )
  182. {
  183. // date = Parts[5].substr( 2, Parts[5].size( ) - 2 );
  184. gamename = Parts[6].substr( 2, Parts[6].size( ) - 2 );
  185. admin = Parts[7].substr( 2, Parts[7].size( ) - 2 );
  186. reason = Parts[8].substr( 2, Parts[8].size( ) - 2 );
  187.  
  188. printf( "BAN ADD: \"%s\" \"%s\" \"%s\"\n", gamename.c_str(), admin.c_str(), reason.c_str() );
  189.  
  190. BanAdd( server, user, ip, gamename, admin, reason );
  191. ++BanAddCounter;
  192. }
  193. else
  194. continue;
  195. }
  196.  
  197. printf( "Total bans checked: %d\nTotal bans added: %d", BanCheckCounter, BanAddCounter );
  198.  
  199. sqlite3_close( db );
  200. }
  201. else
  202. printf( "Couldn't read SQL file\n" );
  203.  
  204. }
  205. else
  206. printf( "Usage: sql_import <database> <sql file>\n" );
  207.  
  208. return 0;
  209. }
  210.