Skip to content

Commit 1296d66

Browse files
committed
core/rawdb: implement flatdb
1 parent ce0d488 commit 1296d66

File tree

5 files changed

+787
-47
lines changed

5 files changed

+787
-47
lines changed

core/rawdb/file_unix.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// Copyright 2020 The go-ethereum Authors
2+
// This file is part of the go-ethereum library.
3+
//
4+
// The go-ethereum library is free software: you can redistribute it and/or modify
5+
// it under the terms of the GNU Lesser General Public License as published by
6+
// the Free Software Foundation, either version 3 of the License, or
7+
// (at your option) any later version.
8+
//
9+
// The go-ethereum library is distributed in the hope that it will be useful,
10+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12+
// GNU Lesser General Public License for more details.
13+
//
14+
// You should have received a copy of the GNU Lesser General Public License
15+
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
16+
17+
// +build darwin dragonfly freebsd linux netbsd openbsd
18+
19+
package rawdb
20+
21+
import (
22+
"os"
23+
"syscall"
24+
)
25+
26+
func rename(oldpath, newpath string) error {
27+
return os.Rename(oldpath, newpath)
28+
}
29+
30+
func isErrInvalid(err error) bool {
31+
if err == os.ErrInvalid {
32+
return true
33+
}
34+
// Go < 1.8
35+
if syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL {
36+
return true
37+
}
38+
// Go >= 1.8 returns *os.PathError instead
39+
if patherr, ok := err.(*os.PathError); ok && patherr.Err == syscall.EINVAL {
40+
return true
41+
}
42+
return false
43+
}
44+
45+
func syncDir(name string) error {
46+
// As per fsync manpage, Linux seems to expect fsync on directory, however
47+
// some system don't support this, so we will ignore syscall.EINVAL.
48+
//
49+
// From fsync(2):
50+
// Calling fsync() does not necessarily ensure that the entry in the
51+
// directory containing the file has also reached disk. For that an
52+
// explicit fsync() on a file descriptor for the directory is also needed.
53+
f, err := os.Open(name)
54+
if err != nil {
55+
return err
56+
}
57+
defer f.Close()
58+
if err := f.Sync(); err != nil && !isErrInvalid(err) {
59+
return err
60+
}
61+
return nil
62+
}

core/rawdb/file_windows.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright (c) 2013, Suryandaru Triandana <[email protected]>
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 rawdb
8+
9+
import (
10+
"syscall"
11+
"unsafe"
12+
)
13+
14+
var (
15+
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
16+
procMoveFileExW = modkernel32.NewProc("MoveFileExW")
17+
)
18+
19+
const (
20+
_MOVEFILE_REPLACE_EXISTING = 1
21+
)
22+
23+
func moveFileEx(from *uint16, to *uint16, flags uint32) error {
24+
r1, _, e1 := syscall.Syscall(procMoveFileExW.Addr(), 3, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), uintptr(flags))
25+
if r1 == 0 {
26+
if e1 != 0 {
27+
return error(e1)
28+
}
29+
return syscall.EINVAL
30+
}
31+
return nil
32+
}
33+
34+
func rename(oldpath, newpath string) error {
35+
from, err := syscall.UTF16PtrFromString(oldpath)
36+
if err != nil {
37+
return err
38+
}
39+
to, err := syscall.UTF16PtrFromString(newpath)
40+
if err != nil {
41+
return err
42+
}
43+
return moveFileEx(from, to, _MOVEFILE_REPLACE_EXISTING)
44+
}
45+
46+
func syncDir(name string) error { return nil }

0 commit comments

Comments
 (0)