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 }