func Open()

in file.go [93:127]


func Open(path string, mode os.FileMode, opts Options) (*File, error) {
	const op = "txfile/open"

	if err := opts.Validate(); err != nil {
		return nil, fileErrWrap(op, path, err)
	}

	file, err := osfs.Open(path, mode)
	if err != nil {
		return nil, fileErrWrap(op, path, err).report("can not open file")
	}

	initOK := false
	defer cleanup.IfNot(&initOK, cleanup.IgnoreError(file.Close))

	waitLock := (opts.Flags & FlagWaitLock) == FlagWaitLock
	if err := file.Lock(true, waitLock); err != nil {
		return nil, fileErrWrap(op, path, err).report("failed to lock file")
	}
	defer cleanup.IfNot(&initOK, cleanup.IgnoreError(file.Unlock))

	// initialize the file
	f, err := openWith(file, opts)
	if err != nil {
		return nil, fileErrWrap(op, path, err).report("failed to open file")
	}

	tracef("open file: %p (%v)\n", f, path)
	traceMetaPage(f.getMetaPage())

	f.reportOpen()

	initOK = true
	return f, nil
}