docs: 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