def _validate_schema(schema, body):
    """ Validate data against a schema """

    # Note
    #
    # Schema validation is currently the major CPU bottleneck of
    # BigchainDB. the `jsonschema` library validates python data structures
    # directly and produces nice error messages, but validation takes 4+ ms
    # per transaction which is pretty slow. The rapidjson library validates
    # much faster at 1.5ms, however it produces _very_ poor error messages.
    # For this reason we use both, rapidjson as an optimistic pathway and
    # jsonschema as a fallback in case there is a failure, so we can produce
    # a helpful error message.

    try:
        schema[1].validate(rapidjson.dumps(body))
    except ValueError as exc:
        try:
            jsonschema.validate(body, schema[0])
        except jsonschema.ValidationError as exc2:
            raise SchemaValidationError(str(exc2)) from exc2
        logger.warning(
            'code problem: jsonschema did not raise an exception, wheras rapidjson raised %s',
            exc)
        raise SchemaValidationError(str(exc)) from exc
Esempio n. 2
0
def validate_transaction_schema(tx_body):
    """ Validate a transaction dict against a schema """
    try:
        jsonschema.validate(tx_body, TX_SCHEMA)
    except jsonschema.ValidationError as exc:
        raise SchemaValidationError(str(exc)) from exc
Esempio n. 3
0
def _validate_schema(schema, body):
    """ Validate data against a schema """
    try:
        jsonschema.validate(body, schema)
    except jsonschema.ValidationError as exc:
        raise SchemaValidationError(str(exc)) from exc