예제 #1
0
    def prepareQueueMessageList(self, activity_tool, message_list):
        db = activity_tool.getSQLConnection()
        quote = db.string_literal

        def insert(reset_uid):
            values = self._insert_separator.join(values_list)
            del values_list[:]
            for _ in xrange(UID_ALLOCATION_TRY_COUNT):
                if reset_uid:
                    reset_uid = False
                    # Overflow will result into IntegrityError.
                    db.query("SET @uid := %s" % getrandbits(UID_SAFE_BITSIZE))
                try:
                    db.query(self._insert_template % (self.sql_table, values))
                except MySQLdb.IntegrityError as e:
                    if e.args[0] != DUP_ENTRY:
                        raise
                    reset_uid = True
                else:
                    break
            else:
                raise ValueError(
                    "Maximum retry for prepareQueueMessageList reached")

        i = 0
        reset_uid = True
        values_list = []
        max_payload = self._insert_max_payload
        sep_len = len(self._insert_separator)
        hasDependency = self._hasDependency
        for m in message_list:
            if m.is_registered:
                active_process_uid = m.active_process_uid
                date = m.activity_kw.get('at_date')
                row = ','.join(
                    ('@uid+%s' % i, quote('/'.join(m.object_path)), 'NULL' if
                     active_process_uid is None else str(active_process_uid),
                     "UTC_TIMESTAMP(6)"
                     if date is None else quote(render_datetime(date)),
                     quote(m.method_id), '-1' if hasDependency(m) else '0',
                     str(m.activity_kw.get('priority', 1)),
                     quote(m.getGroupId()), quote(m.activity_kw.get('tag',
                                                                    '')),
                     quote(m.activity_kw.get('signature', '')),
                     quote(m.activity_kw.get('serialization_tag',
                                             '')), quote(Message.dump(m))))
                i += 1
                n = sep_len + len(row)
                max_payload -= n
                if max_payload < 0:
                    if values_list:
                        insert(reset_uid)
                        reset_uid = False
                        max_payload = self._insert_max_payload - n
                    else:
                        raise ValueError(
                            "max_allowed_packet too small to insert message")
                values_list.append(row)
        if values_list:
            insert(reset_uid)
예제 #2
0
파일: SQLBase.py 프로젝트: yuanpli/erp5
      if m.is_registered:
        active_process_uid = m.active_process_uid
        date = m.activity_kw.get('at_date')
        row = ','.join((
          '@uid+%s' % i,
          quote('/'.join(m.object_path)),
          'NULL' if active_process_uid is None else str(active_process_uid),
          "UTC_TIMESTAMP(6)" if date is None else quote(render_datetime(date)),
          quote(m.method_id),
          '-1' if hasDependency(m) else '0',
          str(m.activity_kw.get('priority', 1)),
          str(m.activity_kw.get('node', 0)),
          quote(m.getGroupId()),
          quote(m.activity_kw.get('tag', '')),
          quote(m.activity_kw.get('serialization_tag', '')),
          quote(Message.dump(m))))
        i += 1
        n = sep_len + len(row)
        max_payload -= n
        if max_payload < 0:
          if values_list:
            insert(reset_uid)
            reset_uid = False
            max_payload = self._insert_max_payload - n
          else:
            raise ValueError("max_allowed_packet too small to insert message")
        values_list.append(row)
    if values_list:
      insert(reset_uid)

  def _getMessageList(self, db, count=1000, src__=0, **kw):