| // Copyright (c) 2014, Suryandaru Triandana <syndtr@gmail.com> |
| // All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Package errors provides common error types used throughout leveldb. |
| package errors |
| |
| import ( |
| "errors" |
| "fmt" |
| |
| "github.com/syndtr/goleveldb/leveldb/storage" |
| "github.com/syndtr/goleveldb/leveldb/util" |
| ) |
| |
| var ( |
| ErrNotFound = New("leveldb: not found") |
| ErrReleased = util.ErrReleased |
| ErrHasReleaser = util.ErrHasReleaser |
| ) |
| |
| // New returns an error that formats as the given text. |
| func New(text string) error { |
| return errors.New(text) |
| } |
| |
| // ErrCorrupted is the type that wraps errors that indicate corruption in |
| // the database. |
| type ErrCorrupted struct { |
| Fd storage.FileDesc |
| Err error |
| } |
| |
| func (e *ErrCorrupted) Error() string { |
| if !e.Fd.Nil() { |
| return fmt.Sprintf("%v [file=%v]", e.Err, e.Fd) |
| } else { |
| return e.Err.Error() |
| } |
| } |
| |
| // NewErrCorrupted creates new ErrCorrupted error. |
| func NewErrCorrupted(fd storage.FileDesc, err error) error { |
| return &ErrCorrupted{fd, err} |
| } |
| |
| // IsCorrupted returns a boolean indicating whether the error is indicating |
| // a corruption. |
| func IsCorrupted(err error) bool { |
| switch err.(type) { |
| case *ErrCorrupted: |
| return true |
| case *storage.ErrCorrupted: |
| return true |
| } |
| return false |
| } |
| |
| // ErrMissingFiles is the type that indicating a corruption due to missing |
| // files. ErrMissingFiles always wrapped with ErrCorrupted. |
| type ErrMissingFiles struct { |
| Fds []storage.FileDesc |
| } |
| |
| func (e *ErrMissingFiles) Error() string { return "file missing" } |
| |
| // SetFd sets 'file info' of the given error with the given file. |
| // Currently only ErrCorrupted is supported, otherwise will do nothing. |
| func SetFd(err error, fd storage.FileDesc) error { |
| switch x := err.(type) { |
| case *ErrCorrupted: |
| x.Fd = fd |
| return x |
| } |
| return err |
| } |