// ExistsW works like Exists but also returns a channel that will // receive an Event value when a node is created in case the returned // stat is nil and the node didn't exist, or when the existing node // is removed. It will also receive critical session events. See the // documentation of the Event type for more details. func (conn *Conn) ExistsW(path string) (stat *Stat, watch <-chan Event, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return nil, nil, closingError("existsw", path) } cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) watchId, watchChannel := conn.createWatch(true) var cstat Stat rc, cerr := C.zoo_wexists(conn.handle, cpath, C.watch_handler, unsafe.Pointer(watchId), &cstat.c) // We diverge a bit from the usual here: a ZNONODE is not an error // for an exists call, otherwise every Exists call would have to check // for err != nil and err.Code() != ZNONODE. switch ErrorCode(rc) { case ZOK: stat = &cstat watch = watchChannel case ZNONODE: watch = watchChannel default: conn.forgetWatch(watchId) err = zkError(rc, cerr, "existsw", path) } return }
// Exists checks if a node exists at the given path. If it does, // stat will contain meta information on the existing node, otherwise // it will be nil. func (conn *Conn) Exists(path string) (stat *Stat, err error) { conn.mutex.RLock() defer conn.mutex.RUnlock() if conn.handle == nil { return nil, closingError("exists", path) } cpath := C.CString(path) defer C.free(unsafe.Pointer(cpath)) var cstat Stat rc, cerr := C.zoo_wexists(conn.handle, cpath, nil, nil, &cstat.c) // We diverge a bit from the usual here: a ZNONODE is not an error // for an exists call, otherwise every Exists call would have to check // for err != nil and err.Code() != ZNONODE. if rc == C.ZOK { stat = &cstat } else if rc != C.ZNONODE { err = zkError(rc, cerr, "exists", path) } return }