aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/storage/localstore/schema.go
blob: 538c75d1f8c99b858ef0bf9275a8cfc390b24b32 (plain) (blame)
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
49
50
51
52
package localstore

import (
    "github.com/ethereum/go-ethereum/swarm/log"
    "github.com/syndtr/goleveldb/leveldb"
    "github.com/syndtr/goleveldb/leveldb/opt"
)

// The DB schema we want to use. The actual/current DB schema might differ
// until migrations are run.
const CurrentDbSchema = DbSchemaSanctuary

// There was a time when we had no schema at all.
const DbSchemaNone = ""

// "purity" is the first formal schema of LevelDB we release together with Swarm 0.3.5
const DbSchemaPurity = "purity"

// "halloween" is here because we had a screw in the garbage collector index.
// Because of that we had to rebuild the GC index to get rid of erroneous
// entries and that takes a long time. This schema is used for bookkeeping,
// so rebuild index will run just once.
const DbSchemaHalloween = "halloween"

const DbSchemaSanctuary = "sanctuary"

// returns true if legacy database is in the datadir
func IsLegacyDatabase(datadir string) bool {

    var (
        legacyDbSchemaKey = []byte{8}
    )

    db, err := leveldb.OpenFile(datadir, &opt.Options{OpenFilesCacheCapacity: 128})
    if err != nil {
        log.Error("got an error while trying to open leveldb path", "path", datadir, "err", err)
        return false
    }
    defer db.Close()

    data, err := db.Get(legacyDbSchemaKey, nil)
    if err != nil {
        if err == leveldb.ErrNotFound {
            // if we haven't found anything under the legacy db schema key- we are not on legacy
            return false
        }

        log.Error("got an unexpected error fetching legacy name from the database", "err", err)
    }
    log.Trace("checking if database scheme is legacy", "schema name", string(data))
    return string(data) == DbSchemaHalloween || string(data) == DbSchemaPurity
}