Ejemplo n.º 1
0
    def encode_message(cls, msg, stream_id, protocol_version, compressor):
        """
        Encodes a message using the specified frame parameters, and compressor

        :param msg: the message, typically of cassandra.protocol._MessageType, generated by the driver
        :param stream_id: protocol stream id for the frame header
        :param protocol_version: version for the frame header, and used encoding contents
        :param compressor: optional compression function to be used on the body
        :return:
        """
        flags = 0
        body = io.BytesIO()
        if msg.custom_payload:
            if protocol_version < 4:
                raise UnsupportedOperation(
                    "Custom key/value payloads can only be used with protocol version 4 or higher"
                )
            flags |= CUSTOM_PAYLOAD_FLAG
            write_bytesmap(body, msg.custom_payload)
        msg.send_body(body, protocol_version)
        body = body.getvalue()

        if compressor and len(body) > 0:
            body = compressor(body)
            flags |= COMPRESSED_FLAG

        if msg.tracing:
            flags |= TRACING_FLAG

        buff = io.BytesIO()
        cls._write_header(buff, protocol_version, flags, stream_id, msg.opcode,
                          len(body))
        buff.write(body)

        return buff.getvalue()
Ejemplo n.º 2
0
 def send_body(self, f, protocol_version):
     write_string(f, self.query_id)
     if protocol_version == 1:
         if self.serial_consistency_level:
             raise UnsupportedOperation(
                 "Serial consistency levels require the use of protocol version "
                 "2 or higher. Consider setting Cluster.protocol_version to 2 "
                 "to support serial consistency levels.")
         if self.fetch_size or self.paging_state:
             raise UnsupportedOperation(
                 "Automatic query paging may only be used with protocol version "
                 "2 or higher. Consider setting Cluster.protocol_version to 2."
             )
         write_short(f, len(self.query_params))
         for param in self.query_params:
             write_value(f, param)
         write_consistency_level(f, self.consistency_level)
     else:
         write_consistency_level(f, self.consistency_level)
         flags = _VALUES_FLAG
         if self.serial_consistency_level:
             flags |= _WITH_SERIAL_CONSISTENCY_FLAG
         if self.fetch_size:
             flags |= _PAGE_SIZE_FLAG
         if self.paging_state:
             flags |= _WITH_PAGING_STATE_FLAG
         if self.timestamp is not None:
             if protocol_version >= 3:
                 flags |= _PROTOCOL_TIMESTAMP
             else:
                 raise UnsupportedOperation(
                     "Protocol-level timestamps may only be used with protocol version "
                     "3 or higher. Consider setting Cluster.protocol_version to 3."
                 )
         write_byte(f, flags)
         write_short(f, len(self.query_params))
         for param in self.query_params:
             write_value(f, param)
         if self.fetch_size:
             write_int(f, self.fetch_size)
         if self.paging_state:
             write_longstring(f, self.paging_state)
         if self.serial_consistency_level:
             write_consistency_level(f, self.serial_consistency_level)
         if self.timestamp is not None:
             write_long(f, self.timestamp)
Ejemplo n.º 3
0
 def send_body(self, f, protocol_version):
     if protocol_version > 1:
         raise UnsupportedOperation(
             "Credentials-based authentication is not supported with "
             "protocol version 2 or higher.  Use the SASL authentication "
             "mechanism instead.")
     write_short(f, len(self.creds))
     for credkey, credval in self.creds.items():
         write_string(f, credkey)
         write_string(f, credval)
Ejemplo n.º 4
0
    def send_body(self, f, protocol_version):
        write_longstring(f, self.query)
        write_consistency_level(f, self.consistency_level)
        flags = 0x00
        if self.serial_consistency_level:
            if protocol_version >= 2:
                flags |= _WITH_SERIAL_CONSISTENCY_FLAG
            else:
                raise UnsupportedOperation(
                    "Serial consistency levels require the use of protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2 "
                    "to support serial consistency levels.")

        if self.fetch_size:
            if protocol_version >= 2:
                flags |= _PAGE_SIZE_FLAG
            else:
                raise UnsupportedOperation(
                    "Automatic query paging may only be used with protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2."
                )

        if self.paging_state:
            if protocol_version >= 2:
                flags |= _WITH_PAGING_STATE_FLAG
            else:
                raise UnsupportedOperation(
                    "Automatic query paging may only be used with protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2."
                )

        if self.timestamp is not None:
            flags |= _PROTOCOL_TIMESTAMP

        write_byte(f, flags)
        if self.fetch_size:
            write_int(f, self.fetch_size)
        if self.paging_state:
            write_longstring(f, self.paging_state)
        if self.serial_consistency_level:
            write_consistency_level(f, self.serial_consistency_level)
        if self.timestamp is not None:
            write_long(f, self.timestamp)
Ejemplo n.º 5
0
 def _write_query_params(self, f, protocol_version):
     if protocol_version == 1:
         if self.serial_consistency_level:
             raise UnsupportedOperation(
                 "Serial consistency levels require the use of protocol version "
                 "2 or higher. Consider setting Cluster.protocol_version to 2 "
                 "to support serial consistency levels.")
         if self.fetch_size or self.paging_state:
             raise UnsupportedOperation(
                 "Automatic query paging may only be used with protocol version "
                 "2 or higher. Consider setting Cluster.protocol_version to 2."
             )
         write_short(f, len(self.query_params))
         for param in self.query_params:
             write_value(f, param)
         write_consistency_level(f, self.consistency_level)
     else:
         super(ExecuteMessage,
               self)._write_query_params(f, protocol_version)
Ejemplo n.º 6
0
    def send_body(self, f, protocol_version):
        write_byte(f, self.batch_type.value)
        write_short(f, len(self.queries))
        for prepared, string_or_query_id, params in self.queries:
            if not prepared:
                write_byte(f, 0)
                write_longstring(f, string_or_query_id)
            else:
                write_byte(f, 1)
                write_short(f, len(string_or_query_id))
                f.write(string_or_query_id)
            write_short(f, len(params))
            for param in params:
                write_value(f, param)

        write_consistency_level(f, self.consistency_level)
        if protocol_version >= 3:
            flags = 0
            if self.serial_consistency_level:
                flags |= _WITH_SERIAL_CONSISTENCY_FLAG
            if self.timestamp is not None:
                flags |= _PROTOCOL_TIMESTAMP
            if self.keyspace:
                if ProtocolVersion.uses_keyspace_flag(protocol_version):
                    flags |= _WITH_KEYSPACE_FLAG
                else:
                    raise UnsupportedOperation(
                        "Keyspaces may only be set on queries with protocol version "
                        "5 or higher. Consider setting Cluster.protocol_version to 5."
                    )

            if ProtocolVersion.uses_int_query_flags(protocol_version):
                write_int(f, flags)
            else:
                write_byte(f, flags)

            if self.serial_consistency_level:
                write_consistency_level(f, self.serial_consistency_level)
            if self.timestamp is not None:
                write_long(f, self.timestamp)

            if ProtocolVersion.uses_keyspace_flag(protocol_version):
                if self.keyspace is not None:
                    write_string(f, self.keyspace)
Ejemplo n.º 7
0
    def send_body(self, f, protocol_version):
        write_longstring(f, self.query)
        write_consistency_level(f, self.consistency_level)
        flags = 0x00
        if self._query_params is not None:
            flags |= _VALUES_FLAG  # also v2+, but we're only setting params internally right now

        if self.serial_consistency_level:
            if protocol_version >= 2:
                flags |= _WITH_SERIAL_CONSISTENCY_FLAG
            else:
                raise UnsupportedOperation(
                    "Serial consistency levels require the use of protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2 "
                    "to support serial consistency levels.")

        if self.fetch_size:
            if protocol_version >= 2:
                flags |= _PAGE_SIZE_FLAG
            else:
                raise UnsupportedOperation(
                    "Automatic query paging may only be used with protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2."
                )

        if self.paging_state:
            if protocol_version >= 2:
                flags |= _WITH_PAGING_STATE_FLAG
            else:
                raise UnsupportedOperation(
                    "Automatic query paging may only be used with protocol version "
                    "2 or higher. Consider setting Cluster.protocol_version to 2."
                )

        if self.timestamp is not None:
            flags |= _PROTOCOL_TIMESTAMP

        if self.keyspace is not None:
            if ProtocolVersion.uses_keyspace_flag(protocol_version):
                flags |= _WITH_KEYSPACE_FLAG
            else:
                raise UnsupportedOperation(
                    "Keyspaces may only be set on queries with protocol version "
                    "5 or higher. Consider setting Cluster.protocol_version to 5."
                )

        if ProtocolVersion.uses_int_query_flags(protocol_version):
            write_uint(f, flags)
        else:
            write_byte(f, flags)

        if self._query_params is not None:
            write_short(f, len(self._query_params))
            for param in self._query_params:
                write_value(f, param)

        if self.fetch_size:
            write_int(f, self.fetch_size)
        if self.paging_state:
            write_longstring(f, self.paging_state)
        if self.serial_consistency_level:
            write_consistency_level(f, self.serial_consistency_level)
        if self.timestamp is not None:
            write_long(f, self.timestamp)
        if self.keyspace is not None:
            write_string(f, self.keyspace)