| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | 
							- // Copyright (C) 2014 The Syncthing Authors.
 
- //
 
- // This Source Code Form is subject to the terms of the Mozilla Public
 
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
 
- // You can obtain one at https://mozilla.org/MPL/2.0/.
 
- package olddb
 
- import (
 
- 	"encoding/binary"
 
- 	"time"
 
- 	"github.com/syncthing/syncthing/internal/db/olddb/backend"
 
- )
 
- // deprecatedLowlevel is the lowest level database interface. It has a very simple
 
- // purpose: hold the actual backend database, and the in-memory state
 
- // that belong to that database. In the same way that a single on disk
 
- // database can only be opened once, there should be only one deprecatedLowlevel for
 
- // any given backend.
 
- type deprecatedLowlevel struct {
 
- 	backend.Backend
 
- 	folderIdx *smallIndex
 
- 	deviceIdx *smallIndex
 
- 	keyer     keyer
 
- }
 
- func NewLowlevel(backend backend.Backend) (*deprecatedLowlevel, error) {
 
- 	// Only log restarts in debug mode.
 
- 	db := &deprecatedLowlevel{
 
- 		Backend:   backend,
 
- 		folderIdx: newSmallIndex(backend, []byte{KeyTypeFolderIdx}),
 
- 		deviceIdx: newSmallIndex(backend, []byte{KeyTypeDeviceIdx}),
 
- 	}
 
- 	db.keyer = newDefaultKeyer(db.folderIdx, db.deviceIdx)
 
- 	return db, nil
 
- }
 
- // ListFolders returns the list of folders currently in the database
 
- func (db *deprecatedLowlevel) ListFolders() []string {
 
- 	return db.folderIdx.Values()
 
- }
 
- func (db *deprecatedLowlevel) IterateMtimes(fn func(folder, name string, ondisk, virtual time.Time) error) error {
 
- 	it, err := db.NewPrefixIterator([]byte{KeyTypeVirtualMtime})
 
- 	if err != nil {
 
- 		return err
 
- 	}
 
- 	defer it.Release()
 
- 	for it.Next() {
 
- 		key := it.Key()[1:]
 
- 		folderID, ok := db.folderIdx.Val(binary.BigEndian.Uint32(key))
 
- 		if !ok {
 
- 			continue
 
- 		}
 
- 		name := key[4:]
 
- 		val := it.Value()
 
- 		var ondisk, virtual time.Time
 
- 		if err := ondisk.UnmarshalBinary(val[:len(val)/2]); err != nil {
 
- 			continue
 
- 		}
 
- 		if err := virtual.UnmarshalBinary(val[len(val)/2:]); err != nil {
 
- 			continue
 
- 		}
 
- 		if err := fn(string(folderID), string(name), ondisk, virtual); err != nil {
 
- 			return err
 
- 		}
 
- 	}
 
- 	return it.Error()
 
- }
 
 
  |