mirror of
https://github.com/planetmint/planetmint.git
synced 2025-11-25 15:05:49 +00:00
Merge branch 'planetmint:planetmint-tarantool' into planetmint-tarantool
This commit is contained in:
commit
c9e40605fa
@ -12,5 +12,5 @@ configuration or the ``PLANETMINT_DATABASE_BACKEND`` environment variable.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Include the backend interfaces
|
# Include the backend interfaces
|
||||||
from planetmint.backend import schema, query # noqa
|
from planetmint.backend import schema, query, convert # noqa
|
||||||
from planetmint.backend.connection import connect, Connection
|
from planetmint.backend.connection import connect, Connection
|
||||||
|
|||||||
@ -12,7 +12,7 @@ from planetmint.config import Config
|
|||||||
from planetmint.backend.exceptions import ConnectionError
|
from planetmint.backend.exceptions import ConnectionError
|
||||||
from planetmint.transactions.common.exceptions import ConfigurationError
|
from planetmint.transactions.common.exceptions import ConfigurationError
|
||||||
|
|
||||||
BACKENDS = { # This is path to MongoDBClass
|
BACKENDS = {
|
||||||
'tarantool_db': 'planetmint.backend.tarantool.connection.TarantoolDBConnection',
|
'tarantool_db': 'planetmint.backend.tarantool.connection.TarantoolDBConnection',
|
||||||
'localmongodb': 'planetmint.backend.localmongodb.connection.LocalMongoDBConnection'
|
'localmongodb': 'planetmint.backend.localmongodb.connection.LocalMongoDBConnection'
|
||||||
}
|
}
|
||||||
@ -22,6 +22,7 @@ logger = logging.getLogger(__name__)
|
|||||||
|
|
||||||
def connect(host: str = None, port: int = None, login: str = None, password: str = None, backend: str = None,
|
def connect(host: str = None, port: int = None, login: str = None, password: str = None, backend: str = None,
|
||||||
**kwargs):
|
**kwargs):
|
||||||
|
try:
|
||||||
backend = backend
|
backend = backend
|
||||||
if not backend and kwargs and kwargs.get("backend"):
|
if not backend and kwargs and kwargs.get("backend"):
|
||||||
backend = kwargs["backend"]
|
backend = kwargs["backend"]
|
||||||
@ -30,6 +31,9 @@ def connect(host: str = None, port: int = None, login: str = None, password: str
|
|||||||
Config().init_config(backend)
|
Config().init_config(backend)
|
||||||
else:
|
else:
|
||||||
backend = Config().get()["database"]["backend"]
|
backend = Config().get()["database"]["backend"]
|
||||||
|
except KeyError:
|
||||||
|
logger.info("Backend {} not supported".format(backend))
|
||||||
|
raise ConfigurationError
|
||||||
|
|
||||||
host = host or Config().get()["database"]["host"] if not kwargs.get("host") else kwargs["host"]
|
host = host or Config().get()["database"]["host"] if not kwargs.get("host") else kwargs["host"]
|
||||||
port = port or Config().get()['database']['port'] if not kwargs.get("port") else kwargs["port"]
|
port = port or Config().get()['database']['port'] if not kwargs.get("port") else kwargs["port"]
|
||||||
@ -72,9 +76,6 @@ def connect(host: str = None, port: int = None, login: str = None, password: str
|
|||||||
except tarantool.error.NetworkError as network_err:
|
except tarantool.error.NetworkError as network_err:
|
||||||
print(f"Host {host}:{port} can't be reached.\n{network_err}")
|
print(f"Host {host}:{port} can't be reached.\n{network_err}")
|
||||||
raise network_err
|
raise network_err
|
||||||
except:
|
|
||||||
logger.info('Exception in _connect(): {}')
|
|
||||||
raise ConfigurationError
|
|
||||||
|
|
||||||
|
|
||||||
def _kwargs_parser(key, kwargs):
|
def _kwargs_parser(key, kwargs):
|
||||||
|
|||||||
26
planetmint/backend/convert.py
Normal file
26
planetmint/backend/convert.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Copyright © 2020 Interplanetary Database Association e.V.,
|
||||||
|
# Planetmint and IPDB software contributors.
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
|
||||||
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
||||||
|
|
||||||
|
"""Convert interfaces for backends."""
|
||||||
|
|
||||||
|
from functools import singledispatch
|
||||||
|
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset):
|
||||||
|
"""
|
||||||
|
This function is used for preparing assets,
|
||||||
|
before storing them to database.
|
||||||
|
"""
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
|
||||||
|
@singledispatch
|
||||||
|
def prepare_metadata(connection, transaction_id, metadata):
|
||||||
|
"""
|
||||||
|
This function is used for preparing metadata,
|
||||||
|
before storing them to database.
|
||||||
|
"""
|
||||||
|
raise NotImplementedError
|
||||||
@ -22,7 +22,7 @@ generic backend interfaces to the implementations in this module.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# Register the single dispatched modules on import.
|
# Register the single dispatched modules on import.
|
||||||
from planetmint.backend.localmongodb import schema, query # noqa
|
from planetmint.backend.localmongodb import schema, query, convert # noqa
|
||||||
|
|
||||||
# MongoDBConnection should always be accessed via
|
# MongoDBConnection should always be accessed via
|
||||||
# ``planetmint.backend.connect()``.
|
# ``planetmint.backend.connect()``.
|
||||||
|
|||||||
25
planetmint/backend/localmongodb/convert.py
Normal file
25
planetmint/backend/localmongodb/convert.py
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Copyright © 2020 Interplanetary Database Association e.V.,
|
||||||
|
# Planetmint and IPDB software contributors.
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
|
||||||
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
||||||
|
|
||||||
|
"""Convert implementation for MongoDb"""
|
||||||
|
|
||||||
|
from planetmint.backend.utils import module_dispatch_registrar
|
||||||
|
from planetmint.backend import convert
|
||||||
|
from planetmint.backend.localmongodb.connection import LocalMongoDBConnection
|
||||||
|
|
||||||
|
register_query = module_dispatch_registrar(convert)
|
||||||
|
|
||||||
|
|
||||||
|
@register_query(LocalMongoDBConnection)
|
||||||
|
def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset):
|
||||||
|
if transaction_type == filter_operation:
|
||||||
|
asset['id'] = transaction_id
|
||||||
|
return asset
|
||||||
|
|
||||||
|
|
||||||
|
@register_query(LocalMongoDBConnection)
|
||||||
|
def prepare_metadata(connection, transaction_id, metadata):
|
||||||
|
return {'id': transaction_id,
|
||||||
|
'metadata': metadata}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
# Register the single dispatched modules on import.
|
# Register the single dispatched modules on import.
|
||||||
from planetmint.backend.tarantool import query, connection, schema # noqa
|
from planetmint.backend.tarantool import query, connection, schema, convert # noqa
|
||||||
|
|
||||||
# MongoDBConnection should always be accessed via
|
# MongoDBConnection should always be accessed via
|
||||||
# ``planetmint.backend.connect()``.
|
# ``planetmint.backend.connect()``.
|
||||||
|
|||||||
26
planetmint/backend/tarantool/convert.py
Normal file
26
planetmint/backend/tarantool/convert.py
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Copyright © 2020 Interplanetary Database Association e.V.,
|
||||||
|
# Planetmint and IPDB software contributors.
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
|
||||||
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
||||||
|
|
||||||
|
"""Convert implementation for Tarantool"""
|
||||||
|
|
||||||
|
from planetmint.backend.utils import module_dispatch_registrar
|
||||||
|
from planetmint.backend import convert
|
||||||
|
from planetmint.backend.tarantool.connection import TarantoolDBConnection
|
||||||
|
|
||||||
|
register_query = module_dispatch_registrar(convert)
|
||||||
|
|
||||||
|
|
||||||
|
@register_query(TarantoolDBConnection)
|
||||||
|
def prepare_asset(connection, transaction_type, transaction_id, filter_operation, asset):
|
||||||
|
asset_id = transaction_id
|
||||||
|
if transaction_type != filter_operation:
|
||||||
|
asset_id = asset['id']
|
||||||
|
return tuple([asset, transaction_id, asset_id])
|
||||||
|
|
||||||
|
|
||||||
|
@register_query(TarantoolDBConnection)
|
||||||
|
def prepare_metadata(connection, transaction_id, metadata):
|
||||||
|
return {'id': transaction_id,
|
||||||
|
'metadata': metadata}
|
||||||
@ -22,6 +22,7 @@ except ImportError:
|
|||||||
import requests
|
import requests
|
||||||
|
|
||||||
import planetmint
|
import planetmint
|
||||||
|
from copy import deepcopy
|
||||||
from planetmint.config import Config
|
from planetmint.config import Config
|
||||||
from planetmint import backend, config_utils, fastquery
|
from planetmint import backend, config_utils, fastquery
|
||||||
from planetmint.models import Transaction
|
from planetmint.models import Transaction
|
||||||
@ -128,23 +129,29 @@ class Planetmint(object):
|
|||||||
txns = []
|
txns = []
|
||||||
assets = []
|
assets = []
|
||||||
txn_metadatas = []
|
txn_metadatas = []
|
||||||
|
|
||||||
for t in transactions:
|
for t in transactions:
|
||||||
transaction = t.tx_dict if t.tx_dict else rapidjson.loads(rapidjson.dumps(t.to_dict()))
|
transaction = t.tx_dict if t.tx_dict else rapidjson.loads(rapidjson.dumps(t.to_dict()))
|
||||||
|
|
||||||
asset = transaction.pop('asset')
|
asset = transaction.pop('asset')
|
||||||
asset_id = transaction['id']
|
|
||||||
if transaction['operation'] != t.CREATE:
|
|
||||||
asset_id = asset['id']
|
|
||||||
assets.append((asset,
|
|
||||||
transaction['id'],
|
|
||||||
asset_id))
|
|
||||||
|
|
||||||
metadata = transaction.pop('metadata')
|
metadata = transaction.pop('metadata')
|
||||||
txn_metadatas.append({'id': transaction['id'],
|
|
||||||
'metadata': metadata})
|
asset = backend.convert.prepare_asset(self.connection,
|
||||||
|
transaction_type=transaction["operation"],
|
||||||
|
transaction_id=transaction["id"],
|
||||||
|
filter_operation=t.CREATE,
|
||||||
|
asset=asset)
|
||||||
|
|
||||||
|
metadata = backend.convert.prepare_metadata(self.connection,
|
||||||
|
transaction_id=transaction["id"],
|
||||||
|
metadata=metadata)
|
||||||
|
|
||||||
|
txn_metadatas.append(metadata)
|
||||||
|
assets.append(asset)
|
||||||
txns.append(transaction)
|
txns.append(transaction)
|
||||||
|
|
||||||
backend.query.store_metadatas(self.connection, txn_metadatas)
|
backend.query.store_metadatas(self.connection, txn_metadatas)
|
||||||
|
if assets:
|
||||||
backend.query.store_assets(self.connection, assets)
|
backend.query.store_assets(self.connection, assets)
|
||||||
return backend.query.store_transactions(self.connection, txns)
|
return backend.query.store_transactions(self.connection, txns)
|
||||||
|
|
||||||
@ -511,5 +518,4 @@ class Planetmint(object):
|
|||||||
return backend.query.delete_elections(self.connection, height)
|
return backend.query.delete_elections(self.connection, height)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Block = namedtuple('Block', ('app_hash', 'height', 'transactions'))
|
Block = namedtuple('Block', ('app_hash', 'height', 'transactions'))
|
||||||
|
|||||||
@ -10,7 +10,7 @@ def test_get_connection_raises_a_configuration_error(monkeypatch):
|
|||||||
from planetmint.transactions.common.exceptions import ConfigurationError
|
from planetmint.transactions.common.exceptions import ConfigurationError
|
||||||
from planetmint.backend.connection import connect
|
from planetmint.backend.connection import connect
|
||||||
with pytest.raises(ConfigurationError):
|
with pytest.raises(ConfigurationError):
|
||||||
connect('msaccess', 'localhost', '1337', 'mydb')
|
connect('localhost', '1337', 'mydb', 'password', 'msaccess')
|
||||||
|
|
||||||
with pytest.raises(ConfigurationError):
|
with pytest.raises(ConfigurationError):
|
||||||
# We need to force a misconfiguration here
|
# We need to force a misconfiguration here
|
||||||
@ -18,4 +18,4 @@ def test_get_connection_raises_a_configuration_error(monkeypatch):
|
|||||||
{'catsandra':
|
{'catsandra':
|
||||||
'planetmint.backend.meowmeow.Catsandra'})
|
'planetmint.backend.meowmeow.Catsandra'})
|
||||||
|
|
||||||
connect('catsandra', 'localhost', '1337', 'mydb')
|
connect('localhost', '1337', 'mydb', 'password', 'catsandra')
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user