/// <summary> /// Rename a collection (do not support transactions) /// </summary> public async Task <bool> RenameCollectionAsync(string collection, string newName) { if (collection.IsNullOrWhiteSpace()) { throw new ArgumentNullException(nameof(collection)); } if (newName.IsNullOrWhiteSpace()) { throw new ArgumentNullException(nameof(newName)); } // rename collection is possible only in exclusive transaction for this if (_transaction != null) { throw LiteException.AlreadyExistsTransaction(); } // check for collection name if (collection.Equals(newName, StringComparison.OrdinalIgnoreCase)) { throw LiteException.InvalidCollectionName(newName, "New name must be different from current name"); } // checks if newName are compatible CollectionService.CheckName(newName, _header); return(await this.AutoTransaction(async transaction => { var currentSnapshot = await transaction.CreateSnapshot(LockMode.Write, collection, false); var newSnapshot = await transaction.CreateSnapshot(LockMode.Write, newName, false); if (currentSnapshot.CollectionPage == null) { return false; } // checks if do not already exists this collection name if (_header.GetCollectionPageID(newName) != uint.MaxValue) { throw LiteException.AlreadyExistsCollectionName(newName); } // rename collection and set page as dirty (there is no need to set IsDirty in HeaderPage) transaction.Pages.Commit += (h) => { h.RenameCollection(collection, newName); }; return true; })); }
public Snapshot(LockMode mode, string collectionName, HeaderPage header, uint transactionID, TransactionPages transPages, LockService locker, WalIndexService walIndex, DiskReader reader, bool addIfNotExists) { _mode = mode; _collectionName = collectionName; _header = header; _transactionID = transactionID; _transPages = transPages; _locker = locker; _walIndex = walIndex; _reader = reader; // enter in lock mode according initial mode if (mode == LockMode.Read) { _locker.EnterRead(_collectionName); } else { _locker.EnterReserved(_collectionName); } // get lastest read version from wal-index _readVersion = _walIndex.CurrentReadVersion; var srv = new CollectionService(_header, this, _transPages); // read collection (create if new - load virtual too) srv.Get(_collectionName, addIfNotExists, ref _collectionPage); // clear local pages (will clear _collectionPage link reference) if (_collectionPage != null) { // local pages contains only data/index pages _localPages.Remove(_collectionPage.PageID); } }