func()

in go/storage/rediscache.go [171:213]


func (ec *RedisCache) Migrate(logData *types.CTLogMetadata) error {
	logUrlObj, err := url.Parse(logData.URL)
	if err != nil {
		return err
	}

	shortUrl := logUrlObj.Host + strings.TrimRight(logUrlObj.Path, "/")
	newKey := shortUrlToLogKey(shortUrl)
	_, err = ec.client.Get(newKey).Bytes()
	if err != nil && err != redis.Nil {
		return err
	}
	haveNew := err != redis.Nil

	oldKey := newKey + "/"
	oldData, err := ec.client.Get(oldKey).Bytes()
	if err != nil && err != redis.Nil {
		return err
	}
	haveOld := err != redis.Nil

	// If we have both new and old data, then just delete old.
	if haveOld && haveNew {
		ec.client.Del(oldKey)
		return nil
	}

	// If we have old data but not new, migrate.
	if haveOld {
		var log types.CTLogState
		if err = json.Unmarshal(oldData, &log); err != nil {
			return err
		}
		if err = ec.StoreLogState(&log); err != nil {
			return err
		}
		ec.client.Del(oldKey)
		return nil
	}

	// No data. Nothing to do.
	return nil
}