Partager via


Lecture d’enregistrements de données à partir d’un flux CLFS

Il existe deux types d’enregistrements dans un flux CLFS (Common Log File System) : les enregistrements de données et les enregistrements de redémarrage. Cette rubrique explique comment lire une séquence d’enregistrements de données à partir d’un flux. Pour plus d’informations sur la lecture des enregistrements de redémarrage, consultez Lecture des enregistrements de redémarrage à partir d’un flux CLFS.

Il existe plusieurs variantes lors de la lecture d’une séquence d’enregistrements de données à partir d’un flux. Vous pouvez lire dans le flux à partir d’un enregistrement spécifié ou vous pouvez lire vers l’arrière le long d’une chaîne d’enregistrements liés.

Pour toutes les variantes de lecture d’une séquence d’enregistrements de données, effectuez les étapes suivantes.

  1. Appelez ClfsReadLogRecord pour obtenir un contexte de lecture et le premier enregistrement de données de la séquence.

  2. Transmettez le contexte de lecture obtenu à l’étape 1 à ClfsReadNextLogRecord à plusieurs reprises pour obtenir les enregistrements de données restants dans la séquence.

Attention Les contextes de lecture ne sont pas thread-safe. Les clients sont responsables de la sérialisation de l’accès aux contextes de lecture.

Les sous-rubriques suivantes décrivent les détails de la lecture des différents types de séquences d’enregistrements et de chaînes.

Lecture à partir d’un enregistrement de données spécifié

Pour lire dans un flux CLSF (en commençant à l’enregistrement de données de votre choix), vous devez créer un contexte de lecture dont le mode est défini sur ClfsContextForward. Pour créer un contexte de lecture et lire le premier enregistrement (dans le jeu que vous avez choisi de lire), appelez ClfsReadLogRecord comme indiqué dans le tableau suivant.

Nom du paramètre Valeur

pvMarshalContext

Fournissez un pointeur vers une zone de marshaling.

plsnFirst

Indiquez le numéro LSN du premier enregistrement que vous souhaitez lire. Il doit s’agir du numéro LSN d’un enregistrement de données, et non d’un enregistrement de redémarrage.

peContextMode

Indiquez la valeur ClfsContextForward.

ppvReadBuffer

Recevez vos données d’enregistrement.

pcbReadBuffer

Recevez la taille de vos données d’enregistrement.

peRecordType

Recevez le type d’enregistrement. Cette valeur est un ensemble d’indicateurs qui indiquent différentes fonctionnalités de l’enregistrement. L’enregistrement étant un enregistrement de données, la valeur que vous recevez doit avoir l’indicateur ClfsDataRecord défini et l’indicateur ClfsRestartRecord clear.

plsnUndoNext

Recevez le numéro LSN undo-next de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne. Vous pouvez donc l’ignorer.

plsnPrevious

Recevez le numéro LSN précédent de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne. Vous pouvez donc l’ignorer.

ppvReadContext

Recevoir un pointeur vers un contexte de lecture opaque. Utilisez le contexte de lecture pour lire les enregistrements suivants.

Une fois que vous avez obtenu le contexte de lecture et le premier enregistrement, vous pouvez obtenir les enregistrements suivants dans le flux en appelant ClfsReadNextLogRecord à plusieurs reprises. Lorsqu’il n’y a plus d’enregistrements de données dans le flux, ClfsReadNextLogRecord retourne STATUS_END_OF_FILE. Le tableau suivant montre comment définir et interpréter les paramètres.

Nom du paramètre Valeur

pvReadContext

Fournissez un pointeur vers le contexte de lecture que vous avez reçu de ClfsReadLogRecord.

ppvBuffer

Recevez vos données d’enregistrement.

pcbBuffer

Recevez la taille de vos données d’enregistrement.

peRecordType

Indiquez la valeur de ClfsDataRecord.

plsnUndoNext

Recevez le champ undo-next LSN de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne. Vous pouvez donc l’ignorer.

plsnPrevious

Recevez le champ LSN précédent de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne. Vous pouvez donc l’ignorer.

plsnRecord

Recevez le numéro LSN de l’enregistrement de données qui a été lu.

Lecture d’une chaîne d’enregistrements de données liés par le LSN précédent

Lorsque vous écrivez un enregistrement de données dans un flux CLFS, vous pouvez définir le numéro LSN précédent de l’enregistrement de données sur le numéro LSN de n’importe quel enregistrement que vous avez précédemment écrit dans le flux. En définissant le numéro LSN précédent, vous pouvez créer une chaîne d’enregistrements associés qui peuvent ensuite être parcourus dans l’ordre inverse. Par exemple, supposons que vous effectuez une transaction de base de données et que vous devez écrire plusieurs enregistrements de journal CLFS pour décrire les mises à jour effectuées par la transaction. Chaque fois que vous écrivez un enregistrement de journal décrivant une mise à jour de transaction, vous pouvez définir le LSN précédent de l’enregistrement sur le LSN de l’enregistrement précédent qui décrit une mise à jour effectuée par la même transaction.

Supposons que vous ayez écrit une chaîne d’enregistrements de données liés par leurs LSN précédents. Pour lire la chaîne d’enregistrements, vous devez créer un contexte de lecture dont le mode est défini sur ClfsContextPrevious. Pour créer un contexte de lecture et lire le premier enregistrement de la chaîne, appelez ClfsReadLogRecord comme indiqué dans le tableau suivant.

Nom du paramètre Valeur

pvMarshalContext

Fournissez un pointeur vers une zone de marshaling.

plsnFirst

Fournissez le numéro LSN du premier enregistrement de la chaîne. Il doit s’agir du numéro LSN d’un enregistrement de données, et non d’un enregistrement de redémarrage.

peContextMode

Indiquez la valeur de ClfsContextPrevious.

ppvReadBuffer

Recevez vos données d’enregistrement.

pcbReadBuffer

Recevez la taille de vos données d’enregistrement.

peRecordType

Recevez le type d’enregistrement. Cette valeur est un ensemble d’indicateurs qui indiquent différentes fonctionnalités de l’enregistrement. L’enregistrement étant un enregistrement de données, la valeur que vous recevez doit avoir l’indicateur ClfsDataRecord défini et l’indicateur ClfsRestartRecord clear.

plsnUndoNext

Recevez le LSN undo-next de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne, vous pouvez donc l’ignorer.

plsnPrevious

Recevez le LSN précédent de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne, vous pouvez donc l’ignorer.

ppvReadContext

Recevez un pointeur vers un contexte de lecture opaque. Utilisez le contexte de lecture pour lire les enregistrements précédents dans la chaîne.

Une fois que vous avez le contexte de lecture et le premier enregistrement, vous pouvez lire les enregistrements restants dans la chaîne en appelant ClfsReadNextLogRecord à plusieurs reprises. Le tableau suivant montre comment définir et interpréter les paramètres.

Nom du paramètre Valeur

pvReadContext

Fournissez un pointeur vers le contexte de lecture que vous avez reçu de ClfsReadLogRecord.

ppvBuffer

Recevez vos données d’enregistrement.

pcbBuffer

Recevez la taille de vos données d’enregistrement.

peRecordType

Fournissez la valeur de ClfsDataRecord.

plsnUndoNext

Recevez le LSN undo-next de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne, vous pouvez donc l’ignorer.

plsnPrevious

Recevez le LSN précédent de l’enregistrement de données. Vous n’avez pas besoin de cette valeur pour continuer à lire la chaîne, vous pouvez donc l’ignorer.

plsnRecord

Recevez le LSN de l’enregistrement de données qui a été lu.

Lorsque vous effectuez des appels répétés à ClfsReadNextLogRecord, votre séquence d’appels se termine de l’une des manières suivantes.

  • Finalement, vous lirez un enregistrement de données dont le LSN précédent est défini sur CLFS_LSN_INVALID. La prochaine fois que vous appelez ClfsReadNextLogRecord, il retourne STATUS_END_OF_FILE.

  • Finalement, vous allez lire un enregistrement de données qui a un LSN précédent inférieur à la fois au LSN de base du flux et à la queue d’archive du flux. La prochaine fois que vous appelez ClfsReadNextLogRecord, il retourne STATUS_LOG_START_OF_LOG.

Lecture d’une chaîne d’enregistrements de données liés par le LSN undo-next

Lorsque vous écrivez un enregistrement de données dans un flux CLFS, vous pouvez définir le LSN undo-next de l’enregistrement de données sur le LSN de n’importe quel enregistrement que vous avez précédemment écrit dans le flux. En définissant le LSN undo-next, vous pouvez créer une chaîne d’enregistrements associés qui peuvent être parcourus dans l’ordre inverse. Pour plus d’informations sur la création et l’interprétation des chaînes undo-next, consultez Numéros de séquence de journal CLFS.

Supposons que vous ayez écrit une chaîne d’enregistrements de données qui sont liés par leur LSN undo-next. Pour lire la chaîne d’enregistrements, vous devez appeler ClfsReadLogRecord pour créer un contexte de lecture dont le mode est défini sur ClfsContextUndoNext. Après cela, le processus est identique à la lecture d’une chaîne liée par les réseaux LSN précédents (décrit précédemment dans cette rubrique).

Lecture d’une chaîne d’enregistrements de données liés par le LSN de l’utilisateur

En plus des chaînes liées par les LSN précédents et les LSN undo-next, vous pouvez créer des chaînes liées par vos propres LSN que vous incorporez dans vos données d’enregistrement.

Supposons que vous avez écrit une chaîne d’enregistrements de données qui sont liés par des LSN que vous avez stockés dans les données d’enregistrement proprement dites. Pour lire la chaîne d’enregistrements, vous devez créer un contexte de lecture dont le mode est défini sur ClfsContextPrevious ou ClfsContextUndoNext. Créez votre contexte de lecture et obtenez le dernier enregistrement écrit dans la chaîne en appelant ClfsReadLogRecord. Appelez ensuite ClfsReadNextLogRecord à plusieurs reprises pour obtenir les enregistrements précédents dans la chaîne. Chaque fois que vous appelez ClfsReadNextLogRecord, définissez le paramètre plsnUser sur le LSN de l’enregistrement précédent dans votre chaîne. Le LSN que vous fournissez dans plsnUser remplace toutes les valeurs stockées dans les champs LSN précédent ou undo-next de l’enregistrement actif.

Notez que vous pouvez uniquement reculer dans le flux lorsque vous appelez ClfsReadNextLogRecord pour lire une chaîne d’enregistrements. Le LSN que vous fournissez dans plsnUser doit être inférieur au LSN de l’enregistrement actif dans la chaîne.