Skip to content

Commit

Permalink
Basic implementation of domain/account commands and queries with test
Browse files Browse the repository at this point in the history
Minor model fixes
  • Loading branch information
lebdron committed Jul 18, 2017
1 parent 83be9e7 commit 22dd7e8
Show file tree
Hide file tree
Showing 13 changed files with 252 additions and 71 deletions.
16 changes: 11 additions & 5 deletions irohad/ametsuchi/impl/mutable_storage_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ namespace iroha {
}
}

model::Account MutableStorageImpl::getAccount(
nonstd::optional<model::Account> MutableStorageImpl::getAccount(
const std::string &account_id) {
return wsv_->getAccount(account_id);
}
Expand All @@ -70,17 +70,23 @@ namespace iroha {
return wsv_->getSignatories(account_id);
}

model::Asset MutableStorageImpl::getAsset(const std::string &asset_id) {
nonstd::optional<model::Asset> MutableStorageImpl::getAsset(
const std::string &asset_id) {
return wsv_->getAsset(asset_id);
}

model::AccountAsset MutableStorageImpl::getAccountAsset(
nonstd::optional<model::AccountAsset> MutableStorageImpl::getAccountAsset(
const std::string &account_id, const std::string &asset_id) {
return wsv_->getAccountAsset(account_id, asset_id);
}

model::Peer MutableStorageImpl::getPeer(const std::string &address) {
return wsv_->getPeer(address);
std::vector<model::Peer> MutableStorageImpl::getPeers() {
return wsv_->getPeers();
}

nonstd::optional<model::Peer> MutableStorageImpl::getPeer(
const ed25519::pubkey_t &pubkey) {
return wsv_->getPeer(pubkey);
}
} // namespace ametsuchi
} // namespace iroha
9 changes: 5 additions & 4 deletions irohad/ametsuchi/impl/mutable_storage_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,13 @@ namespace iroha {
WsvQuery &, const model::Block &)>
function) override;
~MutableStorageImpl() override;
model::Account getAccount(const std::string &account_id) override;
nonstd::optional<model::Account> getAccount(const std::string &account_id) override;
std::vector<ed25519::pubkey_t> getSignatories(const std::string &account_id) override;
model::Asset getAsset(const std::string &asset_id) override;
model::AccountAsset getAccountAsset(const std::string &account_id,
nonstd::optional<model::Asset> getAsset(const std::string &asset_id) override;
nonstd::optional<model::AccountAsset> getAccountAsset(const std::string &account_id,
const std::string &asset_id) override;
model::Peer getPeer(const std::string &address) override;
std::vector<model::Peer> getPeers() override;
nonstd::optional<model::Peer> getPeer(const ed25519::pubkey_t &pubkey) override;

private:
std::unique_ptr<FlatFile> &block_store_;
Expand Down
77 changes: 71 additions & 6 deletions irohad/ametsuchi/impl/postgres_wsv_command.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,46 @@
*/

#include "ametsuchi/impl/postgres_wsv_command.hpp"
#include <iostream>

namespace iroha {
namespace ametsuchi {

bool PostgresWsvCommand::upsertAccount(const model::Account &account) {
return false;
try {
pqxx::binarystring master_key(account.master_key.data(),
account.master_key.size());
std::stringstream permissions;
permissions << account.permissions.add_signatory
<< account.permissions.can_transfer
<< account.permissions.create_accounts
<< account.permissions.create_assets
<< account.permissions.create_domains
<< account.permissions.issue_assets
<< account.permissions.read_all_accounts
<< account.permissions.remove_signatory
<< account.permissions.set_permissions
<< account.permissions.set_quorum;
transaction_.exec(
"INSERT INTO account(\n"
" account_id, domain_id, master_key, quorum, status, "
"transaction_count, \n"
" permissions)\n"
" VALUES (" +
transaction_.quote(account.account_id) + ", " +
transaction_.quote(account.domain_name) + ", " +
transaction_.quote(master_key) + ", " +
transaction_.quote(account.quorum) + ", " +
/*account.status*/ transaction_.quote(0) + ", " +
/*account.transaction_count*/ transaction_.quote(0) +
", \n"
" " +
transaction_.quote(permissions.str()) + ");");
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
return false;
}
return true;
}

bool PostgresWsvCommand::insertAsset(const model::Asset &asset) {
Expand All @@ -35,12 +69,33 @@ namespace iroha {

bool PostgresWsvCommand::insertSignatory(
const ed25519::pubkey_t &signatory) {
return false;
try {
pqxx::binarystring public_key(signatory.data(), signatory.size());
transaction_.exec(
"INSERT INTO signatory(\n"
" public_key)\n"
" VALUES (" +
transaction_.quote(public_key) + ");");
} catch (const std::exception &e) {
return false;
}
return true;
}

bool PostgresWsvCommand::insertAccountSignatory(
const std::string &account_id, const ed25519::pubkey_t &signatory) {
return false;
try {
pqxx::binarystring public_key(signatory.data(), signatory.size());
transaction_.exec(
"INSERT INTO account_has_signatory(\n"
" account_id, public_key)\n"
" VALUES (" +
transaction_.quote(account_id) + ", " +
transaction_.quote(public_key) + ");");
} catch (const std::exception &e) {
return false;
}
return true;
}

bool PostgresWsvCommand::deleteAccountSignatory(
Expand All @@ -57,11 +112,21 @@ namespace iroha {
}

bool PostgresWsvCommand::insertDomain(const model::Domain &domain) {
return false;
try {
transaction_.exec(
"INSERT INTO domain(\n"
" domain_id, open)\n"
" VALUES (" +
transaction_.quote(domain.domain_id) + ", " +
/*domain.open*/ transaction_.quote(true) + ");");
} catch (const std::exception &e) {
std::cerr << e.what() << std::endl;
return false;
}
return true;
}

PostgresWsvCommand::PostgresWsvCommand(
std::unique_ptr<pqxx::nontransaction> &transaction)
PostgresWsvCommand::PostgresWsvCommand(pqxx::nontransaction &transaction)
: transaction_(transaction) {}
} // namespace ametsuchi
} // namespace iroha
4 changes: 2 additions & 2 deletions irohad/ametsuchi/impl/postgres_wsv_command.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ namespace iroha {
namespace ametsuchi {
class PostgresWsvCommand : public WsvCommand {
public:
PostgresWsvCommand(std::unique_ptr<pqxx::nontransaction> &transaction);
PostgresWsvCommand(pqxx::nontransaction &transaction);
bool upsertAccount(const model::Account &account) override;
bool insertAsset(const model::Asset &asset) override;
bool upsertAccountAsset(const model::AccountAsset &asset) override;
Expand All @@ -39,7 +39,7 @@ namespace iroha {
bool insertDomain(const model::Domain &domain) override;

private:
std::unique_ptr<pqxx::nontransaction> &transaction_;
pqxx::nontransaction &transaction_;
};
} // namespace ametsuchi
} // namespace iroha
Expand Down
90 changes: 73 additions & 17 deletions irohad/ametsuchi/impl/postgres_wsv_query.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,49 +20,105 @@
namespace iroha {
namespace ametsuchi {

using std::string;

using nonstd::optional;
using nonstd::nullopt;
using model::Account;
using model::Asset;

PostgresWsvQuery::PostgresWsvQuery(
std::unique_ptr<pqxx::nontransaction> &transaction)
pqxx::nontransaction &transaction)
: transaction_(transaction) {}

model::Account PostgresWsvQuery::getAccount(const std::string &account_id) {
model::Account account;
optional<Account> PostgresWsvQuery::getAccount(const string &account_id) {
pqxx::result result;
try {
// result = transaction_->exec();
result = transaction_.exec(
"SELECT \n"
" *\n"
"FROM \n"
" account\n"
"WHERE \n"
" account.account_id = " +
transaction_.quote(account_id) + ";");
} catch (const std::exception &e) {
// TODO log
return account;
return nullopt;
}
if (result.size() != 1){
return account;
if (result.size() != 1) {
return nullopt;
}

Account account;
auto row = result.at(0);
row.at("account_id") >> account.account_id;
row.at("domain_id") >> account.domain_name;
pqxx::binarystring master_key(row.at("master_key"));
std::copy(master_key.begin(), master_key.end(),
account.master_key.begin());
row.at("quorum") >> account.quorum;
// row.at("status") >> ?
// row.at("transaction_count") >> ?
std::string permissions;
row.at("permissions") >> permissions;
account.permissions.add_signatory = permissions.at(0) - '0';
account.permissions.can_transfer = permissions.at(1) - '0';
account.permissions.create_accounts = permissions.at(2) - '0';
account.permissions.create_assets = permissions.at(3) - '0';
account.permissions.create_domains = permissions.at(4) - '0';
account.permissions.issue_assets = permissions.at(5) - '0';
account.permissions.read_all_accounts = permissions.at(6) - '0';
account.permissions.remove_signatory = permissions.at(7) - '0';
account.permissions.set_permissions = permissions.at(8) - '0';
account.permissions.set_quorum = permissions.at(9) - '0';
return account;
}

std::vector<ed25519::pubkey_t> PostgresWsvQuery::getSignatories(
const std::string &account_id) {
std::vector<ed25519::pubkey_t> result;
return result;
const string &account_id) {
pqxx::result result;
try {
result = transaction_.exec(
"SELECT \n"
" account_has_signatory.public_key\n"
"FROM \n"
" account_has_signatory\n"
"WHERE \n"
" account_has_signatory.account_id = " +
transaction_.quote(account_id) + ";");
} catch (const std::exception &e) {
// TODO log
return {};
}
std::vector<ed25519::pubkey_t> signatories;
for (const auto &row : result){
pqxx::binarystring public_key_str(row.at("public_key"));
ed25519::pubkey_t pubkey;
std::copy(public_key_str.begin(), public_key_str.end(), pubkey.begin());
signatories.push_back(pubkey);
}
return signatories;
}

model::Asset PostgresWsvQuery::getAsset(const std::string &asset_id) {
optional<Asset> PostgresWsvQuery::getAsset(const string &asset_id) {
model::Asset result;
result.name = "";
return result;
}

model::AccountAsset PostgresWsvQuery::getAccountAsset(
nonstd::optional<model::AccountAsset> PostgresWsvQuery::getAccountAsset(
const std::string &account_id, const std::string &asset_id) {
model::AccountAsset result;
result.account_id = "";
return result;
}

model::Peer PostgresWsvQuery::getPeer(const std::string &address) {
model::Peer result;
result.address = "";
return result;
std::vector<model::Peer> PostgresWsvQuery::getPeers() { return {}; }

nonstd::optional<model::Peer> PostgresWsvQuery::getPeer(
const ed25519::pubkey_t &pubkey) {
return nullopt;
}

} // namespace ametsuchi
} // namespace iroha
13 changes: 7 additions & 6 deletions irohad/ametsuchi/impl/postgres_wsv_query.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,18 @@ namespace iroha {
namespace ametsuchi {
class PostgresWsvQuery : public WsvQuery {
public:
PostgresWsvQuery(std::unique_ptr<pqxx::nontransaction> &transaction);
model::Account getAccount(const std::string &account_id) override;
PostgresWsvQuery(pqxx::nontransaction &transaction);
nonstd::optional<model::Account> getAccount(const std::string &account_id) override;
std::vector<ed25519::pubkey_t> getSignatories(
const std::string &account_id) override;
model::Asset getAsset(const std::string &asset_id) override;
model::AccountAsset getAccountAsset(const std::string &account_id,
nonstd::optional<model::Asset> getAsset(const std::string &asset_id) override;
nonstd::optional<model::AccountAsset> getAccountAsset(const std::string &account_id,
const std::string &asset_id) override;
model::Peer getPeer(const std::string &address) override;
std::vector<model::Peer> getPeers() override;
nonstd::optional<model::Peer> getPeer(const ed25519::pubkey_t &pubkey) override;

private:
std::unique_ptr<pqxx::nontransaction> &transaction_;
pqxx::nontransaction &transaction_;
};
} // namespace ametsuchi
} // namespace iroha
Expand Down
Loading

0 comments on commit 22dd7e8

Please sign in to comment.