// ChildrenW works like Children but also returns a channel that will // receive a single Event value when a node is added or removed under the // provided path or when critical session events happen. See the documentation // of the Event type for more details. func (conn *Conn) ChildrenW(path string) (children []string, stat *Stat, watch <-chan Event, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return nil, nil, nil, closingError("childrenw", path) } cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) watchId, watchChannel := conn.createWatch(true) cvector := C.struct_String_vector{} var cstat Stat rc, cerr := C.zoo_wget_children2(conn.handle, cpath, C.watch_handler, unsafe.Pointer(watchId), &cvector, &cstat.c) // Can't happen if rc != 0, but avoid potential memory leaks in the future. if cvector.count != 0 { children = parseStringVector(&cvector) } if rc == C.ZOK { stat = &cstat watch = watchChannel } else { conn.forgetWatch(watchId) err = zkError(rc, cerr, "childrenw", path) } return }
// Children returns the children list and status from an existing node. // Attempting to retrieve the children list from a non-existent node is an error. func (conn *Conn) Children(path string) (children []string, stat *Stat, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return nil, nil, closingError("children", path) } cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) cvector := C.struct_String_vector{} var cstat Stat rc, cerr := C.zoo_wget_children2(conn.handle, cpath, nil, nil, &cvector, &cstat.c) // Can't happen if rc != 0, but avoid potential memory leaks in the future. if cvector.count != 0 { children = parseStringVector(&cvector) } if rc == C.ZOK { stat = &cstat } else { err = zkError(rc, cerr, "children", path) } return }