private RemoteProposeData InternalChange(RemoteRowBody oldRow, RemoteRowBody newRow, string column) { Row localOldRow = new Row(_plan.Process.ServerProcess.ValueManager, _serverCursor.SourceRowType); try { localOldRow.ValuesOwned = false; localOldRow.AsPhysical = oldRow.Data; Row localNewRow = new Row(_plan.Process.ServerProcess.ValueManager, _serverCursor.SourceRowType); try { localNewRow.ValuesOwned = false; localNewRow.AsPhysical = newRow.Data; RemoteProposeData proposeData = new RemoteProposeData(); proposeData.Success = _serverCursor.Change(localOldRow, localNewRow, column); proposeData.Body = new RemoteRowBody(); proposeData.Body.Data = localNewRow.AsPhysical; return(proposeData); } finally { localNewRow.Dispose(); } } finally { localOldRow.Dispose(); } }
/// <summary>Ensures that the given row is valid.</summary> /// <param name='oldRow'>A <see cref="Row"/> containing the original values for the row.</param> /// <param name='newRow'>A <see cref="Row"/> containing the changed values for the row.</param> /// <param name='columnName'>The name of the column which changed in <paramref name="newRow"/>. If empty, the change affected more than one column.</param> /// <returns>A boolean value indicating whether any change was made to <paramref name="newRow"/>.</returns> public bool Validate(IRow oldRow, IRow newRow, string columnName) { if ((_internalProcess != null) && TableVar.IsValidateCallRemotable(columnName)) { IRow localOldRow = oldRow; if ((oldRow != null) && oldRow.HasNonNativeValues()) { localOldRow = new Row(_internalProcess.ValueManager, oldRow.DataType); MarshalRow(oldRow, localOldRow); } IRow localNewRow = newRow; if (newRow.HasNonNativeValues()) { localNewRow = new Row(_internalProcess.ValueManager, newRow.DataType); MarshalRow(newRow, localNewRow); } _plan._process._session._server.AcquireCacheLock(_plan._process, LockMode.Shared); try { bool changed = TableNode.Validate(_internalProgram, localOldRow, localNewRow, null, columnName); if (changed && !Object.ReferenceEquals(newRow, localNewRow)) { MarshalRow(localNewRow, newRow); } return(changed); } finally { _plan._process._session._server.ReleaseCacheLock(_plan._process, LockMode.Shared); } } else { RemoteRowBody oldBody = new RemoteRowBody(); if (oldRow != null) { _plan._process.EnsureOverflowReleased(oldRow); oldBody.Data = oldRow.AsPhysical; } _plan._process.EnsureOverflowReleased(newRow); RemoteRowBody newBody = new RemoteRowBody(); newBody.Data = newRow.AsPhysical; RemoteProposeData proposeData = _cursor.Validate(oldBody, newBody, columnName, _plan._process.GetProcessCallInfo()); _plan._programStatisticsCached = false; if (proposeData.Success) { newRow.ValuesOwned = false; // do not clear the overflow streams because the row is effectively owned by the server during the validate call newRow.AsPhysical = proposeData.Body.Data; newRow.ValuesOwned = true; } return(proposeData.Success); } }
/// <summary>Requests the default values for a new row in the cursor.</summary> /// <param name='row'>A <see cref="Row"/> to be filled in with default values.</param> /// <returns>A boolean value indicating whether any change was made to <paramref name="row"/>.</returns> public bool Default(IRow row, string columnName) { if ((_internalProcess != null) && TableVar.IsDefaultCallRemotable(columnName)) { // create a new row based on FInternalProcess, and copy the data from IRow localRow = row; if (row.HasNonNativeValues()) { localRow = new Row(_internalProcess.ValueManager, row.DataType); MarshalRow(row, localRow); } _plan._process._session._server.AcquireCacheLock(_plan._process, LockMode.Shared); try { bool changed = TableNode.Default(_internalProgram, null, localRow, null, columnName); if (changed && !Object.ReferenceEquals(localRow, row)) { MarshalRow(localRow, row); } return(changed); } finally { _plan._process._session._server.ReleaseCacheLock(_plan._process, LockMode.Shared); } } else { _plan._process.EnsureOverflowReleased(row); RemoteRowBody body = new RemoteRowBody(); body.Data = row.AsPhysical; RemoteProposeData proposeData = _cursor.Default(body, columnName, _plan._process.GetProcessCallInfo()); _plan._programStatisticsCached = false; if (proposeData.Success) { row.ValuesOwned = false; // do not clear the overflow streams because the row is effectively owned by the server for the course of the default call. row.AsPhysical = proposeData.Body.Data; row.ValuesOwned = true; } return(proposeData.Success); } }