#include "TcpSocket.hpp" #include "NetConst.hpp" #include "sql.hpp" #include "values/DnaManager.hpp" #include #include #include // use pthread rw_lock to lock db so you can safy clone .db file // When a new client connected: void call(int sock, sockaddr_in newSocketInfo) { std::string add = TcpSocket::remoteAddress(newSocketInfo); printf("new: %s\n", add.c_str()); int64_t conf, id; Message message; TcpSocket::recvt(sock, &conf, sizeof(conf)); TcpSocket::recvt(sock, &id, sizeof(id)); if (conf != StartHeader) { printf("StartHeader ERROR\n"); TcpSocket::closet(sock); return; } if (id == 0) { printf("ID ERROR\n"); TcpSocket::closet(sock); return; } bool ok = true; sqlite3 *db; sqlite3_stmt *stmt; int rc = sqlite3_open(DB_NAME, &db); if (rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); ok = false; } sqlite3_prepare_v2(db, max_gen, -1, &stmt, NULL); sqlite3_bind_int64(stmt, 1, id); int64_t gen = 0; while (sqlite3_step(stmt) != SQLITE_DONE) { int num_cols = sqlite3_column_count(stmt); int type = sqlite3_column_type(stmt, 0); if (type == SQLITE_NULL) break; gen = sqlite3_column_int64(stmt, 0); gen++; } sqlite3_finalize(stmt); sqlite3_prepare_v2(db, insert_data, -1, &stmt, NULL); while (ok) { message.mess = Mess::REQ_SEND_GEN; message.data = gen; printf("requesting gen %ld\n", gen); TcpSocket::sendt(sock, &message, sizeof(Message)); TcpSocket::recvt(sock, &message, sizeof(Message)); if (message.mess == Mess::RES_NO) { break; } std::vector list; list.resize(NUM_PER_GEN); TcpSocket::recvt(sock, list.data(), NUM_PER_GEN * sizeof(NetUnit)); for (size_t i = 0; i < list.size(); i++) { sqlite3_bind_int64(stmt, 1, id); sqlite3_bind_int64(stmt, 2, gen); sqlite3_bind_int64(stmt, 3, list[i].hash); sqlite3_bind_int64(stmt, 4, list[i].index); sqlite3_bind_int64(stmt, 5, list[i].liked); sqlite3_step(stmt); sqlite3_reset(stmt); } gen++; } sqlite3_finalize(stmt); sqlite3_close(db); printf("del\n"); TcpSocket::closet(sock); } int main() { sql::init(); // Bind the server to a port. int err = TcpSocket::listent("0.0.0.0", 8888, call); if (err < 0) { printf("ERROR %d", err); return 0; } return 0; }