//----------------------------------------------------------------------- // // Copyright (c) Microsoft Corporation. // //----------------------------------------------------------------------- namespace Microsoft.Isam.Esent.Interop { using System; using System.Globalization; /// /// A class that encapsulates an update on a JET_TABLEID. /// public class Update : EsentResource { /// /// The underlying JET_SESID. /// private readonly JET_SESID sesid; /// /// The underlying JET_TABLEID. /// private readonly JET_TABLEID tableid; /// /// The type of update. /// private readonly JET_prep prep; /// /// Initializes a new instance of the Update class. This automatically /// begins an update. The update will be cancelled if /// not explicitly saved. /// /// The session to start the transaction for. /// The tableid to prepare the update for. /// The type of update. public Update(JET_SESID sesid, JET_TABLEID tableid, JET_prep prep) { if (JET_prep.Cancel == prep) { throw new ArgumentException("Cannot create an Update for JET_prep.Cancel", "prep"); } this.sesid = sesid; this.tableid = tableid; this.prep = prep; Api.JetPrepareUpdate(this.sesid, this.tableid, this.prep); this.ResourceWasAllocated(); } /// /// Returns a that represents the current . /// /// /// A that represents the current . /// public override string ToString() { return string.Format(CultureInfo.InvariantCulture, "Update ({0})", this.prep); } /// /// Update the tableid. /// /// Returns the bookmark of the updated record. This can be null. /// The size of the bookmark buffer. /// Returns the actual size of the bookmark. /// /// Save is the final step in performing an insert or an update. The update is begun by /// calling creating an Update object and then by calling JetSetColumn or JetSetColumns one or more times /// to set the record state. Finally, Update is called to complete the update operation. /// Indexes are updated only by Update or and not during JetSetColumn or JetSetColumns. /// public void Save(byte[] bookmark, int bookmarkSize, out int actualBookmarkSize) { this.CheckObjectIsNotDisposed(); if (!this.HasResource) { throw new InvalidOperationException("Not in an update"); } Api.JetUpdate(this.sesid, this.tableid, bookmark, bookmarkSize, out actualBookmarkSize); this.ResourceWasReleased(); } /// /// Update the tableid. /// /// /// Save is the final step in performing an insert or an update. The update is begun by /// calling creating an Update object and then by calling JetSetColumn or JetSetColumns one or more times /// to set the record state. Finally, Update is called to complete the update operation. /// Indexes are updated only by Update or and not during JetSetColumn or JetSetColumns. /// public void Save() { int ignored; this.Save(null, 0, out ignored); } /// /// Update the tableid and position the tableid on the record that was modified. /// This can be useful when inserting a record because by default the tableid /// remains in its old location. /// /// /// Save is the final step in performing an insert or an update. The update is begun by /// calling creating an Update object and then by calling JetSetColumn or JetSetColumns one or more times /// to set the record state. Finally, Update is called to complete the update operation. /// Indexes are updated only by Update or and not during JetSetColumn or JetSetColumns. /// public void SaveAndGotoBookmark() { byte[] bookmark = null; try { bookmark = Caches.BookmarkCache.Allocate(); int actualBookmarkSize; this.Save(bookmark, bookmark.Length, out actualBookmarkSize); Api.JetGotoBookmark(this.sesid, this.tableid, bookmark, actualBookmarkSize); } finally { if (bookmark != null) { Caches.BookmarkCache.Free(ref bookmark); } } } /// /// Cancel the update. /// public void Cancel() { this.CheckObjectIsNotDisposed(); if (!this.HasResource) { throw new InvalidOperationException("Not in an update"); } Api.JetPrepareUpdate(this.sesid, this.tableid, JET_prep.Cancel); this.ResourceWasReleased(); } /// /// Called when the transaction is being disposed while active. /// This should rollback the transaction. /// protected override void ReleaseResource() { this.Cancel(); } } }