示例#1
0
  def add(self, task, transactional=False):
    """Adds a Task to this Queue.

    Args:
      task: The Task to add.
      transactional: If false adds the task to a queue irrespectively to the
        enclosing transaction success or failure. (optional)

    Returns:
      The Task that was supplied to this method.

    Raises:
      BadTaskStateError if the Task has already been added to a queue.
      Error-subclass on application errors.
    """
    if task.was_enqueued:
      raise BadTaskStateError('Task has already been enqueued')

    request = taskqueue_service_pb.TaskQueueAddRequest()
    response = taskqueue_service_pb.TaskQueueAddResponse()

    adjusted_url = task.url
    if task.on_queue_url:
      adjusted_url = self.__url + task.url


    request.set_queue_name(self.__name)
    request.set_eta_usec(int(time.mktime(task.eta.utctimetuple())) * 10**6)
    request.set_method(_METHOD_MAP.get(task.method))
    request.set_url(adjusted_url)

    if task.name:
      request.set_task_name(task.name)
    else:
      request.set_task_name('')

    if task.payload:
      request.set_body(task.payload)
    for key, value in _flatten_params(task.headers):
      header = request.add_header()
      header.set_key(key)
      header.set_value(value)

    if transactional:
      from google.appengine.api import datastore
      datastore._MaybeSetupTransaction(request, [])

    if request.has_transaction() and task.name:
      raise InvalidTaskNameError('Task bound to a transaction cannot be named.')

    call_tuple = ('taskqueue', 'Add', request, response)
    apiproxy_stub_map.apiproxy.GetPreCallHooks().Call(*call_tuple)
    try:
      apiproxy_stub_map.MakeSyncCall(*call_tuple)
    except apiproxy_errors.ApplicationError, e:
      self.__TranslateError(e)
示例#2
0
    def add(self, task, transactional=False):
        """Adds a Task to this Queue.

    Args:
      task: The Task to add.
      transactional: If false adds the task to a queue irrespectively to the
        enclosing transaction success or failure. (optional)

    Returns:
      The Task that was supplied to this method.

    Raises:
      BadTaskStateError if the Task has already been added to a queue.
      Error-subclass on application errors.
    """
        if task.was_enqueued:
            raise BadTaskStateError('Task has already been enqueued')

        request = taskqueue_service_pb.TaskQueueAddRequest()
        response = taskqueue_service_pb.TaskQueueAddResponse()

        adjusted_url = task.url
        if task.on_queue_url:
            adjusted_url = self.__url + task.url

        request.set_queue_name(self.__name)
        request.set_eta_usec(int(time.mktime(task.eta.utctimetuple())) * 10**6)
        request.set_method(_METHOD_MAP.get(task.method))
        request.set_url(adjusted_url)

        if task.name:
            request.set_task_name(task.name)
        else:
            request.set_task_name('')

        if task.payload:
            request.set_body(task.payload)
        for key, value in _flatten_params(task.headers):
            header = request.add_header()
            header.set_key(key)
            header.set_value(value)

        if transactional:
            from google.appengine.api import datastore
            datastore._MaybeSetupTransaction(request, [])

        if request.has_transaction() and task.name:
            raise InvalidTaskNameError(
                'Task bound to a transaction cannot be named.')

        call_tuple = ('taskqueue', 'Add', request, response)
        try:
            apiproxy_stub_map.MakeSyncCall(*call_tuple)
        except apiproxy_errors.ApplicationError, e:
            self.__TranslateError(e)
示例#3
0
    def make_call(self):
        keys, multiple = NormalizeAndTypeCheckKeys(self._keys)
        self.multiple = multiple

        # TODO handle
        #if multiple and not keys:
        #    return []
        req = datastore_pb.GetRequest()
        req.key_list().extend([key._Key__reference for key in keys])
        _MaybeSetupTransaction(req, keys)

        resp = datastore_pb.GetResponse()
        self.rpc.make_call('Get', req, resp)
示例#4
0
    def make_call(self):
        keys, multiple = NormalizeAndTypeCheckKeys(self._keys)
        self.multiple = multiple

        # TODO handle
        #if multiple and not keys:
        #    return []
        req = datastore_pb.GetRequest()
        req.key_list().extend([key._Key__reference for key in keys])
        _MaybeSetupTransaction(req, keys)

        resp = datastore_pb.GetResponse()
        self.rpc.make_call('Get', req, resp)
示例#5
0
    def __FillAddRequest(self, task, task_request, transactional):
        """Populates a TaskQueueAddRequest with the data from a Task instance.

    Args:
      task: The Task instance to use as a source for the data to be added to
        task_request.
      task_request: The taskqueue_service_pb.TaskQueueAddRequest to populate.
      transactional: If true then populates the task_request.transaction message
        with information from the enclosing transaction (if any).

    Raises:
      BadTaskStateError: If the task was already added to a Queue.
      BadTransactionStateError: If the transactional argument is True and there
        is no enclosing transaction.
      InvalidTaskNameError: If the transactional argument is True and the task
        is named.
    """
        if task.was_enqueued:
            raise BadTaskStateError('Task has already been enqueued')

        adjusted_url = task.url
        if task.on_queue_url:
            adjusted_url = self.__url + task.url

        task_request.set_queue_name(self.__name)
        task_request.set_eta_usec(long(task.eta_posix * 1e6))
        task_request.set_method(_METHOD_MAP.get(task.method))
        task_request.set_url(adjusted_url)

        if task.name:
            task_request.set_task_name(task.name)
        else:
            task_request.set_task_name('')

        if task.payload:
            task_request.set_body(task.payload)
        for key, value in _flatten_params(task.headers):
            header = task_request.add_header()
            header.set_key(key)
            header.set_value(value)

        if task.retry_options:
            self.__FillTaskQueueRetryParameters(
                task.retry_options, task_request.mutable_retry_parameters())

        if self._app:
            task_request.set_app_id(self._app)

        if transactional:
            from google.appengine.api import datastore
            if not datastore._MaybeSetupTransaction(task_request, []):
                raise BadTransactionStateError(
                    'Transactional adds are not allowed outside of transactions'
                )

        if task_request.has_transaction() and task.name:
            raise InvalidTaskNameError(
                'Task bound to a transaction cannot be named.')
示例#6
0
  def __FillAddRequest(self, task, task_request, transactional):
    """Populates a TaskQueueAddRequest with the data from a Task instance.

    Args:
      task: The Task instance to use as a source for the data to be added to
        task_request.
      task_request: The taskqueue_service_pb.TaskQueueAddRequest to populate.
      transactional: If true then populates the task_request.transaction message
        with information from the enclosing transaction (if any).

    Raises:
      BadTaskStateError: If the task was already added to a Queue.
      BadTransactionStateError: If the transactional argument is True and there
        is no enclosing transaction.
      InvalidTaskNameError: If the transactional argument is True and the task
        is named.
    """
    if task.was_enqueued:
      raise BadTaskStateError('Task has already been enqueued')

    adjusted_url = task.url
    if task.on_queue_url:
      adjusted_url = self.__url + task.url


    task_request.set_queue_name(self.__name)
    task_request.set_eta_usec(long(task.eta_posix * 1e6))
    task_request.set_method(_METHOD_MAP.get(task.method))
    task_request.set_url(adjusted_url)

    if task.name:
      task_request.set_task_name(task.name)
    else:
      task_request.set_task_name('')

    if task.payload:
      task_request.set_body(task.payload)
    for key, value in _flatten_params(task.headers):
      header = task_request.add_header()
      header.set_key(key)
      header.set_value(value)

    if task.retry_options:
      self.__FillTaskQueueRetryParameters(
          task.retry_options, task_request.mutable_retry_parameters())

    if self._app:
      task_request.set_app_id(self._app)

    if transactional:
      from google.appengine.api import datastore
      if not datastore._MaybeSetupTransaction(task_request, []):
        raise BadTransactionStateError(
            'Transactional adds are not allowed outside of transactions')

    if task_request.has_transaction() and task.name:
      raise InvalidTaskNameError(
          'Task bound to a transaction cannot be named.')
示例#7
0
    def make_call(self):
        entities, multiple = NormalizeAndTypeCheck(self._entities, Entity)
        self.multiple = multiple

        # TODO handle this
        #if multiple and not entities:
        #  return []

        for entity in entities:
            if not entity.kind() or not entity.app_id_namespace():
                raise datastore_errors.BadRequestError(
                    'App and kind must not be empty, in entity: %s' % entity)

        req = datastore_pb.PutRequest()
        req.entity_list().extend([e._ToPb() for e in entities])

        keys = [e.key() for e in entities]
        self.tx = _MaybeSetupTransaction(req, keys)

        resp = datastore_pb.PutResponse()
        self.rpc.make_call('Put', req, resp)
示例#8
0
    def make_call(self):
        entities, multiple = NormalizeAndTypeCheck(self._entities, Entity)
        self.multiple = multiple

        # TODO handle this
        #if multiple and not entities:
        #  return []

        for entity in entities:
          if not entity.kind() or not entity.app_id_namespace():
            raise datastore_errors.BadRequestError(
                'App and kind must not be empty, in entity: %s' % entity)

        req = datastore_pb.PutRequest()
        req.entity_list().extend([e._ToPb() for e in entities])
        
        keys = [e.key() for e in entities]
        self.tx = _MaybeSetupTransaction(req, keys)

        resp = datastore_pb.PutResponse()
        self.rpc.make_call('Put', req, resp)
示例#9
0
    def __FillTaskCommon(self, task, task_request, transactional):
        """Fills common fields for both push tasks and pull tasks."""
        if self._app:
            task_request.set_app_id(self._app)
        task_request.set_queue_name(self.__name)
        task_request.set_eta_usec(long(task.eta_posix * 1e6))
        if task.name:
            task_request.set_task_name(task.name)
        else:
            task_request.set_task_name('')

        if transactional:
            from google.appengine.api import datastore
            if not datastore._MaybeSetupTransaction(task_request, []):
                raise BadTransactionStateError(
                    'Transactional adds are not allowed outside of transactions'
                )

        if task_request.has_transaction() and task.name:
            raise InvalidTaskNameError(
                'Task bound to a transaction cannot be named.')
示例#10
0
文件: taskqueue.py 项目: Agana/MyBlog
  def __FillTaskCommon(self, task, task_request, transactional):
    """Fills common fields for both push tasks and pull tasks."""
    if self._app:
      task_request.set_app_id(self._app)
    task_request.set_queue_name(self.__name)
    task_request.set_eta_usec(long(task.eta_posix * 1e6))
    if task.name:
      task_request.set_task_name(task.name)
    else:
      task_request.set_task_name('')



    if transactional:
      from google.appengine.api import datastore
      if not datastore._MaybeSetupTransaction(task_request, []):
        raise BadTransactionStateError(
            'Transactional adds are not allowed outside of transactions')

    if task_request.has_transaction() and task.name:
      raise InvalidTaskNameError(
          'Task bound to a transaction cannot be named.')