|
|
@ -0,0 +1,70 @@ |
|
|
|
#include <iostream>
|
|
|
|
#include <fstream>
|
|
|
|
#include <sstream>
|
|
|
|
#include <variant>
|
|
|
|
#include <chrono>
|
|
|
|
#include <algorithm>
|
|
|
|
#include "database.hpp"
|
|
|
|
#include "network.hpp"
|
|
|
|
#include <memory>
|
|
|
|
#include <cstdlib>
|
|
|
|
#include <sys/types.h>
|
|
|
|
#include <sys/socket.h>
|
|
|
|
#include <netinet/in.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "commander.hpp"
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char** argv) |
|
|
|
{ |
|
|
|
try{ |
|
|
|
while(argc == 3) |
|
|
|
{ |
|
|
|
std::stringstream ip_stream{argv[1]}; |
|
|
|
std::array<uint8_t, 4> ip; |
|
|
|
std::string token; |
|
|
|
std::getline(ip_stream, token, '.'); |
|
|
|
ip[0] = std::stoi(token); |
|
|
|
std::getline(ip_stream, token, '.'); |
|
|
|
ip[1] = std::stoi(token); |
|
|
|
std::getline(ip_stream, token, '.'); |
|
|
|
ip[2] = std::stoi(token); |
|
|
|
std::getline(ip_stream, token, '.'); |
|
|
|
ip[3] = std::stoi(token); |
|
|
|
|
|
|
|
uint16_t port = std::stoi(argv[2]); |
|
|
|
|
|
|
|
|
|
|
|
auto soc = socket(AF_INET, SOCK_DGRAM, 0); |
|
|
|
struct sockaddr_in server; |
|
|
|
server.sin_family = AF_INET; |
|
|
|
server.sin_addr.s_addr = *(in_addr_t*)ip.data(); |
|
|
|
server.sin_port = htons(port); |
|
|
|
|
|
|
|
connect(soc, (struct sockaddr*)&server, sizeof(server)); |
|
|
|
|
|
|
|
|
|
|
|
sending_data reply; |
|
|
|
received_data request; |
|
|
|
|
|
|
|
request.op = db_op::stats; |
|
|
|
|
|
|
|
send(soc, (void*)&request, (socklen_t)sizeof(request), 0); |
|
|
|
recv(soc, (void*)&reply, (socklen_t)sizeof(reply), 0); |
|
|
|
|
|
|
|
auto stats = (stats_data*)&reply.page; |
|
|
|
|
|
|
|
std::cout << "free_pages\t" << stats->free << std::endl; |
|
|
|
std::cout << "deleted_pages\t" << stats->free_deleted << std::endl; |
|
|
|
std::cout << "total_pages\t" << stats->total_pages << std::endl; |
|
|
|
std::cout << "total_records\t" << stats->total_records << std::endl; |
|
|
|
std::cout << "delete_cache\t" << stats->total_delete << std::endl; |
|
|
|
std::cout << "inaccessible\t" << stats->cow_full << std::endl; |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |
|
|
|
}catch(...) {} |
|
|
|
std::cerr << "Invalid command, expects ``db_stats IPV4 PORT''" << std::endl; |
|
|
|
return 1; |
|
|
|
} |