All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sf.saxon.option.sql.SQLDelete Maven / Gradle / Ivy

There is a newer version: 10.5
Show newest version
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2013 Saxonica Limited.
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package net.sf.saxon.option.sql;

import net.sf.saxon.expr.Expression;
import net.sf.saxon.expr.SimpleExpression;
import net.sf.saxon.expr.StringLiteral;
import net.sf.saxon.expr.XPathContext;
import net.sf.saxon.expr.instruct.Executable;
import net.sf.saxon.om.Item;
import net.sf.saxon.om.Sequence;
import net.sf.saxon.style.Declaration;
import net.sf.saxon.style.ExtensionInstruction;
import net.sf.saxon.trans.SaxonErrorCode;
import net.sf.saxon.trans.XPathException;
import net.sf.saxon.value.ObjectValue;
import net.sf.saxon.value.StringValue;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
* An sql:delete element in the stylesheet.
*  @author Mathias Payer 
*  @author Michael Kay
* 

* For example: *

*   <sql:delete connection="$connection" table="table-name" where="{$where}"
*                 xsl:extension-element-prefixes="sql" />
* 

*

*/ public class SQLDelete extends ExtensionInstruction { Expression connection; String table; Expression where; public void prepareAttributes() throws XPathException { table = getAttributeList().getValue("", "table"); if (table==null) { reportAbsence("table"); table = "saxon-error-table"; } table = SQLConnect.quoteSqlName(table); String dbWhere = getAttributeList().getValue("", "where"); if (dbWhere == null) { where = new StringLiteral(StringValue.EMPTY_STRING); } else { where = makeAttributeValueTemplate(dbWhere); } String connectAtt = getAttributeList().getValue("", "connection"); if (connectAtt==null) { reportAbsence("connection"); } else { connection = makeExpression(connectAtt); } } public void validate(Declaration decl) throws XPathException { super.validate(decl); where = typeCheck("where", where); connection = typeCheck("connection", connection); } public Expression compile(Executable exec, Declaration decl) throws XPathException { return new DeleteInstruction(connection, "DELETE FROM " + table, where); } private static class DeleteInstruction extends SimpleExpression { private static final long serialVersionUID = -4234440812734827279L; public static final int CONNECTION = 0; public static final int WHERE = 1; String statement; public DeleteInstruction(Expression connection, String statement, Expression where) { Expression[] sub = new Expression[2]; sub[CONNECTION] = connection; sub[WHERE] = where; this.statement = statement; setArguments(sub); } /** * A subclass must provide one of the methods evaluateItem(), iterate(), or process(). * This method indicates which of the three is provided. */ public int getImplementationMethod() { return Expression.EVALUATE_METHOD; } public String getExpressionType() { return "sql:delete"; } /*@Nullable*/ public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException { // Prepare the SQL statement (only do this once) Item conn = arguments[CONNECTION].head(); if (!(conn instanceof ObjectValue && ((ObjectValue)conn).getObject() instanceof Connection) ) { dynamicError("Value of connection expression is not a JDBC Connection", SaxonErrorCode.SXSQ0001, context); } Connection connection = (Connection)((ObjectValue)conn).getObject(); PreparedStatement ps = null; String dbWhere = arguments[WHERE].head().toString(); String localstmt = statement; if (!dbWhere.equals("")) { localstmt += " WHERE " + dbWhere; } try { ps=connection.prepareStatement(localstmt); ps.executeUpdate(); if (!connection.getAutoCommit()) { connection.commit(); } } catch (SQLException ex) { dynamicError("SQL DELETE failed: " + ex.getMessage(), SaxonErrorCode.SXSQ0004, context); } finally { if (ps != null) { try { ps.close(); } catch (SQLException ignore) {} } } return null; } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy