package vfs

import (
	
	
	
	_ 

	
	
	
)

//go:linkname vfsFullPathname
func vfsFullPathname( *sqlite3_wrap.Wrapper, ,  ptr_t,  int32,  ptr_t) _ErrorCode {
	 := vfsGet(, )
	 := .ReadString(, _MAX_PATHNAME)

	,  := .FullPathname()

	if len() >= int() {
		return _CANTOPEN_FULLPATH
	}
	.WriteString(, )

	return vfsErrorCode(, , _CANTOPEN_FULLPATH)
}

//go:linkname vfsDelete
func vfsDelete( *sqlite3_wrap.Wrapper, ,  ptr_t,  int32) _ErrorCode {
	 := vfsGet(, )
	 := .ReadString(, _MAX_PATHNAME)

	 := .Delete(,  != 0)
	return vfsErrorCode(, , _IOERR_DELETE)
}

//go:linkname vfsAccess
func vfsAccess( *sqlite3_wrap.Wrapper, ,  ptr_t,  AccessFlag,  ptr_t) _ErrorCode {
	 := vfsGet(, )
	 := .ReadString(, _MAX_PATHNAME)

	,  := .Access(, )
	.WriteBool(, )
	return vfsErrorCode(, , _IOERR_ACCESS)
}

//go:linkname vfsOpen
func vfsOpen( *sqlite3_wrap.Wrapper, , ,  ptr_t,  OpenFlag, ,  ptr_t) _ErrorCode {
	 := vfsGet(, )
	 := GetFilename(, , )

	var  File
	var  error
	if ,  := .(VFSFilename);  {
		, ,  = .OpenFilename(, )
	} else {
		, ,  = .Open(.String(), )
	}
	if  != nil {
		return vfsErrorCode(, , _CANTOPEN)
	}

	if ,  := .(FilePowersafeOverwrite);  {
		if ,  := util.ParseBool(.URIParameter("psow"));  {
			.SetPowersafeOverwrite()
		}
	}
	if ,  := .(FileSharedMemory);  &&  != 0 {
		.WriteBool(, .SharedMemory() != nil)
	}
	if  != 0 {
		.Write32(, uint32())
	}
	 = cksmWrapFile(, )
	vfsFileRegister(, , )
	return _OK
}

//go:linkname vfsClose
func vfsClose( *sqlite3_wrap.Wrapper,  ptr_t) _ErrorCode {
	 := vfsFileClose(, )
	return vfsErrorCode(, , _IOERR_CLOSE)
}

//go:linkname vfsRead
func vfsRead( *sqlite3_wrap.Wrapper, ,  ptr_t,  int32,  int64) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Bytes(, int64())

	,  := .ReadAt(, )
	if  == int() {
		return _OK
	}
	if  != io.EOF {
		return vfsErrorCode(, , _IOERR_READ)
	}
	clear([:])
	return _IOERR_SHORT_READ
}

//go:linkname vfsWrite
func vfsWrite( *sqlite3_wrap.Wrapper, ,  ptr_t,  int32,  int64) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Bytes(, int64())

	,  := .WriteAt(, )
	return vfsErrorCode(, , _IOERR_WRITE)
}

//go:linkname vfsTruncate
func vfsTruncate( *sqlite3_wrap.Wrapper,  ptr_t,  int64) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Truncate()
	return vfsErrorCode(, , _IOERR_TRUNCATE)
}

//go:linkname vfsSync
func vfsSync( *sqlite3_wrap.Wrapper,  ptr_t,  SyncFlag) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Sync()
	return vfsErrorCode(, , _IOERR_FSYNC)
}

//go:linkname vfsFileSize
func vfsFileSize( *sqlite3_wrap.Wrapper, ,  ptr_t) _ErrorCode {
	 := vfsFileGet(, ).(File)
	,  := .Size()
	.Write64(, uint64())
	return vfsErrorCode(, , _IOERR_SEEK)
}

//go:linkname vfsLock
func vfsLock( *sqlite3_wrap.Wrapper,  ptr_t,  LockLevel) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Lock()
	return vfsErrorCode(, , _IOERR_LOCK)
}

//go:linkname vfsUnlock
func vfsUnlock( *sqlite3_wrap.Wrapper,  ptr_t,  LockLevel) _ErrorCode {
	 := vfsFileGet(, ).(File)
	 := .Unlock(LockLevel())
	return vfsErrorCode(, , _IOERR_UNLOCK)
}

//go:linkname vfsCheckReservedLock
func vfsCheckReservedLock( *sqlite3_wrap.Wrapper, ,  ptr_t) _ErrorCode {
	 := vfsFileGet(, ).(File)
	,  := .CheckReservedLock()
	.WriteBool(, )
	return vfsErrorCode(, , _IOERR_CHECKRESERVEDLOCK)
}

//go:linkname vfsFileControl
func vfsFileControl( *sqlite3_wrap.Wrapper,  ptr_t,  _FcntlOpcode,  ptr_t) _ErrorCode {
	 := vfsFileGet(, ).(File)
	if ,  := .(fileControl);  {
		return .fileControl(, , )
	}
	return vfsFileControlImpl(, , , )
}

func vfsFileControlImpl( *sqlite3_wrap.Wrapper,  File,  _FcntlOpcode,  ptr_t) _ErrorCode {
	 := .Memory
	switch  {
	case _FCNTL_LOCKSTATE:
		if ,  := .(FileLockState);  {
			if  := .LockState();  <= LOCK_EXCLUSIVE {
				.Write32(, uint32())
				return _OK
			}
		}

	case _FCNTL_PERSIST_WAL:
		if ,  := .(FilePersistWAL);  {
			if  := int32(.Read32());  < 0 {
				.WriteBool(, .PersistWAL())
			} else {
				.SetPersistWAL( != 0)
			}
			return _OK
		}

	case _FCNTL_POWERSAFE_OVERWRITE:
		if ,  := .(FilePowersafeOverwrite);  {
			if  := int32(.Read32());  < 0 {
				.WriteBool(, .PowersafeOverwrite())
			} else {
				.SetPowersafeOverwrite( != 0)
			}
			return _OK
		}

	case _FCNTL_CHUNK_SIZE:
		if ,  := .(FileChunkSize);  {
			 := int32(.Read32())
			.ChunkSize(int())
			return _OK
		}

	case _FCNTL_SIZE_HINT:
		if ,  := .(FileSizeHint);  {
			 := int64(.Read64())
			 := .SizeHint()
			return vfsErrorCode(, , _IOERR_TRUNCATE)
		}

	case _FCNTL_HAS_MOVED:
		if ,  := .(FileHasMoved);  {
			,  := .HasMoved()
			.WriteBool(, )
			return vfsErrorCode(, , _IOERR_FSTAT)
		}

	case _FCNTL_OVERWRITE:
		if ,  := .(FileOverwrite);  {
			 := .Overwrite()
			return vfsErrorCode(, , _IOERR)
		}

	case _FCNTL_SYNC:
		if ,  := .(FileSync);  {
			var  string
			if  != 0 {
				 = .ReadString(, _MAX_PATHNAME)
			}
			 := .SyncSuper()
			return vfsErrorCode(, , _IOERR)
		}

	case _FCNTL_COMMIT_PHASETWO:
		if ,  := .(FileCommitPhaseTwo);  {
			 := .CommitPhaseTwo()
			return vfsErrorCode(, , _IOERR)
		}

	case _FCNTL_BEGIN_ATOMIC_WRITE:
		if ,  := .(FileBatchAtomicWrite);  {
			 := .BeginAtomicWrite()
			return vfsErrorCode(, , _IOERR_BEGIN_ATOMIC)
		}
	case _FCNTL_COMMIT_ATOMIC_WRITE:
		if ,  := .(FileBatchAtomicWrite);  {
			 := .CommitAtomicWrite()
			return vfsErrorCode(, , _IOERR_COMMIT_ATOMIC)
		}
	case _FCNTL_ROLLBACK_ATOMIC_WRITE:
		if ,  := .(FileBatchAtomicWrite);  {
			 := .RollbackAtomicWrite()
			return vfsErrorCode(, , _IOERR_ROLLBACK_ATOMIC)
		}

	case _FCNTL_CKPT_START:
		if ,  := .(FileCheckpoint);  {
			.CheckpointStart()
			return _OK
		}
	case _FCNTL_CKPT_DONE:
		if ,  := .(FileCheckpoint);  {
			.CheckpointDone()
			return _OK
		}

	case _FCNTL_PRAGMA:
		if ,  := .(FilePragma);  {
			var  string
			 := ptr_t(.Read32( + 1*ptrlen))
			 := .ReadString(, _MAX_SQL_LENGTH)
			if  := ptr_t(.Read32( + 2*ptrlen));  != 0 {
				 = .ReadString(, _MAX_SQL_LENGTH)
			}

			,  := .Pragma(strings.ToLower(), )

			 := vfsErrorCode(, , _ERROR)
			if  == _ERROR {
				 = .Error()
			}
			if  != "" {
				 := ptr_t(.Xsqlite3_malloc64(int64(len()) + 1))
				.Write32(, uint32())
				.WriteString(, )
			}
			return 
		}

	case _FCNTL_BUSYHANDLER:
		if ,  := .(FileBusyHandler);  {
			 := int64(.Read64())
			.BusyHandler(func() bool {
				return .Xsqlite3_invoke_busy_handler_go() != 0
			})
			return _OK
		}

	case _FCNTL_LOCK_TIMEOUT:
		if ,  := .(FileSharedMemory);  {
			if ,  := .SharedMemory().(blockingSharedMemory);  {
				.shmEnableBlocking(.ReadBool())
				return _OK
			}
		}

	case _FCNTL_PDB:
		if ,  := .(filePDB);  {
			.SetDB(.DB)
			return _OK
		}

	case _FCNTL_NULL_IO:
		.Close()
		return _OK
	}

	return _NOTFOUND
}

//go:linkname vfsSectorSize
func vfsSectorSize( *sqlite3_wrap.Wrapper,  ptr_t) int32 {
	 := vfsFileGet(, ).(File)
	return int32(.SectorSize())
}

//go:linkname vfsDeviceCharacteristics
func vfsDeviceCharacteristics( *sqlite3_wrap.Wrapper,  ptr_t) DeviceCharacteristic {
	 := vfsFileGet(, ).(File)
	return .DeviceCharacteristics()
}

//go:linkname vfsShmBarrier
func vfsShmBarrier( *sqlite3_wrap.Wrapper,  ptr_t) {
	 := vfsFileGet(, ).(FileSharedMemory).SharedMemory()
	.shmBarrier()
}

//go:linkname vfsShmMap
func vfsShmMap( *sqlite3_wrap.Wrapper,  ptr_t, , ,  int32,  ptr_t) _ErrorCode {
	 := vfsFileGet(, ).(FileSharedMemory).SharedMemory()
	,  := .shmMap(, , ,  != 0)
	.Write32(, uint32())
	return vfsErrorCode(, , _IOERR_SHMMAP)
}

//go:linkname vfsShmLock
func vfsShmLock( *sqlite3_wrap.Wrapper,  ptr_t, ,  int32,  _ShmFlag) _ErrorCode {
	 := vfsFileGet(, ).(FileSharedMemory).SharedMemory()
	 := .shmLock(, , )
	return vfsErrorCode(, , _IOERR_SHMLOCK)
}

//go:linkname vfsShmUnmap
func vfsShmUnmap( *sqlite3_wrap.Wrapper,  ptr_t,  int32) _ErrorCode {
	 := vfsFileGet(, ).(FileSharedMemory).SharedMemory()
	.shmUnmap( != 0)
	return _OK
}

func vfsGet( *sqlite3_wrap.Wrapper,  ptr_t) VFS {
	var  string
	if  != 0 {
		const  = 16
		 := ptr_t(.Read32( + ))
		 = .ReadString(, _MAX_NAME)
	}
	if  := Find();  != nil {
		return 
	}
	panic(errutil.NoVFSErr + errutil.ErrorString())
}

func vfsFileRegister( *sqlite3_wrap.Wrapper,  ptr_t,  File) {
	const  = 4
	 := .AddHandle()
	.Write32(+, uint32())
}

func vfsFileGet( *sqlite3_wrap.Wrapper,  ptr_t) any {
	const  = 4
	 := ptr_t(.Read32( + ))
	return .GetHandle()
}

func vfsFileClose( *sqlite3_wrap.Wrapper,  ptr_t) error {
	const  = 4
	 := ptr_t(.Read32( + ))
	return .DelHandle()
}

func vfsErrorCode( *sqlite3_wrap.Wrapper,  error,  _ErrorCode) _ErrorCode {
	var  error

	switch err := .(type) {
	case nil:
		 = _OK
	case _ErrorCode:
		 = 
	case sysError:
		 = .code
		 = .error
	default:
		switch  := reflect.ValueOf(); .Kind() {
		case reflect.Uint8, reflect.Uint16:
			 = _ErrorCode(.Uint())
		default:
			 = 
		}
	}

	.SysError = 
	return 
}

// SystemError tags an error with a given
// sqlite3.ErrorCode or sqlite3.ExtendedErrorCode.
func [ interface{ ~uint8 | ~uint16 }]( error,  ) error {
	if  == nil {
		return nil
	}
	return sysError{error: , code: _ErrorCode()}
}

type sysError struct {
	error
	code _ErrorCode
}