use of com.servoy.j2db.util.xmlxport.ColumnInfoDef in project servoy-client by Servoy.
the class FoundSetManager method insertToDataSource.
public Object[] insertToDataSource(String name, IDataSet dataSet, ColumnType[] columnTypes, String[] pkNames, boolean create, boolean skipOnLoad, String server) throws ServoyException {
if (name == null) {
return null;
}
String dataSource = IServer.VIEW_SERVER.equals(server) ? DataSourceUtils.createViewDataSource(name) : DataSourceUtils.createInmemDataSource(name);
IDataSet fixedDataSet = dataSet;
List<ColumnType> fixedColumnTypes;
if (columnTypes == null) {
ColumnType[] dataSetTypes = BufferedDataSetInternal.getColumnTypeInfo(dataSet);
fixedColumnTypes = dataSetTypes == null ? null : asList(dataSetTypes);
} else {
fixedColumnTypes = asList(columnTypes);
}
// get column def from the first in-mem datasource found
ServoyJSONObject columnsDef = null;
Iterator<TableNode> tblIte = application.getFlattenedSolution().getTableNodes(dataSource);
int onLoadMethodId = -1;
while (tblIte.hasNext()) {
TableNode tn = tblIte.next();
if (columnsDef == null)
columnsDef = tn.getColumns();
if (onLoadMethodId == -1)
onLoadMethodId = tn.getOnFoundSetLoadMethodID();
}
HashMap<String, ColumnInfoDef> columnInfoDefinitions = null;
boolean[] rowsToStringserialize = null;
if (columnsDef == null) {
// if we have array columns, convert values using StringSerializer
if (containsArrayType(fixedColumnTypes)) {
rowsToStringserialize = new boolean[fixedColumnTypes.size()];
for (int i = 0; i < fixedColumnTypes.size(); i++) {
ColumnType columnType = fixedColumnTypes.get(i);
if (columnType.getSqlType() == Types.ARRAY) {
fixedColumnTypes.set(i, ColumnType.getColumnType(IColumnTypes.TEXT));
rowsToStringserialize[i] = true;
}
}
}
} else {
TableDef tableInfo = DatabaseUtils.deserializeTableInfo(columnsDef);
columnInfoDefinitions = new HashMap<String, ColumnInfoDef>();
List<String> inmemColumnNames = new ArrayList<>();
List<String> inmemPKs = new ArrayList<>();
List<ColumnType> inmemColumnTypes = new ArrayList<>();
for (int j = 0; j < tableInfo.columnInfoDefSet.size(); j++) {
ColumnInfoDef cid = tableInfo.columnInfoDefSet.get(j);
if (cid.autoEnterType != ColumnInfo.SEQUENCE_AUTO_ENTER || cid.autoEnterSubType != ColumnInfo.DATABASE_IDENTITY) {
inmemColumnNames.add(cid.name);
inmemColumnTypes.add(cid.columnType);
}
if ((cid.flags & IBaseColumn.IDENT_COLUMNS) != 0) {
inmemPKs.add(cid.name);
}
columnInfoDefinitions.put(cid.name, cid);
// apply stringserializer on designed datasources
if (JSONSerializerWrapper.STRING_SERIALIZER_NAME.equals(cid.converterName)) {
if (rowsToStringserialize == null) {
rowsToStringserialize = new boolean[fixedColumnTypes.size()];
}
rowsToStringserialize[j] = true;
}
}
if (pkNames == null && inmemPKs.size() > 0) {
pkNames = inmemPKs.toArray(new String[inmemPKs.size()]);
}
if (!asList(dataSet.getColumnNames()).equals(inmemColumnNames) || !compareColumnTypes(fixedColumnTypes, inmemColumnTypes)) {
if (dataSet.getColumnCount() > 0 && !asList(dataSet.getColumnNames()).equals(inmemColumnNames)) {
Debug.warn("Dataset column names definition does not match inmem table definition for datasource : " + dataSource + " columns of dataset: " + Arrays.toString(dataSet.getColumnNames()) + ", columns of in mem definition: " + inmemColumnNames);
}
if (fixedColumnTypes != null && !compareColumnTypes(fixedColumnTypes, inmemColumnTypes)) {
Debug.warn("Dataset column types definition does not match inmem table definition for datasource : " + dataSource + " types of dataset: " + fixedColumnTypes + ", types of in mem definition: " + inmemColumnTypes);
}
fixedColumnTypes = inmemColumnTypes;
fixedDataSet = BufferedDataSetInternal.createBufferedDataSet(inmemColumnNames.toArray(new String[inmemColumnNames.size()]), fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), new ArrayList<Object[]>(), false);
}
}
// - in the else branch above (already defined in the table node), columns that are not auto sequences or dbidents; see inmemColumnNames/inmemColumnTypes(which is at this point the same as fixedColumnTypes)
if (dataSet.getRowCount() > 0 && dataSet.getRow(0).length != fixedColumnTypes.size()) {
// $NON-NLS-1$
throw new RepositoryException("Data set rows do not match column count");
}
if (rowsToStringserialize != null) {
replaceValuesWithSerializedString(dataSet, rowsToStringserialize);
}
try {
ITable table = IServer.VIEW_SERVER.equals(server) ? viewDataSources.get(dataSource) : inMemDataSources.get(dataSource);
if (table == null && !create) {
throw new RepositoryException("Appending to non-existing datasource: " + dataSource);
}
GlobalTransaction gt = getGlobalTransaction();
String tid = null;
String serverName = server == null ? (table == null ? IServer.INMEM_SERVER : table.getServerName()) : server;
if (gt != null) {
tid = gt.getTransactionID(serverName);
}
if (create && table != null) {
// temp table was used before, delete all data in it
FoundSet foundSet = (FoundSet) getSharedFoundSet(dataSource);
foundSet.removeLastFound();
try {
QueryDelete delete = new QueryDelete(new QueryTable(table.getSQLName(), table.getDataSource(), table.getCatalog(), table.getSchema(), true));
SQLStatement deleteStatement = new SQLStatement(ISQLActionTypes.DELETE_ACTION, table.getServerName(), table.getName(), null, tid, delete, null);
application.getDataServer().performUpdates(application.getClientID(), new ISQLStatement[] { deleteStatement });
} catch (Exception e) {
Debug.log(e);
table = null;
}
RowManager element = rowManagers.get(dataSource);
if (element != null) {
element.flushAllCachedRows();
}
}
InsertResult insertResult = application.getDataServer().insertDataSet(application.getClientID(), fixedDataSet, dataSource, table == null ? IServer.INMEM_SERVER : table.getServerName(), table == null ? null : table.getName(), /* create temp table when null */
tid, fixedColumnTypes == null ? null : fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), /* inferred from dataset when null */
pkNames, columnInfoDefinitions);
if (insertResult != null) {
table = insertResult.getTable();
// then call insertDataSet again so the data is inserted with the columns defined in the the dataset.
if (dataSet != fixedDataSet && dataSet.getRowCount() > 0) {
insertResult = application.getDataServer().insertDataSet(application.getClientID(), dataSet, dataSource, table.getServerName(), table.getName(), tid, fixedColumnTypes == null ? null : fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), /* inferred from dataset when null */
pkNames, columnInfoDefinitions);
}
if (IServer.INMEM_SERVER.equals(serverName)) {
inMemDataSources.put(dataSource, table);
} else {
viewDataSources.put(dataSource, table);
}
fireTableEvent(table);
if (!skipOnLoad && fixedDataSet.getRowCount() == 0 && onLoadMethodId > 0) {
IFoundSetInternal sharedFoundSet = getSharedFoundSet(dataSource);
executeFoundsetTriggerReturnFirst(sharedFoundSet.getTable(), new Object[] { DataSourceUtils.getInmemDataSourceName(dataSource) }, StaticContentSpecLoader.PROPERTY_ONFOUNDSETLOADMETHODID, false, (Scriptable) sharedFoundSet);
}
if (create) {
// only refresh when it is a new full load, when adding data to an existing table, it is only applicable to the (shared) foundset
refreshFoundSetsFromDB(dataSource, null, false);
}
return insertResult.getGeneratedPks();
}
} catch (RemoteException e) {
throw new RepositoryException(e);
}
return null;
}
use of com.servoy.j2db.util.xmlxport.ColumnInfoDef in project servoy-client by Servoy.
the class FoundSetManager method getViewFoundSet.
@SuppressWarnings("nls")
@Override
public ViewFoundSet getViewFoundSet(String name, QBSelect query) {
if (query.getQuery().getColumns() == null || query.getQuery().getColumns().size() == 0) {
throw new RuntimeException("Can't create a ViewFoundset with name: " + name + " and query " + query + " that has no columns");
}
String dataSource = DataSourceUtils.createViewDataSource(name);
ViewFoundSet vfs = new ViewFoundSet(dataSource, query.build(), application.getFoundSetManager(), pkChunkSize);
// if this datasource defintion is created already in the developer then we need to check if the query columns are correctly matching it.
ServoyJSONObject columnsDef = null;
Iterator<TableNode> tblIte = application.getFlattenedSolution().getTableNodes(dataSource);
while (tblIte.hasNext() && columnsDef == null) {
TableNode tn = tblIte.next();
columnsDef = tn.getColumns();
if (columnsDef != null) {
TableDef def = DatabaseUtils.deserializeTableInfo(columnsDef);
for (ColumnInfoDef col : def.columnInfoDefSet) {
IQuerySelectValue selectValue = getSelectvalue(query, col.name);
if (selectValue == null) {
Debug.error("Column " + col.name + " of type " + col.columnType.toString() + " defined in view datasource '" + dataSource + "' was not found in the provided query.");
return null;
}
BaseColumnType columnType = selectValue.getColumnType();
// relax the mapping on default Servoy types
if (columnType != null && Column.mapToDefaultType(columnType.getSqlType()) != Column.mapToDefaultType(col.columnType.getSqlType())) {
Debug.error("Column type for column '" + col.name + " of type " + col.columnType.toString() + "' defined in view datasource '" + dataSource + "' does not match the one " + columnType + " provided in the query.");
return null;
}
}
}
}
return vfs;
}
use of com.servoy.j2db.util.xmlxport.ColumnInfoDef in project servoy-client by Servoy.
the class DatabaseUtils method deserializeTableInfo.
/**
* Gets the table information from a .dbi (JSON format) file like structured String.
*
* @param stringDBIContent the table information in .dbi format
* @return the deserialized table information.
* @throws JSONException if the structure of the JSON in String stringDBIContent is bad.
*/
public static TableDef deserializeTableInfo(ServoyJSONObject dbiContents) throws JSONException {
TableDef tableInfo = new TableDef();
tableInfo.name = dbiContents.getString("name");
tableInfo.tableType = dbiContents.getInt(TableDef.PROP_TABLE_TYPE);
tableInfo.hiddenInDeveloper = dbiContents.has(TableDef.HIDDEN_IN_DEVELOPER) ? dbiContents.getBoolean(TableDef.HIDDEN_IN_DEVELOPER) : false;
tableInfo.isMetaData = dbiContents.has(TableDef.IS_META_DATA) ? dbiContents.getBoolean(TableDef.IS_META_DATA) : false;
if (dbiContents.has(TableDef.PROP_COLUMNS)) {
JSONArray columns = dbiContents.getJSONArray(TableDef.PROP_COLUMNS);
for (int i = 0; i < columns.length(); i++) {
JSONObject cobj = columns.getJSONObject(i);
if (cobj == null)
continue;
ColumnInfoDef cid = new ColumnInfoDef();
cid.creationOrderIndex = cobj.getInt(ColumnInfoDef.CREATION_ORDER_INDEX);
cid.name = cobj.getString("name");
// Note, since 6.1 dataType and length are interpreted as configured type/length
cid.columnType = ColumnType.getInstance(cobj.getInt(ColumnInfoDef.DATA_TYPE), cobj.has(ColumnInfoDef.LENGTH) ? cobj.optInt(ColumnInfoDef.LENGTH) : 0, cobj.has(ColumnInfoDef.SCALE) ? cobj.optInt(ColumnInfoDef.SCALE) : 0);
cid.compatibleColumnTypes = cobj.has(ColumnInfoDef.COMPATIBLE_COLUMN_TYPES) ? XMLUtils.parseColumnTypeArray(cobj.optString(ColumnInfoDef.COMPATIBLE_COLUMN_TYPES)) : null;
cid.allowNull = cobj.getBoolean(ColumnInfoDef.ALLOW_NULL);
cid.autoEnterType = cobj.has(ColumnInfoDef.AUTO_ENTER_TYPE) ? cobj.optInt(ColumnInfoDef.AUTO_ENTER_TYPE) : ColumnInfo.NO_AUTO_ENTER;
cid.autoEnterSubType = cobj.has(ColumnInfoDef.AUTO_ENTER_SUB_TYPE) ? cobj.optInt(ColumnInfoDef.AUTO_ENTER_SUB_TYPE) : ColumnInfo.NO_SEQUENCE_SELECTED;
cid.sequenceStepSize = cobj.has(ColumnInfoDef.SEQUENCE_STEP_SIZE) ? cobj.optInt(ColumnInfoDef.SEQUENCE_STEP_SIZE) : 1;
cid.preSequenceChars = cobj.has(ColumnInfoDef.PRE_SEQUENCE_CHARS) ? cobj.optString(ColumnInfoDef.PRE_SEQUENCE_CHARS) : null;
cid.postSequenceChars = cobj.has(ColumnInfoDef.POST_SEQUENCE_CHARS) ? cobj.optString(ColumnInfoDef.POST_SEQUENCE_CHARS) : null;
cid.defaultValue = cobj.has(ColumnInfoDef.DEFAULT_VALUE) ? cobj.optString(ColumnInfoDef.DEFAULT_VALUE) : null;
cid.lookupValue = cobj.has(ColumnInfoDef.LOOKUP_VALUE) ? cobj.optString(ColumnInfoDef.LOOKUP_VALUE) : null;
cid.databaseSequenceName = cobj.has(ColumnInfoDef.DATABASE_SEQUENCE_NAME) ? cobj.optString(ColumnInfoDef.DATABASE_SEQUENCE_NAME) : null;
cid.titleText = cobj.has(ColumnInfoDef.TITLE_TEXT) ? cobj.optString(ColumnInfoDef.TITLE_TEXT) : null;
cid.description = cobj.has(ColumnInfoDef.DESCRIPTION) ? cobj.optString(ColumnInfoDef.DESCRIPTION) : null;
cid.foreignType = cobj.has(ColumnInfoDef.FOREIGN_TYPE) ? cobj.optString(ColumnInfoDef.FOREIGN_TYPE) : null;
cid.converterName = cobj.has(ColumnInfoDef.CONVERTER_NAME) ? cobj.optString(ColumnInfoDef.CONVERTER_NAME) : null;
cid.converterProperties = cobj.has(ColumnInfoDef.CONVERTER_PROPERTIES) ? cobj.optString(ColumnInfoDef.CONVERTER_PROPERTIES) : null;
cid.validatorProperties = cobj.has(ColumnInfoDef.VALIDATOR_PROPERTIES) ? cobj.optString(ColumnInfoDef.VALIDATOR_PROPERTIES) : null;
cid.validatorName = cobj.has(ColumnInfoDef.VALIDATOR_NAME) ? cobj.optString(ColumnInfoDef.VALIDATOR_NAME) : null;
cid.defaultFormat = cobj.has(ColumnInfoDef.DEFAULT_FORMAT) ? cobj.optString(ColumnInfoDef.DEFAULT_FORMAT) : null;
cid.elementTemplateProperties = cobj.has(ColumnInfoDef.ELEMENT_TEMPLATE_PROPERTIES) ? cobj.optString(ColumnInfoDef.ELEMENT_TEMPLATE_PROPERTIES) : null;
cid.flags = cobj.has(ColumnInfoDef.FLAGS) ? cobj.optInt(ColumnInfoDef.FLAGS) : 0;
cid.dataProviderID = cobj.has(ColumnInfoDef.DATA_PROVIDER_ID) ? Utils.toEnglishLocaleLowerCase(cobj.optString(ColumnInfoDef.DATA_PROVIDER_ID)) : null;
cid.containsMetaData = cobj.has(ColumnInfoDef.CONTAINS_META_DATA) ? Integer.valueOf(cobj.optInt(ColumnInfoDef.CONTAINS_META_DATA)) : null;
cid.sortIgnorecase = cobj.has(ColumnInfoDef.SORT_IGNORECASE) ? Boolean.valueOf(cobj.getBoolean(ColumnInfoDef.SORT_IGNORECASE)) : null;
cid.sortingNullprecedence = cobj.has(ColumnInfoDef.SORTING_NULLPRECEDENCE) ? SortingNullprecedence.valueOf(cobj.getString(ColumnInfoDef.SORTING_NULLPRECEDENCE)) : null;
if (!tableInfo.columnInfoDefSet.contains(cid)) {
tableInfo.columnInfoDefSet.add(cid);
}
}
// sort it based on creation index, so it is created the same as displayedin the table editor
Collections.sort(tableInfo.columnInfoDefSet, new Comparator<ColumnInfoDef>() {
@Override
public int compare(ColumnInfoDef o1, ColumnInfoDef o2) {
return o1.creationOrderIndex - o2.creationOrderIndex;
}
});
}
return tableInfo;
}
use of com.servoy.j2db.util.xmlxport.ColumnInfoDef in project servoy-client by Servoy.
the class FoundSetManager method insertToDataSource.
public Object[] insertToDataSource(String name, IDataSet dataSet, ColumnType[] columnTypes, WrappedObjectReference<String[]> pkNames, boolean create, boolean skipOnLoad, String server) throws ServoyException {
if (name == null) {
return null;
}
WrappedObjectReference<String[]> actualPkNames = pkNames;
if (actualPkNames == null)
actualPkNames = new WrappedObjectReference<String[]>(null);
String dataSource = IServer.VIEW_SERVER.equals(server) ? DataSourceUtils.createViewDataSource(name) : DataSourceUtils.createInmemDataSource(name);
// initial dataset to use, but can also be set later to a 0 row dataset that is created to match columnNames and columnTypes with an in-mem
// table definition, if that is available and columns do not match with the initial dataset
IDataSet fixedDataSet = dataSet;
List<ColumnType> fixedColumnTypes;
if (columnTypes == null) {
ColumnType[] dataSetTypes = BufferedDataSetInternal.getColumnTypeInfo(dataSet);
fixedColumnTypes = dataSetTypes == null ? null : asList(dataSetTypes);
} else {
fixedColumnTypes = asList(columnTypes);
}
// get column def from the first in-mem datasource found
ServoyJSONObject columnsDef = null;
Iterator<TableNode> tblIte = application.getFlattenedSolution().getTableNodes(dataSource);
int onLoadMethodId = -1;
while (tblIte.hasNext()) {
TableNode tn = tblIte.next();
if (columnsDef == null)
columnsDef = tn.getColumns();
if (onLoadMethodId == -1)
onLoadMethodId = tn.getOnFoundSetLoadMethodID();
}
HashMap<String, ColumnInfoDef> columnInfoDefinitions = null;
Set<Integer> columnsThatNeedToStringSerialize = null;
if (columnsDef == null) {
// if we have array columns, convert values using StringSerializer
if (containsArrayType(fixedColumnTypes)) {
columnsThatNeedToStringSerialize = new HashSet<>();
for (int i = 0; i < fixedColumnTypes.size(); i++) {
ColumnType columnType = fixedColumnTypes.get(i);
if (columnType.getSqlType() == Types.ARRAY) {
fixedColumnTypes.set(i, ColumnType.getColumnType(IColumnTypes.TEXT));
columnsThatNeedToStringSerialize.add(Integer.valueOf(i));
}
}
}
} else {
TableDef tableInfo = DatabaseUtils.deserializeTableInfo(columnsDef);
// column names that are not SEQUENCE_AUTO_ENTER/DATABASE_IDENTITY from table node (columnsDef)
List<String> inmemColumnNamesThatCanSetData = new ArrayList<>();
// column types of columns that are not SEQUENCE_AUTO_ENTER/DATABASE_IDENTITY from table node (columnsDef)
List<ColumnType> inmemColumnTypesForColumnsThatCanSetData = new ArrayList<>();
// ALL column defs from design time table node (columnsDef)
columnInfoDefinitions = new HashMap<String, ColumnInfoDef>();
// pk/rowid column names from design time table node (columnsDef)
List<String> inmemPKs = new ArrayList<>();
for (int j = 0; j < tableInfo.columnInfoDefSet.size(); j++) {
ColumnInfoDef cid = tableInfo.columnInfoDefSet.get(j);
if (cid.autoEnterType != ColumnInfo.SEQUENCE_AUTO_ENTER || cid.autoEnterSubType != ColumnInfo.DATABASE_IDENTITY) {
// we only support auto-enter for in-mem tables based on dbident (that is then handled by hsql)
// that is why we only check for that here; for example, if one would define at design time a
// uuid generator pk column on an in-mem table, that would not work; it would try to insert null into a non-nullable column
inmemColumnNamesThatCanSetData.add(cid.name);
inmemColumnTypesForColumnsThatCanSetData.add(cid.columnType);
}
if ((cid.flags & IBaseColumn.IDENT_COLUMNS) != 0) {
inmemPKs.add(cid.name);
}
columnInfoDefinitions.put(cid.name, cid);
// apply stringserializer on designed datasources
if (JSONSerializerWrapper.STRING_SERIALIZER_NAME.equals(cid.converterName)) {
if (columnsThatNeedToStringSerialize == null) {
columnsThatNeedToStringSerialize = new HashSet<>();
}
columnsThatNeedToStringSerialize.add(Integer.valueOf(j));
}
}
if (actualPkNames.o == null && inmemPKs.size() > 0) {
actualPkNames.o = inmemPKs.toArray(new String[inmemPKs.size()]);
}
if (!asList(dataSet.getColumnNames()).equals(inmemColumnNamesThatCanSetData) || !compareColumnTypes(fixedColumnTypes, inmemColumnTypesForColumnsThatCanSetData)) {
if (dataSet.getColumnCount() > 0 && /*
* do not generate warning if this is just the initial load of a design time inmem table that adds 0 rows
* and doesn't care about columns
*/
!asList(dataSet.getColumnNames()).equals(inmemColumnNamesThatCanSetData)) {
Debug.warn("Dataset column names definition does not match inmem table definition for datasource : " + dataSource + " columns of dataset: " + Arrays.toString(dataSet.getColumnNames()) + ", columns of in mem definition: " + inmemColumnNamesThatCanSetData);
}
if (fixedColumnTypes != null && !compareColumnTypes(fixedColumnTypes, inmemColumnTypesForColumnsThatCanSetData)) {
Debug.warn("Dataset column types definition does not match inmem table definition for datasource : " + dataSource + " types of dataset: " + fixedColumnTypes + ", types of in mem definition: " + inmemColumnTypesForColumnsThatCanSetData);
}
fixedColumnTypes = inmemColumnTypesForColumnsThatCanSetData;
fixedDataSet = BufferedDataSetInternal.createBufferedDataSet(inmemColumnNamesThatCanSetData.toArray(new String[inmemColumnNamesThatCanSetData.size()]), fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), new ArrayList<Object[]>(), false);
}
}
// - in the else branch above (already defined at design time), columns that are not auto sequences or dbidents; see inmemColumnNames/inmemColumnTypes(which is at this point the same as fixedColumnTypes)
if (fixedColumnTypes != null && dataSet.getRowCount() > 0 && dataSet.getRow(0).length != fixedColumnTypes.size()) {
// $NON-NLS-1$
throw new RepositoryException("Data set rows do not match column count");
}
if (columnsThatNeedToStringSerialize != null) {
replaceValuesWithSerializedString(dataSet, columnsThatNeedToStringSerialize);
}
try {
ITable table = IServer.VIEW_SERVER.equals(server) ? viewDataSources.get(dataSource) : inMemDataSources.get(dataSource);
if (table == null && !create) {
throw new RepositoryException("Appending to non-existing datasource: " + dataSource);
}
GlobalTransaction gt = getGlobalTransaction();
String tid = null;
String serverName = server == null ? (table == null ? IServer.INMEM_SERVER : table.getServerName()) : server;
if (gt != null) {
tid = gt.getTransactionID(serverName);
}
if (create && table != null) {
// temp table was used before, delete all data in it
FoundSet foundSet = (FoundSet) getSharedFoundSet(dataSource);
foundSet.removeLastFound();
try {
QueryDelete delete = new QueryDelete(new QueryTable(table.getSQLName(), table.getDataSource(), table.getCatalog(), table.getSchema(), true));
SQLStatement deleteStatement = new SQLStatement(ISQLActionTypes.DELETE_ACTION, table.getServerName(), table.getName(), null, tid, delete, null);
application.getDataServer().performUpdates(application.getClientID(), new ISQLStatement[] { deleteStatement });
} catch (Exception e) {
Debug.log(e);
table = null;
}
RowManager element = rowManagers.get(dataSource);
if (element != null) {
element.flushAllCachedRows();
}
}
InsertResult insertResult = application.getDataServer().insertDataSet(application.getClientID(), fixedDataSet, dataSource, table == null ? IServer.INMEM_SERVER : table.getServerName(), table == null ? null : table.getName(), /* create temp table when null */
tid, fixedColumnTypes == null ? null : fixedColumnTypes.toArray(new ColumnType[fixedColumnTypes.size()]), /* inferred from dataset when null */
actualPkNames.o, columnInfoDefinitions);
if (insertResult != null) {
table = insertResult.getTable();
// do we want to fix that somehow or the caller should just make sure it calls it with the correct column order?
if (dataSet != fixedDataSet && dataSet.getRowCount() > 0) {
insertResult = application.getDataServer().insertDataSet(application.getClientID(), dataSet, dataSource, table.getServerName(), table.getName(), tid, columnTypes, /* will be inferred by called method from dataset if null */
actualPkNames.o, columnInfoDefinitions);
}
if (IServer.INMEM_SERVER.equals(serverName)) {
inMemDataSources.put(dataSource, table);
} else {
viewDataSources.put(dataSource, table);
}
fireTableEvent(table);
if (!skipOnLoad && dataSet.getRowCount() == 0 && onLoadMethodId > 0) {
IFoundSetInternal sharedFoundSet = getSharedFoundSet(dataSource);
executeFoundsetTriggerReturnFirst(sharedFoundSet.getTable(), new Object[] { DataSourceUtils.getInmemDataSourceName(dataSource) }, StaticContentSpecLoader.PROPERTY_ONFOUNDSETLOADMETHODID, false, (Scriptable) sharedFoundSet);
}
if (create) {
// only refresh when it is a new full load, when adding data to an existing table, it is only applicable to the (shared) foundset
refreshFoundSetsFromDB(dataSource, null, false);
}
return insertResult.getGeneratedPks();
}
} catch (RemoteException e) {
throw new RepositoryException(e);
}
return null;
}
use of com.servoy.j2db.util.xmlxport.ColumnInfoDef in project servoy-client by Servoy.
the class DatabaseUtils method deserializeInMemoryTable.
public static void deserializeInMemoryTable(IPersistFactory persistFactory, ITable t, ServoyJSONObject property) throws RepositoryException, JSONException {
int existingColumnInfo = 0;
TableDef tableInfo = deserializeTableInfo(property);
// if (!t.getName().equals(tableInfo.name))
// {
// throw new RepositoryException("Table name does not match dbi file name for " + t.getName());
// }
List<IColumn> changedColumns = null;
if (tableInfo.columnInfoDefSet.size() > 0) {
changedColumns = new ArrayList<IColumn>(tableInfo.columnInfoDefSet.size());
for (ColumnInfoDef cid : tableInfo.columnInfoDefSet) {
String cname = cid.name;
Column c = t.getColumn(cname);
if (c == null) {
c = t.createNewColumn(DummyValidator.INSTANCE, cid.name, cid.columnType.getSqlType(), cid.columnType.getLength(), cid.columnType.getScale(), cid.allowNull);
existingColumnInfo++;
updateColumnInfo(persistFactory.getNewElementID(null), c, cid);
changedColumns.add(c);
}
}
}
Iterator<Column> columns = t.getColumns().iterator();
while (columns.hasNext()) {
Column c = columns.next();
if (c.getColumnInfo() == null) {
// only create servoy sequences when this was a new table and there is only 1 pk column
// was missing - create automatic sequences if missing
createNewColumnInfo(persistFactory.getNewElementID(null), c, existingColumnInfo == 0 && t.getPKColumnTypeRowIdentCount() == 1);
}
}
// if (t.getRowIdentColumnsCount() == 0)
// {
// t.setHiddenInDeveloperBecauseNoPk(true);
// s.setTableMarkedAsHiddenInDeveloper(t.getName(), true);
// }
// else s.setTableMarkedAsHiddenInDeveloper(t.getName(), tableInfo.hiddenInDeveloper);
t.setMarkedAsMetaData(Boolean.TRUE.equals(tableInfo.isMetaData));
// let table editors and so on now that a columns are loaded
t.fireIColumnsChanged(changedColumns);
}
Aggregations