Exemple #1
0
func (self *mysqlMessageCache) CacheMessage(service, username string, mc *rpc.MessageContainer, ttl time.Duration) (id string, err error) {
	data, err := json.Marshal(mc.Message)
	if err != nil {
		return
	}

	if mc.Id == "" {
		id = randomId()
		mc.Id = id
	} else {
		id = mc.Id
	}

	uniqid := getUniqMessageId(service, username, id)
	if len(uniqid) > maxMessageIdLength {
		err = fmt.Errorf("message id length is greater than %v characters", maxMessageIdLength)
		return
	}

	if len(username) > maxUsernameLength {
		err = fmt.Errorf("user %v's name is too long", username)
		return
	}
	if len(mc.Sender) > maxUsernameLength {
		err = fmt.Errorf("user %v's name is too long", mc.Sender)
		return
	}
	if len(service) > maxServicenameLength {
		err = fmt.Errorf("service %v's name is too long", service)
		return
	}
	if len(mc.SenderService) > maxServicenameLength {
		err = fmt.Errorf("service %v's name is too long", mc.SenderService)
		return
	}

	now := time.Now()
	mc.Birthday = now
	deadline := now.Add(ttl)
	if ttl < 1*time.Second {
		// max possible value for int64
		deadline = time.Unix(0, 0)
	}
	var result sql.Result

	err = self.expBackoffRetry(3, 2, func() error {
		result, err = self.cacheStmt.Exec(uniqid, id, service, username, mc.SenderService, mc.Sender, now.Unix(), deadline.Unix(), data)
		return err
	})
	if err != nil {
		err = fmt.Errorf("Data base error: %v; insert error", err)
		return
	}
	n, err := result.RowsAffected()
	if err != nil {
		return
	}
	if n != 1 {
		err = fmt.Errorf("affected %v rows, which is weird", n)
		return
	}
	return
}