Queue an extended datapoint (ie. a string), return True/False for success.

        Arguments:
        address -- uint64_t representing a unique metric.
        timestamp -- uint64_t representing number of nanoseconds (10^-9) since epoch.
        value -- string value being stored.

def send_extended(self, address, timestamp, value):
        """Queue an extended datapoint (ie. a string), return True/False for success.

        Arguments:
        address -- uint64_t representing a unique metric.
        timestamp -- uint64_t representing number of nanoseconds (10^-9) since epoch.
        value -- string value being stored.
        """
        if self.marquise_ctx is None:
            raise ValueError("Attempted to write to a closed Marquise handle.")

        self.__debug("Supplied address: %s" % address)

        if value is None:
            raise TypeError("Can't store None as a value.")

        value = str(value)

        if timestamp is None:
            timestamp = self.current_timestamp()

        # Use cast() here to make up the C datatypes for dispatch.
        # FFI will take care of converting them to the right endianness. I think.
        c_address =   FFI.cast("uint64_t", address)
        c_timestamp = FFI.cast("uint64_t", timestamp)
        # c_value needs to be a byte array with a length in bytes
        c_value =     cstring(value)
        c_length =    FFI.cast("size_t", len_cstring(value))
        self.__debug("Sending extended value '%s' with length of %d" % (value, c_length))

        success = MARQUISE_SEND_EXTENDED(self.marquise_ctx, c_address, c_timestamp, c_value, c_length)
        if success != 0:
            self.__debug("send_extended returned %d, raising exception" % success)
            raise RuntimeError("send_extended was unsuccessful, errno is %d" % FFI.errno)
        self.__debug("send_extended returned %d" % success)

        return True