oficina / docs Public

Clone
git clone https://amadan.net/oficina/docs

Plain git — no account needed to clone.

Download

Download this file

1package docs
2
3import (
4 "context"
5 "database/sql"
6 "fmt"
7
8 "amadan.net/rastrillo/rastrillo/db"
9)
10
11func scrubContent(ctx context.Context, d *db.DB, c *contentCipher) error {
12 state, err := readContentSealing(ctx, d.G, c)
13 if err != nil {
14 return err
15 }
16 if state == nil {
17 return errContentState
18 }
19 if err := convertContent(ctx, d.G, c); err != nil {
20 return err
21 }
22 conn, err := d.Writer().Conn(ctx)
23 if err != nil {
24 return err
25 }
26 defer conn.Close()
27 if _, err := conn.ExecContext(ctx, "UPDATE content_sealing SET scrubbed = 0 WHERE id = 1"); err != nil {
28 return err
29 }
30 if err := truncateContentWAL(ctx, conn); err != nil {
31 return err
32 }
33 if _, err := conn.ExecContext(ctx, "VACUUM"); err != nil {
34 return err
35 }
36 if err := truncateContentWAL(ctx, conn); err != nil {
37 return err
38 }
39 _, err = conn.ExecContext(ctx, "UPDATE content_sealing SET scrubbed = 1 WHERE id = 1")
40 return err
41}
42
43func truncateContentWAL(ctx context.Context, conn *sql.Conn) error {
44 var busy, frames, checkpointed int
45 if err := conn.QueryRowContext(ctx, "PRAGMA wal_checkpoint(TRUNCATE)").Scan(&busy, &frames, &checkpointed); err != nil {
46 return err
47 }
48 if busy != 0 || frames != checkpointed {
49 return fmt.Errorf("docs: checkpoint incomplete (%d, %d, %d)", busy, frames, checkpointed)
50 }
51 return nil
52}
53