diff --git a/src/main/java/com/couchbase/client/CouchbaseClient.java b/src/main/java/com/couchbase/client/CouchbaseClient.java index 2c9431b..eee830f 100644 --- a/src/main/java/com/couchbase/client/CouchbaseClient.java +++ b/src/main/java/com/couchbase/client/CouchbaseClient.java @@ -22,6 +22,7 @@ package com.couchbase.client; +import com.couchbase.client.CASGetStatus.CASGetResponse; import com.couchbase.client.internal.HttpFuture; import com.couchbase.client.internal.ViewFuture; import com.couchbase.client.protocol.views.DocsOperationImpl; @@ -61,15 +62,18 @@ import java.util.logging.Level; import java.util.logging.Logger; import net.spy.memcached.AddrUtil; +import net.spy.memcached.CASResponse; import net.spy.memcached.CASValue; import net.spy.memcached.CachedData; import net.spy.memcached.MemcachedClient; import net.spy.memcached.OperationTimeoutException; import net.spy.memcached.internal.OperationFuture; +import net.spy.memcached.ops.CASOperationStatus; import net.spy.memcached.ops.GetlOperation; import net.spy.memcached.ops.Operation; import net.spy.memcached.ops.OperationCallback; import net.spy.memcached.ops.OperationStatus; +import net.spy.memcached.ops.TimedOutOperationStatus; import net.spy.memcached.transcoders.Transcoder; import org.apache.http.HttpRequest; @@ -588,37 +592,76 @@ public class CouchbaseClient extends MemcachedClient * @throws IllegalStateException in the rare circumstance where queue is too * full to accept any more requests */ + @Override public OperationFuture> asyncGetAndLock(final String key, - int exp, final Transcoder tc) { - final CountDownLatch latch = new CountDownLatch(1); - final OperationFuture> rv = - new OperationFuture>(key, latch, operationTimeout); + final int exp, final Transcoder tc) + { + final CountDownLatch latch = new CountDownLatch(1); + final OperationFuture> rv = + new OperationFuture>(key, latch, + this.operationTimeout); - Operation op = opFact.getl(key, exp, new GetlOperation.Callback() { - private CASValue val = null; + Operation op = this.opFact.getl(key, exp, new GetlOperation.Callback() { + private CASGetStatus val = null; - public void receivedStatus(OperationStatus status) { - if (!status.isSuccess()) { - val = new CASValue(-1, null); - } - rv.set(val, status); - } + @Override + public void complete() + { + latch.countDown(); + } - public void gotData(String k, int flags, long cas, byte[] data) { - assert key.equals(k) : "Wrong key returned"; - assert cas > 0 : "CAS was less than zero: " + cas; - val = - new CASValue(cas, tc.decode(new CachedData(flags, data, tc - .getMaxSize()))); - } + @Override + public void gotData(final String k, final int flags, + final long cas, final byte[] data) + { + assert key.equals(k) : "Wrong key returned"; + assert cas > 0 : "CAS was less than zero: " + cas; + this.val = + new CASGetStatus(cas, CASGetResponse.OK, tc + .decode(new CachedData(flags, data, tc + .getMaxSize()))); + } - public void complete() { - latch.countDown(); - } - }); - rv.setOperation(op); - mconn.enqueueOperation(key, op); - return rv; + @Override + public void receivedStatus(final OperationStatus status) + { + if (!status.isSuccess()) { + // status could be: TimedOutOperationStatus (eg: someone + // else has probably this locked) + // or: CASOperationStatus: NOT FOUND + + // if it is not found, we set it to null + // if it times out, we set the cas value to -1, null + if (status instanceof TimedOutOperationStatus) { + this.val = + new CASGetStatus(-1, CASGetResponse.TIMEOUT, + null); + } else if (status instanceof CASOperationStatus) { + CASOperationStatus casStatus = + (CASOperationStatus) status; + if (casStatus.getCASResponse() == CASResponse.NOT_FOUND) { + this.val = + new CASGetStatus(-1, + CASGetResponse.NOT_FOUND, null); + } else { + System.out.println("Also: WTF"); + } + } else { + this.val = + new CASGetStatus(-1, + CASGetResponse.OTHER_ERROR, null); + + } + if ((null != this.val) && (null != status)) { + this.val.setMessage(status.getMessage()); + } + } + rv.set(this.val, status); + } + }); + rv.setOperation(op); + this.mconn.enqueueOperation(key, op); + return rv; } /** @@ -795,4 +838,4 @@ public class CouchbaseClient extends MemcachedClient return shutdownResult; } -} +} \ No newline at end of file