From a0c97c0c5e84e71e03c16be45da968e943d36b44 Mon Sep 17 00:00:00 2001 From: Nicolas Thauvin Date: Tue, 20 Apr 2021 15:41:12 +0200 Subject: [PATCH] make locking work on windows (#46) --- CHANGELOG.md | 1 + lock.go | 2 ++ lock_win.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+) create mode 100644 lock_win.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 2387ed1..f12dfdd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## pg_back 2.0.1 * Use /var/run/postgresql as default host for connections +* Support Windows ## pg_back 2.0.0 diff --git a/lock.go b/lock.go index b89701d..dff0624 100644 --- a/lock.go +++ b/lock.go @@ -23,6 +23,8 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +build !windows + package main import ( diff --git a/lock_win.go b/lock_win.go new file mode 100644 index 0000000..3d8117d --- /dev/null +++ b/lock_win.go @@ -0,0 +1,66 @@ +// pg_back +// +// Copyright 2011-2021 Nicolas Thauvin and contributors. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR +// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +build windows + +package main + +import ( + "fmt" + "os" + "path/filepath" +) + +// lockPath on windows just creates a file without locking, it only tests if +// the file exist to consider it locked +func lockPath(path string) (*os.File, bool, error) { + if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + return nil, false, err + } + + info, err := os.Stat(path) + if err == nil { + if info.IsDir() { + return nil, false, &os.PathError{Op: "stat", Path: path, Err: fmt.Errorf("unexpected directory")} + } + return nil, false, err + } + + l.Verboseln("creating lock file", path) + f, err := os.Create(path) + if err != nil { + return nil, false, err + } + return f, true, nil +} + +// unlockPath releases the lock from the open file and removes the +// underlying path +func unlockPath(f *os.File) error { + path := f.Name() + l.Verboseln("removing lock file", path) + f.Close() + return os.Remove(path) +}