Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.script.inst.sql;
 
 import java.util.List;
 
 
 public class SqlUpdate extends Instruction {
 	public void run(final StackEntry stack) {
 		//stack.log().info("Doing a SQL UPDATE on thread " + Thread.currentThread().getName());
 		
 		String dbname = stack.stringFromSource("Database""default");
 		String table = stack.stringFromSource("Table");
 
 		if (StringUtil.isEmpty(dbname) || StringUtil.isEmpty(table)) {
 			stack.log().error("Missing table for insert");
 			stack.resume();
 			return;
 		}
 		
 		XElement codeEl = stack.getInstruction().getXml();		
 		
 		sb1.append("UPDATE " + table + " SET ");
 		
 		List<XElementfields = codeEl.selectAll("Field");
 		XElement el2 = codeEl.selectFirst("Where");
 		
 		if (el2 == null) {
 			stack.log().error("Missing WHERE in SQL UPDATE");
 			stack.resume();
 			return;
 		}
 		
 		boolean firstfld = true;
     	int pos = 0;
     	
 		Object[] vals = new Object[fields.size() + ((el2 == null) ? 0 : 1)];
 	
 		for (XElement el : fields) {
 			boolean skipnull = stack.boolFromElement(el"SkipNull"false);
 			
 	        Object val = SqlInsert.convertValueToInternal(stackel);
 
 			if (skipnull && (val instanceof SqlNull)) 
 				continue;
 			
 			if (firstfld)
 				firstfld = false;
 			else 
 				sb1.append(',');
 			
 			sb1.append(stack.stringFromElement(el"Name") + " = ?");
 			
 			vals[pos] = val;
 			pos++;
 		}
 		
 		vals[pos] = SqlInsert.convertValueToInternal(stackel2);
 		pos++;
 		
 		// if too big, resize array
 		if (pos < vals.length
 			vals = Arrays.copyOfRange(vals, 0, pos);
 		
 		// no fields updated - don't error, might just mean there was no match after skip checks
 		if (firstfld) {
 			stack.resume();
 			return;
 		}
		String sql = sb1.toString() + " WHERE " + stack.stringFromElement(el2"Name") + " = ?";
		if (db == null) {
			stack.log().errorTr(185, dbname);
			stack.resume();
			return;
		}
        
		FuncResult<Integerrsres = db.executeUpdate(sqlvals);
		stack.log().copyMessages(rsres);
		if (rsres.getResult() != 1) 
			stack.log().error("UPDATE failed, expected 1 row result count");		
		stack.resume();
	}
	public void cancel(StackEntry stack) {
		// do nothing, this isn't cancellable
	}
New to GrepCode? Check out our FAQ X