func NewReadOnlyFile()

in oss/filelike.go [71:147]


func NewReadOnlyFile(ctx context.Context, c OpenFileAPIClient, bucket string, key string, optFns ...func(*OpenOptions)) (*ReadOnlyFile, error) {
	options := OpenOptions{
		Offset:                  0,
		EnablePrefetch:          false,
		PrefetchNum:             DefaultPrefetchNum,
		ChunkSize:               DefaultPrefetchChunkSize,
		PrefetchThreshold:       DefaultPrefetchThreshold,
		OutOfOrderReadThreshold: DefaultOutOfOrderReadThreshold,
	}

	for _, fn := range optFns {
		fn(&options)
	}

	if options.EnablePrefetch {
		var chunkSize int64
		if options.ChunkSize > 0 {
			chunkSize = (options.ChunkSize + AsyncReadeBufferSize - 1) / AsyncReadeBufferSize * AsyncReadeBufferSize
		} else {
			chunkSize = DefaultPrefetchChunkSize
		}
		options.ChunkSize = chunkSize

		if options.PrefetchNum <= 0 {
			options.PrefetchNum = DefaultPrefetchNum
		}

		if options.OutOfOrderReadThreshold <= int64(0) {
			options.OutOfOrderReadThreshold = DefaultOutOfOrderReadThreshold
		}
	}

	f := &ReadOnlyFile{
		client:  c,
		context: ctx,

		bucket:       bucket,
		key:          key,
		versionId:    options.VersionId,
		requestPayer: options.RequestPayer,

		offset: options.Offset,

		enablePrefetch:    options.EnablePrefetch,
		prefetchNum:       options.PrefetchNum,
		chunkSize:         options.ChunkSize,
		prefetchThreshold: options.PrefetchThreshold,
		oooReadThreshold:  options.OutOfOrderReadThreshold,
	}

	result, err := f.client.HeadObject(f.context, &HeadObjectRequest{
		Bucket:       &f.bucket,
		Key:          &f.key,
		VersionId:    f.versionId,
		RequestPayer: f.requestPayer,
	})

	if err != nil {
		return nil, err
	}

	//File info
	f.sizeInBytes = result.ContentLength
	f.modTime = result.Headers.Get(HTTPHeaderLastModified)
	f.etag = result.Headers.Get(HTTPHeaderETag)
	f.headers = result.Headers

	if f.sizeInBytes < 0 {
		return nil, fmt.Errorf("file size is invaid, got %v", f.sizeInBytes)
	}

	if f.offset > f.sizeInBytes {
		return nil, fmt.Errorf("offset is unavailable, offset:%v, file size:%v", f.offset, f.sizeInBytes)
	}

	return f, nil
}