Transaction.java

package com.surrealdb;

import java.util.Objects;

/**
 * Client-side transaction. Use {@link Surreal#beginTransaction()} to start a
 * transaction. Operations (e.g. {@link #query(String)}) run within the
 * transaction until {@link #commit()} or {@link #cancel()} is called.
 */
public class Transaction extends Native {

	Transaction(long ptr) {
		super(ptr);
	}

	private static native void nativeDeleteInstance(long ptr);

	private static native boolean commit(long ptr);

	private static native boolean cancel(long ptr);

	private static native long query(long ptr, String sql);

	/**
	 * Commits the transaction. After this call, the transaction is completed and
	 * must not be used. On failure the native layer throws; the return value is
	 * only true on success.
	 */
	public void commit() {
		try {
			commit(getPtr());
		} finally {
			moved();
		}
	}

	/**
	 * Cancels (rolls back) the transaction. After this call, the transaction is
	 * completed and must not be used. On failure the native layer throws; the
	 * return value is only true on success.
	 */
	public void cancel() {
		try {
			cancel(getPtr());
		} finally {
			moved();
		}
	}

	/**
	 * Runs a SurrealQL query within this transaction.
	 *
	 * @param sql
	 *            the SurrealQL query
	 * @return the query response
	 */
	public Response query(String sql) {
		return new Response(query(getPtr(), sql));
	}

	@Override
	final void deleteInstance(long ptr) {
		nativeDeleteInstance(ptr);
	}

	@Override
	final String toString(long ptr) {
		return getClass().getName() + "[ptr=" + ptr + "]";
	}

	@Override
	final int hashCode(long ptr) {
		return Objects.hashCode(ptr);
	}

	@Override
	final boolean equals(long ptr1, long ptr2) {
		return ptr1 == ptr2;
	}
}