package com.bagri.xquery.saxon.ext.tx; import static com.bagri.core.Constants.bg_ns; import static com.bagri.core.Constants.bg_schema; import java.util.UUID; import com.bagri.core.api.TransactionIsolation; import com.bagri.core.api.TransactionManagement; import com.bagri.core.api.BagriException; import net.sf.saxon.expr.XPathContext; import net.sf.saxon.lib.ExtensionFunctionCall; import net.sf.saxon.lib.ExtensionFunctionDefinition; import net.sf.saxon.om.Sequence; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.trans.XPathException; import net.sf.saxon.value.Int64Value; import net.sf.saxon.value.SequenceType; public class BeginTransaction extends ExtensionFunctionDefinition { private TransactionManagement txMgr; public BeginTransaction(TransactionManagement txMgr) { this.txMgr = txMgr; } @Override public StructuredQName getFunctionQName() { return new StructuredQName(bg_schema, bg_ns, "begin-transaction"); } @Override public int getMinimumNumberOfArguments() { return 0; } @Override public int getMaximumNumberOfArguments() { return 1; } @Override public SequenceType[] getArgumentTypes() { return new SequenceType[] {SequenceType.OPTIONAL_STRING}; } @Override public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { return SequenceType.SINGLE_INT; } @Override public ExtensionFunctionCall makeCallExpression() { return new ExtensionFunctionCall() { @Override public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException { long txId; try { if (arguments.length > 0) { txId = txMgr.beginTransaction(TransactionIsolation.valueOf(arguments[0].head().getStringValue())); } else { txId = txMgr.beginTransaction(); } return new Int64Value(txId); } catch (BagriException ex) { throw new XPathException(ex); } } }; } }