File: deferred_delete.go

package info (click to toggle)
golang-github-protonmail-gluon 0.17.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 16,020 kB
  • sloc: sh: 55; makefile: 5
file content (48 lines) | stat: -rw-r--r-- 1,425 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package db

import (
	"errors"
	"fmt"
	"os"
	"path/filepath"

	"github.com/google/uuid"
)

// DeleteDB will rename all the database files for the given user to a directory within the same folder to avoid
// issues with ent not being able to close the database on demand. The database will be cleaned up on the next
// run on the Gluon server.
func DeleteDB(dir, userID string) error {
	// Rather than deleting the files immediately move them to a directory to be cleaned up later.
	deferredDeletePath := GetDeferredDeleteDBPath(dir)

	if err := os.MkdirAll(deferredDeletePath, 0o700); err != nil {
		return fmt.Errorf("failed to create deferred delete dir: %w", err)
	}

	matchingFiles, err := filepath.Glob(filepath.Join(dir, userID+"*"))
	if err != nil {
		return fmt.Errorf("failed to match db files:%w", err)
	}

	for _, file := range matchingFiles {
		// Use new UUID to avoid conflict with existing files
		if err := os.Rename(file, filepath.Join(deferredDeletePath, uuid.NewString())); err != nil {
			return fmt.Errorf("failed to move db file '%v' :%w", file, err)
		}
	}

	return nil
}

// DeleteDeferredDBFiles deletes all data from previous databases that were scheduled for removal.
func DeleteDeferredDBFiles(dir string) error {
	deferredDeleteDir := GetDeferredDeleteDBPath(dir)
	if err := os.RemoveAll(deferredDeleteDir); err != nil {
		if !errors.Is(err, os.ErrNotExist) {
			return err
		}
	}

	return nil
}