OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / syndtr / goleveldb / leveldb / storage / file_storage_plan9.go
1 // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
2 // All rights reserved.
3 //
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
6
7 package storage
8
9 import (
10         "os"
11         "path/filepath"
12 )
13
14 type plan9FileLock struct {
15         f *os.File
16 }
17
18 func (fl *plan9FileLock) release() error {
19         return fl.f.Close()
20 }
21
22 func newFileLock(path string, readOnly bool) (fl fileLock, err error) {
23         var (
24                 flag int
25                 perm os.FileMode
26         )
27         if readOnly {
28                 flag = os.O_RDONLY
29         } else {
30                 flag = os.O_RDWR
31                 perm = os.ModeExclusive
32         }
33         f, err := os.OpenFile(path, flag, perm)
34         if os.IsNotExist(err) {
35                 f, err = os.OpenFile(path, flag|os.O_CREATE, perm|0644)
36         }
37         if err != nil {
38                 return
39         }
40         fl = &plan9FileLock{f: f}
41         return
42 }
43
44 func rename(oldpath, newpath string) error {
45         if _, err := os.Stat(newpath); err == nil {
46                 if err := os.Remove(newpath); err != nil {
47                         return err
48                 }
49         }
50
51         _, fname := filepath.Split(newpath)
52         return os.Rename(oldpath, fname)
53 }
54
55 func syncDir(name string) error {
56         f, err := os.Open(name)
57         if err != nil {
58                 return err
59         }
60         defer f.Close()
61         if err := f.Sync(); err != nil {
62                 return err
63         }
64         return nil
65 }