About the Extending the replication synchronization process Sample
[C#]
RasterSyncWorkspaceExtension.cs
using System;
using System.Runtime.InteropServices;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.GeoDatabaseDistributed;
namespace RasterSyncExtension
{
/// <summary>
/// An example of a workspace extension that extends the synchronization process. This
/// implementation synchronizes a specific raster catalog in addition to the out-of-the-box
/// synchronization process.
/// </summary>
[Guid("97CD2883-37CB-4f76-BD0F-945279C783DC")]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("RasterSyncExtension.RasterSyncWorkspaceExtension")]
[ComVisible(true)]
public class RasterSyncWorkspaceExtension : IWorkspaceExtensionControl, IWorkspaceExtension2, IWorkspaceReplicaSyncEvents
{
#region Private Variables
/// <summary>
/// Provides a weak reference to the extension's workspace.
/// </summary>
private IWorkspaceHelper workspaceHelper = null;
/// <summary>
/// The name of the raster catalog to synchronize.
/// </summary>
private const String rasterCatalogName = "ras_cat";
/// <summary>
/// The name of the replica that requires raster synchronization.
/// </summary>
private const String rasterReplicaName = "myreplicaras";
/// <summary>
/// The name of the integer field in the raster catalogs that stores generation numbers.
/// </summary>
private const String genFieldName = "gen";
#endregion
#region IWorkspaceExtensionControl Members
/// <summary>
/// Initializes the workspace extension.
/// </summary>
/// <param name="workspaceHelper">Provides a weak reference to the workspace.</param>
public void Init(IWorkspaceHelper workspaceHelper)
{
this.workspaceHelper = workspaceHelper;
}
/// <summary>
/// Called to shutdown the extension.
/// </summary>
public void Shutdown()
{
workspaceHelper = null;
}
#endregion
#region IWorkspaceExtension2 Members
/// <summary>
/// The name of the extension.
/// </summary>
public string Name
{
get { return "RasterSyncWorkspaceExtension"; }
}
/// <summary>
/// The extension's GUID.
/// </summary>
public UID GUID
{
get
{
UID uid = new UIDClass();
uid.Value = "{97CD2883-37CB-4f76-BD0F-945279C783DC}";
return uid;
}
}
/// <summary>
/// An enumerator of private dataset names used by the extension.
/// Not used in this implementation.
/// </summary>
/// <param name="datasetType">The dataset type.</param>
/// <returns>An enumerator of strings.</returns>
public IEnumBSTR get_PrivateDatasetNames(esriDatasetType datasetType)
{
return null;
}
/// <summary>
/// An enumerator of data dictionary names used by the extension.
/// Not used in this implementation.
/// </summary>
public IEnumBSTR DataDictionaryTableNames
{
get { return null; }
}
/// <summary>
/// Indicates whether the extension owns a dataset type.
/// </summary>
/// <param name="datasetType">The type of dataset to check.</param>
/// <returns>False; this extension owns no dataset types.</returns>
public Boolean OwnsDatasetType(esriDatasetType datasetType)
{
return false;
}
/// <summary>
/// Returns a reference to the extension's workspace.
/// </summary>
public IWorkspace Workspace
{
get { return workspaceHelper.Workspace; }
}
#endregion
#region IWorkspaceReplicaSyncEvents Members
/// <summary>
/// Occurs in the replica geodatabase after data changes have been exported
/// from that replica geodatabase to a delta database.
/// Not used in this implementation.
/// </summary>
public void AfterExportingDataChanges(IReplica sourceReplica, object dataChangesSource, object deltaFile)
{
// Not used in this implementation.
}
/// <summary>
/// Occurs in the master geodatabase after data changes in either a replica
/// geodatabase or delta database are transferred to the master geodatabase.
/// </summary>
/// <param name="targetReplica">The target replica.</param>
/// <param name="dataChangesSource">A collection of changes made to the master geodatabase.</param>
/// <param name="oidMappingTable">Not used in this implementation.</param>
/// <param name="changesTable">Not used in this implemented.</param>
public void AfterSynchronizingDataChanges(IReplica targetReplica, object dataChangesSource, ITable oidMappingTable, ITable changesTable)
{
// Make sure that the correct replica is being synchronized.
String replicaName = targetReplica.Name;
String unqualifiedReplicaName = replicaName.Substring(replicaName.LastIndexOf('.') + 1);
if (!unqualifiedReplicaName.Equals(rasterReplicaName))
{
return;
}
// Get the rasters to pull if connected synchronization is occurring.
IDataChanges3 dataChanges3 = dataChangesSource as IDataChanges3;
if (dataChanges3 != null)
{
// Get the source's replicas.
IName sourceWorkspaceName = (IName)dataChanges3.ParentWorkspaceName;
IWorkspace sourceWorkspace = (IWorkspace)sourceWorkspaceName.Open();
IWorkspaceReplicas sourceWorkspaceReplicas = (IWorkspaceReplicas)sourceWorkspace;
// Get the replica generation numbers.
int genBegin = 0;
int genEnd = 0;
int targetGen = 0;
dataChanges3.GenerationNumbers(out genBegin, out genEnd, out targetGen);
IQueryFilter queryFilter = new QueryFilterClass();
queryFilter.WhereClause = String.Format("{0} > {1} or {0} is NULL", genFieldName, genBegin);
// Open a cursor to get the rasters to copy form the source.
IRasterWorkspaceEx sourceRasterWorkspaceEx = (IRasterWorkspaceEx)sourceWorkspace;
IRasterCatalog sourceRasterCatalog = sourceRasterWorkspaceEx.OpenRasterCatalog(rasterCatalogName);
IFeatureClass sourceFeatureClass = (IFeatureClass)sourceRasterCatalog;
int sourceGenFieldIndex = sourceFeatureClass.FindField(genFieldName);
IFeatureCursor sourceCursor = sourceFeatureClass.Search(queryFilter, true);
// Open the target raster catalog.
IRasterWorkspaceEx targetRasterWorkspaceEx = (IRasterWorkspaceEx)workspaceHelper.Workspace;
IRasterCatalog targetRasterCatalog = targetRasterWorkspaceEx.OpenRasterCatalog(rasterCatalogName);
IFeatureClass targetFeatureClass = (IFeatureClass)targetRasterCatalog;
int targetGenFieldIndex = targetFeatureClass.FindField(genFieldName);
IFeatureCursor targetCursor = targetFeatureClass.Insert(true);
// Copy the rasters from the source to the target.
IFeature sourceFeature = null;
while ((sourceFeature = sourceCursor.NextFeature()) != null)
{
// Copy the raster and set the target gen to -1 (received).
IFeatureBuffer featureBuffer = targetFeatureClass.CreateFeatureBuffer();
featureBuffer.set_Value(targetRasterCatalog.RasterFieldIndex, sourceFeature.get_Value(sourceRasterCatalog.RasterFieldIndex));
featureBuffer.set_Value(targetGenFieldIndex, -1);
targetCursor.InsertFeature(featureBuffer);
// Set the source row value to the current generation.
if (sourceFeature.get_Value(sourceGenFieldIndex) == DBNull.Value)
{
sourceFeature.set_Value(sourceGenFieldIndex, genEnd);
}
sourceFeature.Store();
}
Marshal.FinalReleaseComObject(sourceCursor);
Marshal.FinalReleaseComObject(targetCursor);
}
}
/// <summary>
/// Occurs in the replica geodatabase before data changes are exported from that replica geodatabase to a delta database.
/// Not used in this implementation.
/// </summary>
public void BeforeExportingDataChanges(IReplica sourceReplica, object dataChangesSource, object deltaFile)
{
// Not used in this implementation.
}
/// <summary>
/// Occurs in the master geodatabase before data changes in either a replica geodatabase or delta
/// database are transferred to the master geodatabase.
/// Not used in this implementation.
/// </summary>
public void BeforeSynchronizingDataChanges(IReplica targetReplica, object dataChangesSource)
{
// Not used in this implementation.
}
#endregion
}
}
[Visual Basic .NET]
RasterSyncWorkspaceExtension.vb
Imports System.Runtime.InteropServices
<Guid("A9FC5EB2-33F9-4941-AE69-775ECF688647"), _
ClassInterface(ClassInterfaceType.None), _
ProgId("RasterSyncExtensionVB.RasterSyncWorkspaceExtension")> _
Public Class RasterSyncWorkspaceExtension
Implements IWorkspaceExtensionControl
Implements IWorkspaceExtension2
Implements IWorkspaceReplicaSyncEvents
#Region "Private Variables"
''' <summary>
''' Provides a weak reference to the extension's workspace.
''' </summary>
Private workspaceHelper As IWorkspaceHelper = Nothing
''' <summary>
''' The name of the raster catalog to synchronize.
''' </summary>
Private Const rasterCatalogName As String = "ras_cat"
''' <summary>
''' The name of the replica that requires raster synchronization.
''' </summary>
Private Const rasterReplicaName As String = "myreplicaras"
''' <summary>
''' The name of the integer field in the raster catalogs that stores generation numbers.
''' </summary>
Private Const genFieldName As String = "gen"
#End Region
#Region "IWorkspaceExtensionControl Members"
''' <summary>
''' Initializes the workspace extension.
''' </summary>
''' <param name="workspaceHelper">Provides a weak reference to the workspace.</param>
Public Sub Init(ByVal workspaceHelper As IWorkspaceHelper) Implements IWorkspaceExtensionControl.Init
Me.workspaceHelper = workspaceHelper
End Sub
''' <summary>
''' Called to shutdown the extension.
''' </summary>
Public Sub Shutdown() Implements IWorkspaceExtensionControl.Shutdown
workspaceHelper = Nothing
End Sub
#End Region
#Region "IWorkspaceExtension[2] Members"
''' <summary>
''' The name of the extension.
''' </summary>
Public ReadOnly Property Name() As String _
Implements IWorkspaceExtension.Name, IWorkspaceExtension2.Name
Get
Return "RasterSyncWorkspaceExtension"
End Get
End Property
''' <summary>
''' The extension's GUID.
''' </summary>
Public ReadOnly Property GUID() As UID _
Implements IWorkspaceExtension.GUID, IWorkspaceExtension2.GUID
Get
Dim uid As UID = New UIDClass()
uid.Value = "{A9FC5EB2-33F9-4941-AE69-775ECF688647}"
Return uid
End Get
End Property
''' <summary>
''' An enumerator of private dataset names used by the extension.
''' Not used in this implementation.
''' </summary>
''' <param name="datasetType">The dataset type.</param>
''' <returns>An enumerator of strings.</returns>
Public ReadOnly Property PrivateDatasetNames(ByVal datasetType As esriDatasetType) As IEnumBSTR _
Implements IWorkspaceExtension.PrivateDatasetNames, IWorkspaceExtension2.PrivateDatasetNames
Get
Return Nothing
End Get
End Property
''' <summary>
''' An enumerator of data dictionary names used by the extension.
''' Not used in this implementation.
''' </summary>
Public ReadOnly Property DataDictionaryTableNames() As IEnumBSTR _
Implements IWorkspaceExtension.DataDictionaryTableNames, IWorkspaceExtension2.DataDictionaryTableNames
Get
Return Nothing
End Get
End Property
''' <summary>
''' Indicates whether the extension owns a dataset type.
''' </summary>
''' <param name="datasetType">The type of dataset to check.</param>
''' <returns>False; this extension owns no dataset types.</returns>
Public Function OwnsDatasetType(ByVal datasetType As esriDatasetType) As Boolean _
Implements IWorkspaceExtension2.OwnsDatasetType
Return False
End Function
''' <summary>
''' Returns a reference to the extension's workspace.
''' </summary>
Public ReadOnly Property Workspace() As IWorkspace _
Implements IWorkspaceExtension2.Workspace
Get
Return workspaceHelper.Workspace
End Get
End Property
#End Region
#Region "IWorkspaceReplicaSyncEvents Members"
''' <summary>
''' Occurs in the replica geodatabase after data changes have been exported
''' from that replica geodatabase to a delta database.
''' Not used in this implementation.
''' </summary>
Public Sub AfterExportingDataChanges(ByVal sourceReplica As IReplica, ByVal dataChangesSource As Object, ByVal deltaFile As Object) _
Implements IWorkspaceReplicaSyncEvents.AfterExportingDataChanges
' Not used in this implementation.
End Sub
''' <summary>
''' Occurs in the master geodatabase after data changes in either a replica
''' geodatabase or delta database are transferred to the master geodatabase.
''' </summary>
''' <param name="targetReplica">The target replica.</param>
''' <param name="dataChangesSource">A collection of changes made to the master geodatabase.</param>
''' <param name="oidMappingTable">Not used in this implementation.</param>
''' <param name="changesTable">Not used in this implemented.</param>
Public Sub AfterSynchronizingDataChanges(ByVal targetReplica As IReplica, ByVal dataChangesSource As Object, _
ByVal oidMappingTable As ITable, ByVal changesTable As ITable) _
Implements IWorkspaceReplicaSyncEvents.AfterSynchronizingDataChanges
' Make sure that the correct replica is being synchronized.
Dim replicaName As String = targetReplica.Name
Dim unqualifiedReplicaName As String = replicaName.Substring(replicaName.LastIndexOf(".") + 1)
If Not unqualifiedReplicaName.Equals(rasterReplicaName) Then
Return
End If
' Get the rasters to pull if connected synchronization is occurring.
Dim dataChanges3 As IDataChanges3 = TryCast(dataChangesSource, IDataChanges3)
If Not dataChanges3 Is Nothing Then
' Get the source's replicas.
Dim sourceWorkspaceName As IName = CType(dataChanges3.ParentWorkspaceName, IName)
Dim sourceWorkspace As IWorkspace = CType(sourceWorkspaceName.Open(), IWorkspace)
Dim sourceWorkspaceReplicas As IWorkspaceReplicas = CType(sourceWorkspace, IWorkspaceReplicas)
' Get the replica generation numbers.
Dim genBegin As Integer = 0
Dim genEnd As Integer = 0
Dim targetGen As Integer = 0
dataChanges3.GenerationNumbers(genBegin, genEnd, targetGen)
Dim queryFilter As IQueryFilter = New QueryFilterClass()
queryFilter.WhereClause = String.Format("{0} > {1} or {0} is NULL", genFieldName, genBegin)
' Open a cursor to get the rasters to copy form the source.
Dim sourceRasterWorkspaceEx As IRasterWorkspaceEx = CType(sourceWorkspace, IRasterWorkspaceEx)
Dim sourceRasterCatalog As IRasterCatalog = sourceRasterWorkspaceEx.OpenRasterCatalog(rasterCatalogName)
Dim sourceFeatureClass As IFeatureClass = CType(sourceRasterCatalog, IFeatureClass)
Dim sourceGenFieldIndex As Integer = sourceFeatureClass.FindField(genFieldName)
Dim sourceCursor As IFeatureCursor = sourceFeatureClass.Search(queryFilter, True)
' Open the target raster catalog.
Dim targetRasterWorkspaceEx As IRasterWorkspaceEx = CType(workspaceHelper.Workspace, IRasterWorkspaceEx)
Dim targetRasterCatalog As IRasterCatalog = targetRasterWorkspaceEx.OpenRasterCatalog(rasterCatalogName)
Dim targetFeatureClass As IFeatureClass = CType(targetRasterCatalog, IFeatureClass)
Dim targetGenFieldIndex As Integer = targetFeatureClass.FindField(genFieldName)
Dim targetCursor As IFeatureCursor = targetFeatureClass.Insert(True)
' Copy the rasters from the source to the target.
Dim sourceFeature As IFeature = sourceCursor.NextFeature()
While Not sourceFeature Is Nothing
' Copy the raster and set the target gen to -1 (received).
Dim featureBuffer As IFeatureBuffer = targetFeatureClass.CreateFeatureBuffer()
featureBuffer.Value(targetRasterCatalog.RasterFieldIndex) = sourceFeature.Value(sourceRasterCatalog.RasterFieldIndex)
featureBuffer.Value(targetGenFieldIndex) = -1
targetCursor.InsertFeature(featureBuffer)
' Set the source row value to the current generation.
If sourceFeature.Value(sourceGenFieldIndex).Equals(DBNull.Value) Then
sourceFeature.Value(sourceGenFieldIndex) = genEnd
End If
sourceFeature.Store()
sourceFeature = sourceCursor.NextFeature()
End While
Marshal.FinalReleaseComObject(sourceCursor)
Marshal.FinalReleaseComObject(targetCursor)
End If
End Sub
''' <summary>
''' Occurs in the replica geodatabase before data changes are exported from that replica geodatabase to a delta database.
''' Not used in this implementation.
''' </summary>
Public Sub BeforeExportingDataChanges(ByVal sourceReplica As IReplica, ByVal dataChangesSource As Object, ByVal deltaFile As Object) _
Implements IWorkspaceReplicaSyncEvents.BeforeExportingDataChanges
' Not used in this implementation.
End Sub
''' <summary>
''' Occurs in the master geodatabase before data changes in either a replica geodatabase or delta
''' database are transferred to the master geodatabase.
''' Not used in this implementation.
''' </summary>
Public Sub BeforeSynchronizingDataChanges(ByVal targetReplica As IReplica, ByVal dataChangesSource As Object) _
Implements IWorkspaceReplicaSyncEvents.BeforeSynchronizingDataChanges
' Not used in this implementation.
End Sub
#End Region
End Class