dump.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. // Copyright (C) 2015 The Syncthing Authors.
  2. //
  3. // This Source Code Form is subject to the terms of the Mozilla Public
  4. // License, v. 2.0. If a copy of the MPL was not distributed with this file,
  5. // You can obtain one at http://mozilla.org/MPL/2.0/.
  6. package main
  7. import (
  8. "encoding/binary"
  9. "fmt"
  10. "log"
  11. "time"
  12. "github.com/syncthing/syncthing/lib/db"
  13. "github.com/syncthing/syncthing/lib/protocol"
  14. )
  15. func dump(ldb *db.Instance) {
  16. it := ldb.NewIterator(nil, nil)
  17. for it.Next() {
  18. key := it.Key()
  19. switch key[0] {
  20. case db.KeyTypeDevice:
  21. folder := binary.BigEndian.Uint32(key[1:])
  22. device := binary.BigEndian.Uint32(key[1+4:])
  23. name := nulString(key[1+4+4:])
  24. fmt.Printf("[device] F:%d D:%d N:%q", folder, device, name)
  25. var f protocol.FileInfo
  26. err := f.Unmarshal(it.Value())
  27. if err != nil {
  28. log.Fatal(err)
  29. }
  30. fmt.Printf(" V:%v\n", f)
  31. case db.KeyTypeGlobal:
  32. folder := binary.BigEndian.Uint32(key[1:])
  33. name := nulString(key[1+4:])
  34. var flv db.VersionList
  35. flv.Unmarshal(it.Value())
  36. fmt.Printf("[global] F:%d N:%q V:%s\n", folder, name, flv)
  37. case db.KeyTypeBlock:
  38. folder := binary.BigEndian.Uint32(key[1:])
  39. hash := key[1+4 : 1+4+32]
  40. name := nulString(key[1+4+32:])
  41. fmt.Printf("[block] F:%d H:%x N:%q I:%d\n", folder, hash, name, binary.BigEndian.Uint32(it.Value()))
  42. case db.KeyTypeDeviceStatistic:
  43. fmt.Printf("[dstat] K:%x V:%x\n", it.Key(), it.Value())
  44. case db.KeyTypeFolderStatistic:
  45. fmt.Printf("[fstat] K:%x V:%x\n", it.Key(), it.Value())
  46. case db.KeyTypeVirtualMtime:
  47. folder := binary.BigEndian.Uint32(key[1:])
  48. name := nulString(key[1+4:])
  49. val := it.Value()
  50. var real, virt time.Time
  51. real.UnmarshalBinary(val[:len(val)/2])
  52. virt.UnmarshalBinary(val[len(val)/2:])
  53. fmt.Printf("[mtime] F:%d N:%q R:%v V:%v\n", folder, name, real, virt)
  54. case db.KeyTypeFolderIdx:
  55. key := binary.BigEndian.Uint32(it.Key()[1:])
  56. fmt.Printf("[folderidx] K:%d V:%q\n", key, it.Value())
  57. case db.KeyTypeDeviceIdx:
  58. key := binary.BigEndian.Uint32(it.Key()[1:])
  59. val := it.Value()
  60. if len(val) == 0 {
  61. fmt.Printf("[deviceidx] K:%d V:<nil>\n", key)
  62. } else {
  63. dev := protocol.DeviceIDFromBytes(val)
  64. fmt.Printf("[deviceidx] K:%d V:%s\n", key, dev)
  65. }
  66. default:
  67. fmt.Printf("[???]\n %x\n %x\n", it.Key(), it.Value())
  68. }
  69. }
  70. }