Browse Source

Implement GetGlobalTruncated

Jakob Borg 11 years ago
parent
commit
d46ce5003c
4 changed files with 24 additions and 22 deletions
  1. 4 5
      internal/files/leveldb.go
  2. 16 2
      internal/files/set.go
  3. 0 11
      internal/files/truncated.go
  4. 4 4
      internal/model/model.go

+ 4 - 5
internal/files/leveldb.go

@@ -610,7 +610,7 @@ func ldbGet(db *leveldb.DB, folder, device, file []byte) (protocol.FileInfo, boo
 	return f, true
 }
 
-func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool) {
+func ldbGetGlobal(db *leveldb.DB, folder, file []byte, truncate bool) (FileIntf, bool) {
 	k := globalKey(folder, file)
 	snap, err := db.GetSnapshot()
 	if err != nil {
@@ -631,7 +631,7 @@ func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool)
 	}
 	bs, err := snap.Get(k, nil)
 	if err == leveldb.ErrNotFound {
-		return protocol.FileInfo{}, false
+		return nil, false
 	}
 	if err != nil {
 		panic(err)
@@ -656,12 +656,11 @@ func ldbGetGlobal(db *leveldb.DB, folder, file []byte) (protocol.FileInfo, bool)
 		panic(err)
 	}
 
-	var f protocol.FileInfo
-	err = f.UnmarshalXDR(bs)
+	fi, err := unmarshalTrunc(bs, truncate)
 	if err != nil {
 		panic(err)
 	}
-	return f, true
+	return fi, true
 }
 
 func ldbWithGlobal(db *leveldb.DB, folder []byte, truncate bool, fn Iterator) {

+ 16 - 2
internal/files/set.go

@@ -189,9 +189,23 @@ func (s *Set) Get(device protocol.DeviceID, file string) (protocol.FileInfo, boo
 }
 
 func (s *Set) GetGlobal(file string) (protocol.FileInfo, bool) {
-	f, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)))
+	fi, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)), false)
+	if !ok {
+		return protocol.FileInfo{}, false
+	}
+	f := fi.(protocol.FileInfo)
 	f.Name = osutil.NativeFilename(f.Name)
-	return f, ok
+	return f, true
+}
+
+func (s *Set) GetGlobalTruncated(file string) (FileInfoTruncated, bool) {
+	fi, ok := ldbGetGlobal(s.db, []byte(s.folder), []byte(osutil.NormalizedFilename(file)), true)
+	if !ok {
+		return FileInfoTruncated{}, false
+	}
+	f := fi.(FileInfoTruncated)
+	f.Name = osutil.NativeFilename(f.Name)
+	return f, true
 }
 
 func (s *Set) Availability(file string) []protocol.DeviceID {

+ 0 - 11
internal/files/truncated.go

@@ -67,17 +67,6 @@ func (f FileInfoTruncated) HasPermissionBits() bool {
 	return f.Flags&protocol.FlagNoPermBits == 0
 }
 
-func Truncate(f protocol.FileInfo) FileInfoTruncated {
-	return FileInfoTruncated{
-		Name:         f.Name,
-		Flags:        f.Flags,
-		Modified:     f.Modified,
-		Version:      f.Version,
-		LocalVersion: f.LocalVersion,
-		NumBlocks:    uint32(len(f.Blocks)),
-	}
-}
-
 func BlocksToSize(num uint32) int64 {
 	if num < 2 {
 		return protocol.BlockSize / 2

+ 4 - 4
internal/model/model.go

@@ -440,15 +440,15 @@ func (m *Model) NeedFolderFiles(folder string, max int) ([]files.FileInfoTruncat
 			seen = make(map[string]bool, len(progressNames)+len(queuedNames))
 
 			for i, name := range progressNames {
-				if f, ok := rf.GetGlobal(name); ok {
-					progress[i] = files.Truncate(f) /// XXX: Should implement GetGlobalTruncated directly
+				if f, ok := rf.GetGlobalTruncated(name); ok {
+					progress[i] = f
 					seen[name] = true
 				}
 			}
 
 			for i, name := range queuedNames {
-				if f, ok := rf.GetGlobal(name); ok {
-					queued[i] = files.Truncate(f) /// XXX: Should implement GetGlobalTruncated directly
+				if f, ok := rf.GetGlobalTruncated(name); ok {
+					queued[i] = f
 					seen[name] = true
 				}
 			}