@@ -697,6 +697,26 @@ namespace iroha {
697
697
AND NOT (SELECT * FROM has_root_perm) THEN 2
698
698
WHEN NOT (SELECT * FROM has_perm) THEN 2)" });
699
699
700
+ add_sync_peer_statements_ = makeCommandStatements (
701
+ sql_,
702
+ R"(
703
+ WITH %s
704
+ inserted AS (
705
+ INSERT INTO sync_peer(public_key, address, tls_certificate)
706
+ (
707
+ SELECT lower(:pubkey), :address, :tls_certificate
708
+ %s
709
+ ) RETURNING (1)
710
+ )
711
+ SELECT CASE WHEN EXISTS (SELECT * FROM inserted) THEN 0
712
+ %s
713
+ ELSE 1 END AS result)" ,
714
+ {(boost::format (R"( has_perm AS (%s),)" )
715
+ % checkAccountRolePermission (Role::kAddPeer , " :creator" ))
716
+ .str (),
717
+ " WHERE (SELECT * FROM has_perm)" ,
718
+ " WHEN NOT (SELECT * from has_perm) THEN 2" });
719
+
700
720
compare_and_set_account_detail_statements_ = makeCommandStatements (
701
721
sql_,
702
722
R"(
@@ -1176,6 +1196,40 @@ namespace iroha {
1176
1196
R"( AND (SELECT * FROM has_perm))" ,
1177
1197
R"( WHEN NOT (SELECT * FROM has_perm) THEN 2 )" });
1178
1198
1199
+ remove_sync_peer_statements_ = makeCommandStatements (
1200
+ sql_,
1201
+ R"(
1202
+ WITH %s
1203
+ removed AS (
1204
+ DELETE FROM sync_peer WHERE public_key = lower(:pubkey)
1205
+ %s
1206
+ RETURNING (1)
1207
+ )
1208
+ SELECT CASE
1209
+ WHEN EXISTS (SELECT * FROM removed) THEN 0
1210
+ %s
1211
+ ELSE 1
1212
+ END AS result)" ,
1213
+ {(boost::format (R"(
1214
+ has_perm AS (%s),
1215
+ get_peer AS (
1216
+ SELECT * from sync_peer WHERE public_key = lower(:pubkey) LIMIT 1
1217
+ ),
1218
+ check_peers AS (
1219
+ SELECT 1 WHERE (SELECT COUNT(*) FROM sync_peer) > 0
1220
+ ),)" )
1221
+ % checkAccountRolePermission (
1222
+ Role::kAddPeer , Role::kRemovePeer , " :creator" ))
1223
+ .str (),
1224
+ R"(
1225
+ AND (SELECT * FROM has_perm)
1226
+ AND EXISTS (SELECT * FROM get_peer)
1227
+ AND EXISTS (SELECT * FROM check_peers))" ,
1228
+ R"(
1229
+ WHEN NOT EXISTS (SELECT * from get_peer) THEN 3
1230
+ WHEN NOT EXISTS (SELECT * from check_peers) THEN 4
1231
+ WHEN NOT (SELECT * from has_perm) THEN 2)" });
1232
+
1179
1233
set_quorum_statements_ = makeCommandStatements (
1180
1234
sql_,
1181
1235
R"(
@@ -1499,8 +1553,12 @@ namespace iroha {
1499
1553
bool do_validation) {
1500
1554
auto &peer = command.peer ();
1501
1555
1502
- StatementExecutor executor (
1503
- add_peer_statements_, do_validation, " AddPeer" , perm_converter_);
1556
+ StatementExecutor executor (peer.isSyncingPeer ()
1557
+ ? add_sync_peer_statements_
1558
+ : add_peer_statements_,
1559
+ do_validation,
1560
+ " AddPeer" ,
1561
+ perm_converter_);
1504
1562
executor.use (" creator" , creator_account_id);
1505
1563
executor.use (" address" , peer.address ());
1506
1564
executor.use (" pubkey" , peer.pubkey ());
@@ -1795,6 +1853,16 @@ namespace iroha {
1795
1853
bool do_validation) {
1796
1854
auto pubkey = command.pubkey ();
1797
1855
1856
+ {
1857
+ StatementExecutor executor (remove_sync_peer_statements_,
1858
+ do_validation,
1859
+ " RemovePeer" ,
1860
+ perm_converter_);
1861
+ executor.use (" creator" , creator_account_id);
1862
+ executor.use (" pubkey" , pubkey);
1863
+ executor.execute ();
1864
+ }
1865
+
1798
1866
StatementExecutor executor (remove_peer_statements_,
1799
1867
do_validation,
1800
1868
" RemovePeer" ,
0 commit comments