func()

in oss/lib/restore.go [260:324]


func (rc *RestoreCommand) RunCommand() error {
	rc.monitor.init("Restore")
	encodingType, _ := GetString(OptionEncodingType, rc.command.options)
	recursive, _ := GetBool(OptionRecursion, rc.command.options)
	versionid, _ := GetString(OptionVersionId, rc.command.options)
	force, _ := GetBool(OptionForce, rc.command.options)
	objFileXml, _ := GetString(OptionObjectFile, rc.command.options)
	snapshotPath, _ := GetString(OptionSnapshotPath, rc.command.options)

	payer, _ := GetString(OptionRequestPayer, rc.command.options)
	if payer != "" {
		if payer != strings.ToLower(string(oss.Requester)) {
			return fmt.Errorf("invalid request payer: %s, please check", payer)
		}
		rc.commonOptions = append(rc.commonOptions, oss.RequestPayer(oss.PayerType(payer)))
	}

	var err error
	// load snapshot
	rc.reOption.snapshotPath = snapshotPath
	if rc.reOption.snapshotPath != "" {
		if rc.reOption.snapshotldb, err = leveldb.OpenFile(rc.reOption.snapshotPath, nil); err != nil {
			return fmt.Errorf("load snapshot error, reason: %s", err.Error())
		}
		defer rc.reOption.snapshotldb.Close()
	}

	cloudURL, err := CloudURLFromString(rc.command.args[0], encodingType)
	if err != nil {
		return err
	}
	if err = rc.checkOptions(cloudURL, recursive, force, versionid, objFileXml); err != nil {
		return err
	}
	bucket, err := rc.command.ossBucket(cloudURL.bucket)
	if err != nil {
		return err
	}

	// parse restore config
	if len(rc.command.args) > 1 {
		restoreConf := rc.command.args[1]
		err := rc.parseRestoreConf(restoreConf)
		if err != nil {
			return err
		}
	} else {
		rc.hasConfig = false
	}

	if objFileXml != "" {
		// check objFileXml and parse it
		if err := rc.checkObjectFile(objFileXml); err != nil {
			return err
		}
		recursive = true
		return rc.batchRestoreObjects(bucket, cloudURL, recursive)
	} else {
		if !recursive {
			return rc.ossRestoreObject(bucket, cloudURL.object, versionid, false)
		}

		return rc.batchRestoreObjects(bucket, cloudURL, recursive)
	}
}