ID flessibili
Gli ID flessibili vengono utilizzati per identificare repliche, elementi o unità di modifica. Sync Framework supporta i tipi seguenti di ID flessibili:
ID a lunghezza fissa
Un ID di questo tipo ha sempre la stessa lunghezza ogni volta che viene utilizzato. La lunghezza è specificata nello schema del formato dell'ID.
ID a lunghezza variabile
Un ID di questo tipo ha una lunghezza che può variare ogni volta che viene utilizzato. La lunghezza massima è specificata nello schema del formato dell'ID.
Codice gestito Un ID viene rappresentato dalla classe SyncId. Questa classe contiene l'ID e un valore che indica se l'ID è a lunghezza variabile.
Codice non gestito Un ID viene rappresentato come una matrice di byte. Gli ID a lunghezza variabile sono rappresentati dalla struttura SYNC_ID. Questa struttura contiene la lunghezza dell'ID e l'ID rappresentato come una matrice di byte.
Schema dell'ID
I formati degli ID sono definiti in uno schema che specifica le informazioni seguenti su ogni ID del sistema:
Se l'ID è a lunghezza fissa o a lunghezza variabile.
Le dimensioni se l'ID è a lunghezza fissa o le dimensioni massime se l'ID è a lunghezza variabile.
Codice gestito Lo schema del formato dell'ID viene specificato tramite la classe SyncIdFormatGroup.
Codice non gestito Lo schema del formato dell'ID viene specificato tramite la struttura ID_PARAMETERS.
Questo schema deve essere fornito ai vari metodi di Sync Framework e viene utilizzato per garantire che tutti gli oggetti utilizzino le stesse informazioni sullo schema dell'ID.
In una sessione di sincronizzazione, in entrambi i provider viene eseguita una query per i relativi schemi. Gli schemi vengono quindi confrontati per verificare che entrambi i provider utilizzino lo stesso schema. Se questa verifica ha esito negativo, la sessione non verrà creata.
Codice gestito La sessione ottiene lo schema di un provider tramite la proprietà IdFormats.
Codice non gestito La sessione ottiene lo schema di un provider tramite il metodo ISyncProvider::GetIdParameters.
Nota
Il formato di un ID passato a un metodo di Sync Framework deve corrispondere al formato specificato nello schema del formato dell'ID, altrimenti il metodo avrà esito negativo.
Formato consigliato per gli ID globali
Per ogni elemento nell'ambito di sincronizzazione è necessario un ID globale che deve essere univoco in una community di sincronizzazione. Un ID globale è un ID flessibile e, di conseguenza, può utilizzare qualsiasi formato. Tuttavia, poiché i metadati possono rappresentare un gruppo ordinato di ID come intervallo singolo, i metadati sono più compatti quando gli ID vengono enumerati come gruppi ordinati. Inoltre l'utilizzo di intervalli rende più efficiente la manutenzione dei metadati. Di conseguenza, può essere utile adattare a livello logico l'ordine degli ID all'ordine appropriato per l'enumerazione. Per il formato di un ID globale, si consiglia di utilizzare un GUID a 16 byte con un prefisso a 8 byte, ad esempio la classe SyncGlobalId gestita o la struttura SYNC_GID non gestita.
Considerazioni speciali per dati gerarchici
In situazioni nelle quali gli elementi da sincronizzare dispongono di una gerarchia, può essere utile inserire nel prefisso dell'ID un numero a incremento progressivo costante, ad esempio un tempo di clock. Poiché in genere gli elementi padre vengono creati prima degli elementi figlio, gli elementi padre saranno visualizzati prima nell'ordine di enumerazione. In questo modo, viene ridotta la necessità di gestione da parte di un provider degli elementi che non si trovano nell'ordine in cui devono essere applicati.
Di seguito viene illustrato un approccio all'assegnazione di ID globali per i dati gerarchici:
Creare un contatore di dimensioni sufficienti per essere indicizzato in tutti gli elementi univoci della replica.
Iniziando dalla radice dell'ambito, privilegiare la profondità rispetto alla larghezza e attraversare il sistema.
Per ogni elemento (padre o figlio), generare un GUID.
Inserire il tempo dell'orologio a parete come prefisso del GUID.
Ai nuovi elementi creati è possibile assegnare ID globali tramite questo stesso metodo, indipendentemente dai contenitori o dai singoli elementi nidificati.
Gestione della memoria nel codice non gestito
Gli ID sono rappresentati come puntatori alle matrici di byte. Di conseguenza, per gli ID a lunghezza fissa, è sufficiente l'esecuzione del cast dell'ID utilizzato a un puntatore di byte. Per gli ID a lunghezza variabile, è necessario inserire le dimensioni del buffer come prefisso degli ID, come nella struttura SYNC_ID.
Nota
Sync Framework non conserva mai un riferimento a un ID allocato da un chiamante. Se Sync Framework deve mantenere un ID, allocherà la propria memoria per l'ID e lo copierà internamente. I chiamanti sono responsabili dell'allocazione e della liberazione di memoria associata agli ID.
ID come valori restituiti nel codice non gestito
I metodi di Sync Framework restituiscono ID a lunghezza variabile in un processo a due chiamate:
Il metodo viene chiamato per determinare le dimensioni dell'ID.
Il chiamante procede all'allocazione della memoria e chiama nuovamente la funzione, fornendo in questa occasione il buffer appena allocato e le relative dimensioni.
Un utente può ottimizzare questo processo allocando un buffer delle dimensioni corrette o delle dimensioni massime. In questo caso, la prima chiamata non è necessaria, anche se il chiamante deve sempre controllare il valore HRESULT restituito per assicurarsi che le dimensioni del buffer siano corrette.
I metodi che restituiscono ID a lunghezza fissa non utilizzano il processo a due passaggi. Al contrario, i metodi forniscono semplicemente un buffer della lunghezza corretta. Il parametro delle dimensioni è facoltativo quando si richiede un ID a lunghezza fissa (è possibile fornire un valore NULL). Se le dimensioni vengono passate, i metodi agiscono come per la lunghezza variabile. Se le dimensioni sono inferiori rispetto all'ID che deve essere restituito, pertanto, viene restituito un codice di errore che indica che sono disponibili più dati e la variabile delle dimensioni archivia le dimensioni richieste. Se le dimensioni sono superiori a quelle richieste, il metodo ha esito positivo e vengono restituite le dimensioni richieste.
Intervalli
È possibile fare riferimento ai blocchi di ID ordinati con il nome di un intervallo. Un intervallo utilizza l'ID inferiore e quello superiore come relativi limiti chiusi.
Codice gestito I limiti dell'intervallo vengono passati direttamente ai metodi che utilizzano gli intervalli.
Codice non gestito Un intervallo viene rappresentato tramite la struttura SYNC_RANGE.
Vedere anche
Riferimento
Struttura ID_PARAMETERS
Struttura ID_PARAMETER_PAIR
Struttura SYNC_ID
Struttura SYNC_RANGE
SyncIdFormatGroup
SyncIdFormat
SyncId