/*
This file belongs to the Servoy development and deployment environment, Copyright (C) 1997-2010 Servoy BV
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Affero General Public License as published by the Free
Software Foundation; either version 3 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License along
with this program; if not, see http://www.gnu.org/licenses or write to the Free
Software Foundation,Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
*/
package com.servoy.j2db.dataprocessing;
import java.util.ArrayList;
import java.util.HashMap;
import com.servoy.j2db.persistence.Column;
import com.servoy.j2db.query.ISQLSelect;
import com.servoy.j2db.query.ISQLUpdate;
import com.servoy.j2db.util.Utils;
/**
* SQLStatment object which can be serialized
* @author jblok
*/
public class SQLStatement implements ITrackingSQLStatement
{
public static final long serialVersionUID = 4631404274972093942L;
private int action = NO_ACTION;
private String server_name;
private final String table_name;
private final IDataSet pks;//all pks which should be broadcasted
private final ISQLUpdate sqlUpdate;
private final ArrayList<TableFilter> filters;
private String[] changedColumns;
private final String transactionID;
private String[] column_names;
private Object[][] oldTrackingData;
private Object[][] newTrackingData;
private int expectedUpdateCount = -1;
private String user_uid;
private HashMap<String, Object> trackingInfo;
private String clientId;
private boolean oracleFix;
private final ISQLSelect requerySelect;
private int dataType = ISQLStatement.REGULAR_DATA_TYPE;
/**
* create a SQLStatement
* @param connection_name
* @param tableName
* @param pk an array with inside arrays with pkcolumn(s)
* @param sql
* @param questiondata
*/
public SQLStatement(int action, String connection_name, String tableName, IDataSet pks, ISQLUpdate sqlUpdate)
{
this(action, connection_name, tableName, pks, null, sqlUpdate, null);
}
public SQLStatement(int action, String connection_name, String tableName, IDataSet pks, String tid, ISQLUpdate sqlUpdate, ArrayList<TableFilter> filters)
{
this(action, connection_name, tableName, pks, tid, sqlUpdate, filters, null);
}
public SQLStatement(int action, String connection_name, String tableName, IDataSet pks, String tid, ISQLUpdate sqlUpdate, ArrayList<TableFilter> filters,
ISQLSelect requerySelect)
{
this.action = action;
this.server_name = connection_name;
this.table_name = tableName;
this.pks = pks;
this.sqlUpdate = sqlUpdate;
this.filters = filters;
this.transactionID = tid;
this.requerySelect = requerySelect;
}
public void setOracleFixTrackingData(boolean oracleFix)
{
this.oracleFix = oracleFix;
}
public boolean isOracleFixTrackingData()
{
return this.oracleFix;
}
public void setTrackingData(String[] column_names, Object[][] oldData, Object[][] newData, String user_uid, HashMap<String, Object> trackingInfo,
String clientId)
{
// TODO filter all data that is not changed out of the 3 arrays.
if (oldData == null && newData == null) return;
if (oldData == null)
{
oldTrackingData = new Object[newData.length][(newData.length > 0 ? (newData[0] != null ? newData[0].length : 0) : 0)];
}
else
{
oldTrackingData = new Object[oldData.length][(oldData.length > 0 ? (oldData[0] != null ? oldData[0].length : 0) : 0)];
for (int i = 0; i < oldData.length; i++)
{
System.arraycopy(oldData[i], 0, oldTrackingData[i], 0, oldData[i].length);
}
}
if (newData == null)
{
newTrackingData = new Object[oldData.length][(oldData.length > 0 ? (oldData[0] != null ? oldData[0].length : 0) : 0)];
}
else
{
newTrackingData = new Object[newData.length][(newData.length > 0 ? (newData[0] != null ? newData[0].length : 0) : 0)];
for (int i = 0; i < newData.length; i++)
{
System.arraycopy(newData[i], 0, newTrackingData[i], 0, newData[i].length);
}
}
this.column_names = column_names;
this.user_uid = user_uid;
this.trackingInfo = trackingInfo;
this.clientId = clientId;
//optimize wire transfer
for (int i = 0; i < oldTrackingData.length; i++)
{
for (int j = 0; j < oldTrackingData[i].length; j++)
{
if (oldTrackingData[i][j] instanceof ValueFactory.BlobMarkerValue)
{
oldTrackingData[i][j] = ((ValueFactory.BlobMarkerValue)oldTrackingData[i][j]).getCachedData();
}
if (oldTrackingData[i][j] instanceof ValueFactory.NullValue)
{
oldTrackingData[i][j] = null;
}
if (oldTrackingData[i][j] instanceof byte[])
{
oldTrackingData[i][j] = oldTrackingData[i][j].toString();
}
if (newTrackingData[i][j] instanceof ValueFactory.BlobMarkerValue)
{
newTrackingData[i][j] = ((ValueFactory.BlobMarkerValue)newTrackingData[i][j]).getCachedData();
}
if (newTrackingData[i][j] instanceof ValueFactory.NullValue)
{
newTrackingData[i][j] = null;
}
// Don't do toString()
if (newTrackingData[i][j] instanceof byte[])
{
newTrackingData[i][j] = newTrackingData[i][j];
}
if (Utils.equalObjects(oldTrackingData[i][j], newTrackingData[i][j]))
{
oldTrackingData[i][j] = null;
newTrackingData[i][j] = null;
}
}
}
}
public boolean isTracking()
{
return (column_names != null && !oracleFix);
}
public String getServerName()
{
return server_name;
}
public void setServerName(String name)
{
server_name = name;
}
public ISQLUpdate getUpdate()
{
return sqlUpdate;
}
public ArrayList<TableFilter> getFilters()
{
return filters;
}
public String[] getChangedColumns()
{
return changedColumns;
}
public int getAction()
{
return action;
}
public String getTableName()
{
return table_name;
}
public String[] getColumnNames()
{
return column_names;
}
public Object[][] getOldTrackingData()
{
return oldTrackingData;
}
public Object[][] getNewTrackingData()
{
return newTrackingData;
}
public String getUserUID()
{
return user_uid;
}
public HashMap<String, Object> getTrackingInfo()
{
return trackingInfo;
}
public String getTransactionID()
{
return transactionID;
}
public String getClientID()
{
return clientId;
}
/**
* Returns the pks.
* @return Object[]
*/
public IDataSet getPKs()
{
return pks;
}
public void setIdentityColumn(Column c)
{
identityColumn = c;
}
private Column identityColumn;
public Column getIdentityColumn()
{
return identityColumn;
}
public boolean usedIdentity()
{
return identityColumn != null;
}
public int getExpectedUpdateCount()
{
return expectedUpdateCount;
}
/**
* Set the update count for checking
*/
public void setExpectedUpdateCount(int expectedUpdateCount)
{
this.expectedUpdateCount = expectedUpdateCount;
}
@Override
public String toString()
{
return "SQLSTATEMENT[server:" + server_name + ", table:" + table_name + ", sql:" + sqlUpdate + ", filters:" + filters + ']'; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
public void setChangedColumns(String[] changedColumns)
{
this.changedColumns = changedColumns;
}
public ISQLSelect getRequerySelect()
{
return requerySelect;
}
public int getDataType()
{
return dataType;
}
public void setDataType(int dataType)
{
this.dataType = dataType;
}
}