158 lines
3.6 KiB
C++
158 lines
3.6 KiB
C++
|
#include "db_init.h"
|
||
|
|
||
|
namespace db {
|
||
|
|
||
|
int create_table_history(pqxx::connection& C) {
|
||
|
std::string query;
|
||
|
|
||
|
try {
|
||
|
/* Create a transactional object. */
|
||
|
pqxx::work W(C);
|
||
|
|
||
|
/* Create sql query for history table creation */
|
||
|
query = "CREATE TABLE IF NOT EXISTS HISTORY(" \
|
||
|
"ID SERIAL PRIMARY KEY NOT NULL," \
|
||
|
"COIN CHAR(32) NOT NULL,"\
|
||
|
"TYPE INT,"\
|
||
|
"USERID CHAR(128) NOT NULL,"\
|
||
|
"QUANTITY INT,"\
|
||
|
"TIMESTAMP BIGINT NOT NULL,"\
|
||
|
"COMPLETED BOOLEAN,"\
|
||
|
"PRICE REAL);";
|
||
|
|
||
|
/* Execute SQL query */
|
||
|
W.exec( query );
|
||
|
W.commit();
|
||
|
} catch (const std::exception &e) {
|
||
|
std::cerr << e.what() << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int create_table_coin_price(pqxx::connection& C) {
|
||
|
std::string query;
|
||
|
|
||
|
try {
|
||
|
/* Create a transactional object. */
|
||
|
pqxx::work W(C);
|
||
|
|
||
|
/* Create sql query for history table creation */
|
||
|
query = "CREATE TABLE IF NOT EXISTS COINPRICE(" \
|
||
|
"COIN CHAR(32) PRIMARY KEY,"\
|
||
|
"PRICE REAL," \
|
||
|
"SALEVALUE REAL," \
|
||
|
"INCIRCULATION INT, "\
|
||
|
"LASTUPDATE BIGINT);";
|
||
|
|
||
|
/* Execute SQL query */
|
||
|
W.exec( query );
|
||
|
W.commit();
|
||
|
} catch (const std::exception &e) {
|
||
|
std::cerr << e.what() << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
int create_last_n_anchor_prices_function(pqxx::connection& C) {
|
||
|
std::string query;
|
||
|
|
||
|
try {
|
||
|
/* Create a transactional object. */
|
||
|
pqxx::work W(C);
|
||
|
|
||
|
/* Create sql query for spaced prices function, delta is in seconds*/
|
||
|
query = "CREATE OR REPLACE FUNCTION last_n_spaced_prices(var_coin CHAR(32), var_n INT, var_delta INT) RETURNS SETOF HISTORY AS $$" \
|
||
|
"DECLARE "\
|
||
|
" row HISTORY%ROWTYPE; "\
|
||
|
" cur_date BIGINT = 9223372036854775806; "\
|
||
|
" nb_dates INT = 0; "\
|
||
|
" nb_dates_max INT = var_n; "\
|
||
|
"BEGIN "\
|
||
|
" FOR row IN "\
|
||
|
" SELECT * "\
|
||
|
" FROM HISTORY "\
|
||
|
" WHERE HISTORY.COIN = var_coin "\
|
||
|
" ORDER BY TIMESTAMP DESC "\
|
||
|
" LOOP "\
|
||
|
" IF nb_dates = nb_dates_max "\
|
||
|
" THEN "\
|
||
|
" EXIT; "\
|
||
|
" END IF; "\
|
||
|
" "\
|
||
|
" IF row.TIMESTAMP <= cur_date - var_delta*1000 OR cur_date IS NULL "\
|
||
|
" THEN "\
|
||
|
" cur_date := row.TIMESTAMP; "\
|
||
|
" nb_dates := nb_dates + 1; "\
|
||
|
" RETURN NEXT row; "\
|
||
|
" END IF; "\
|
||
|
" END LOOP; "\
|
||
|
"END; "\
|
||
|
"$$ LANGUAGE plpgsql; ";
|
||
|
|
||
|
/* Execute SQL query */
|
||
|
W.exec( query );
|
||
|
W.commit();
|
||
|
} catch (const std::exception &e) {
|
||
|
std::cerr << e.what() << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
int create_table_users(pqxx::connection& C) {
|
||
|
std::string query;
|
||
|
|
||
|
try {
|
||
|
/* Create a transactional object. */
|
||
|
pqxx::work W(C);
|
||
|
|
||
|
/* Create sql query for history table creation */
|
||
|
query = "CREATE TABLE IF NOT EXISTS USERS(" \
|
||
|
"USERID CHAR(128) PRIMARY KEY,"\
|
||
|
"USERNAME TEXT NOT NULL,"\
|
||
|
"ICON CHAR(32) NOT NULL,"\
|
||
|
"NETWORTH REAL);";
|
||
|
|
||
|
/* Execute SQL query */
|
||
|
W.exec( query );
|
||
|
W.commit();
|
||
|
} catch (const std::exception &e) {
|
||
|
std::cerr << e.what() << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
int populate() {
|
||
|
try {
|
||
|
pqxx::connection C("dbname = nasfaq user = steaky \
|
||
|
hostaddr = 127.0.0.1 port = 5432");
|
||
|
|
||
|
if (C.is_open()) {
|
||
|
std::cout << "Opened database successfully: " << C.dbname() << std::endl;
|
||
|
} else {
|
||
|
std::cout << "Can't open database" << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
/* Create tables. */
|
||
|
create_table_history(C);
|
||
|
create_table_coin_price(C);
|
||
|
create_table_users(C);
|
||
|
|
||
|
/* Create functions. */
|
||
|
create_last_n_anchor_prices_function(C);
|
||
|
|
||
|
} catch (const std::exception &e) {
|
||
|
std::cerr << e.what() << std::endl;
|
||
|
return 1;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
|
}
|