/*******************************************************************************
* Copyright © 2012, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.gen.java.templates.eglx.persistence.sql;
import org.eclipse.edt.gen.java.Context;
import org.eclipse.edt.mof.codegen.api.TabbedWriter;
import org.eclipse.edt.mof.egl.Classifier;
import org.eclipse.edt.mof.egl.EGLClass;
import org.eclipse.edt.mof.egl.Expression;
import org.eclipse.edt.mof.egl.Field;
import org.eclipse.edt.mof.eglx.persistence.sql.SqlActionStatement;
import org.eclipse.edt.mof.eglx.persistence.sql.SqlReplaceStatement;
import org.eclipse.edt.mof.eglx.persistence.sql.ext.Utils;
public class SqlReplaceStatementTemplate extends SqlActionStatementTemplate {
public void genStatementBody(SqlReplaceStatement stmt, Context ctx, TabbedWriter out) {
if (stmt.getSqlString() != null) {
genSqlStatementSetup(stmt, ctx, out);
if(stmt.getUsingExpressions() != null && stmt.getUsingExpressions().size() > 0 ){
int i = 1;
for (Expression uexpr : stmt.getUsingExpressions()) {
genSetColumnValue(stmt, uexpr, var_statement, i, ctx, out);
i++;
}
}
else{
EGLClass targetType = getTargetType(stmt);
int i = 1;
for (Field f : targetType.getFields()) {
if (!Utils.isKeyField(f) && Utils.isUpdateable(f) && Utils.isMappedSQLType((EGLClass)f.getType().getClassifier())) {
genSetColumnValue(f, var_statement, getExprString(stmt.getTarget(), ctx), i, ctx, out);
i++;
}
}
genWhereClauseParameterSettings(stmt, var_statement, i, ctx, out);
}
out.println(var_statement + ".executeUpdate();");
genSqlStatementEnd(stmt, ctx, out);
}
else {
// We have an open result set already
if (stmt.getTarget() != null) {
String var_resultSet = ctx.nextTempName();
out.println("try {");
// DataSource is a ResultSet already which is why there is no sql string
out.print(class_ResultSet + " " + var_resultSet);
out.print(" = ");
ctx.invoke(genExpression, stmt.getDataSource(), ctx, out);
out.println(".getResultSet();");
for (Field f : ((EGLClass)stmt.getTarget().getType()).getFields()) {
if (Utils.isUpdateable(f) && Utils.isMappedSQLType((EGLClass)f.getType().getClassifier())) {
if(f.isNullable()){
out.print("if(null == ");
out.print(getExprString(stmt.getTarget(), ctx));
out.print('.');
ctx.invoke(genName, f, ctx, out);
out.println("){");
out.print(var_resultSet);
out.print(".updateNull(");
out.print(quoted(Utils.getColumnName(f)));
out.println(");");
out.println("}");
out.println("else{");
}
EGLClass type = (EGLClass)f.getType().getClassifier();
out.print(var_resultSet);
out.print(".");
genSqlUpdateValueMethodName(type, ctx, out);
out.print("(");
out.print(quoted(Utils.getColumnName(f)));
out.print(", ");
genConvertValueStart(type, ctx, out);
ctx.invoke(genExpression, stmt.getTarget(), ctx, out);
out.print('.');
ctx.invoke(genName, f, ctx, out);
genConvertValueEnd(type, ctx, out);
out.println(");");
if(f.isNullable()){
out.println("}");
}
}
}
ctx.invoke(genExpression, stmt.getDataSource(), ctx, out);
out.println(".getResultSet().updateRow();");
}
genSqlStatementEnd(stmt, ctx, out);
}
}
public void genSqlUpdateValueMethodName(Classifier type, Context ctx, TabbedWriter out) {
String name = "update";
name += Utils.getSqlSimpleTypeName(type);
out.print(name);
}
protected void genSetStatementsForUsingClause(SqlActionStatement stmt, String var_stmt, Context ctx, TabbedWriter out){
}
}