Skip to content

Commit d75048f

Browse files
committed
Change ReadSubKeyNames signature to iterator
In order to add users and groups iterators for os/user, ReadSubKeyNames must be changed. Instead of returning a full slice of all subkey names, it can be changed to accept callback function, which receives sequentially iterated subkey names. As such, ReadSubKeyNames becomes an iterator and will use less memory for larger sets of data.
1 parent 717894c commit d75048f

File tree

4 files changed

+26
-9
lines changed

4 files changed

+26
-9
lines changed

src/internal/syscall/windows/registry/key.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ func OpenKey(k Key, path string, access uint32) (Key, error) {
8787
return Key(subkey), nil
8888
}
8989

90-
// ReadSubKeyNames returns the names of subkeys of key k.
91-
func (k Key) ReadSubKeyNames() ([]string, error) {
92-
names := make([]string, 0)
90+
// ReadSubKeyNames iterates over the names of subkeys of key k. Callback function fn receives each iterated subkey name.
91+
// If fn returns non-nil error, iteration is terminated and that error is returned.
92+
func (k Key) ReadSubKeyNames(fn func(string) error) error {
9393
// Registry key size limit is 255 bytes and described there:
9494
// https://msdn.microsoft.com/library/windows/desktop/ms724872.aspx
9595
buf := make([]uint16, 256) //plus extra room for terminating zero byte
@@ -110,11 +110,15 @@ loopItems:
110110
if err == _ERROR_NO_MORE_ITEMS {
111111
break loopItems
112112
}
113-
return names, err
113+
return err
114+
}
115+
116+
// Callback with key name string
117+
if err := fn(syscall.UTF16ToString(buf[:l])); err != nil{
118+
return err
114119
}
115-
names = append(names, syscall.UTF16ToString(buf[:l]))
116120
}
117-
return names, nil
121+
return nil
118122
}
119123

120124
// CreateKey creates a key named path under open key k.

src/internal/syscall/windows/registry/registry_test.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ func TestReadSubKeyNames(t *testing.T) {
3535
}
3636
defer k.Close()
3737

38-
names, err := k.ReadSubKeyNames()
38+
var names []string
39+
err = k.ReadSubKeyNames(func(s string) error {
40+
names = append(names, s)
41+
return nil
42+
})
3943
if err != nil {
4044
t.Fatal(err)
4145
}

src/mime/type_windows.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,15 @@ func init() {
1313
}
1414

1515
func initMimeWindows() {
16-
names, err := registry.CLASSES_ROOT.ReadSubKeyNames()
16+
var names []string
17+
err := registry.CLASSES_ROOT.ReadSubKeyNames(func(s string) error {
18+
names = append(names, s)
19+
return nil
20+
})
1721
if err != nil {
1822
return
1923
}
24+
2025
for _, name := range names {
2126
if len(name) < 2 || name[0] != '.' { // looking for extensions only
2227
continue

src/time/zoneinfo_windows.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ func toEnglishName(stdname, dstname string) (string, error) {
6767
}
6868
defer k.Close()
6969

70-
names, err := k.ReadSubKeyNames()
70+
var names []string
71+
err = k.ReadSubKeyNames(func(s string) error {
72+
names = append(names, s)
73+
return nil
74+
})
7175
if err != nil {
7276
return "", err
7377
}

0 commit comments

Comments
 (0)