// GetW works like Get but also returns a channel that will receive // a single Event value when the data or existence of the given ZooKeeper // node changes or when critical session events happen. See the // documentation of the Event type for more details. func (conn *Conn) GetW(path string) (data string, stat *Stat, watch <-chan Event, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return "", nil, nil, closingError("getw", path) } cpath := C.CString(path) cbuffer := (*C.char)(C.malloc(bufferSize)) cbufferLen := C.int(bufferSize) defer C.free(unsafe.Pointer(cpath)) defer C.free(unsafe.Pointer(cbuffer)) watchId, watchChannel := conn.createWatch(true) var cstat Stat rc, cerr := C.zoo_wget(conn.handle, cpath, C.watch_handler, unsafe.Pointer(watchId), cbuffer, &cbufferLen, &cstat.c) if rc != C.ZOK { conn.forgetWatch(watchId) return "", nil, nil, zkError(rc, cerr, "getw", path) } if cbufferLen != -1 { data = C.GoStringN(cbuffer, cbufferLen) } return data, &cstat, watchChannel, nil }
// Get returns the data and status from an existing node. err will be nil, // unless an error is found. Attempting to retrieve data from a non-existing // node is an error. func (conn *Conn) Get(path string) (data string, stat *Stat, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return "", nil, closingError("get", path) } cpath := C.CString(path) cbuffer := (*C.char)(C.malloc(bufferSize)) cbufferLen := C.int(bufferSize) defer C.free(unsafe.Pointer(cpath)) defer C.free(unsafe.Pointer(cbuffer)) var cstat Stat rc, cerr := C.zoo_wget(conn.handle, cpath, nil, nil, cbuffer, &cbufferLen, &cstat.c) if rc != C.ZOK { return "", nil, zkError(rc, cerr, "get", path) } result := C.GoStringN(cbuffer, cbufferLen) return result, &cstat, nil }