Esempio n. 1
0
        public StoreResult UpdateDocument(ITransaction transaction, string collection, long rowId, JSONDocument update)
        {
            PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;
            StorageResult <byte[]>        storageResult = _storageManager.UpdateDocument(pmTransaction,
                                                                                         _metadataIndices[collection].GetFileId(rowId), collection, rowId, SerializeDocument(update));

            if (storageResult.Status != StoreResult.Success)
            {
                return(storageResult.Status);
            }

            lock (_metadataIndices)
            {
                _metadataIndices[collection].Add(rowId, storageResult.FileId);
            }
            MetaDataIndexOperation operation = new MetaDataIndexOperation()
            {
                ActualDocumentSize = update.Size, FileId = storageResult.FileId, OperationType = OperationType.Update, RowId = _metadataIndices[collection].GetRowId(new DocumentKey(update.Key))
            };

            (pmTransaction.MetadataTransaction as MetaDataIndexTransaction).AddOperation(new DocumentKey(update.Key), operation);
            StoreResult metadataResult = _metadataIndices[collection].StoreKeyMetadata(pmTransaction.MetadataTransaction.InnerObject as ITransaction, update, rowId);

            if (metadataResult != StoreResult.Success) //undo data operation
            {
                //_storageManager.DeleteDocument(pmTransaction.DataTransaction, storageResult.FileId, _collectionName, rowId);
                return(metadataResult);
            }
            return(StoreResult.Success);
        }
Esempio n. 2
0
        public override StorageResult <byte[]> UpdateDocument(ITransaction transaction, long fileId, string collection, long key, byte[] update)
        {
            lock (_oneOppLock)
            {
                PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;

                if (!_collectionMetadataDictionary.ContainsKey(collection))
                {
                    throw new ArgumentException("Specified collection '" + collection + "' does not exist.");
                }

                string dbId = GetFullDbId(fileId);
                FileMetadata <long, byte[]> fileMetadata = _fileMetadataDictionary[dbId];
                if (fileMetadata == null)
                {
                    throw new Exception("unable to find database file.");
                }

                FileTransaction fileTransaction = pmTransaction.DataTransaction as FileTransaction;
                if (!fileTransaction.IsTransactionBegin(dbId))
                {
                    fileTransaction.Begin(dbId, fileMetadata.Provider.BeginTransaction(null, false));
                }

                StorageResult <byte[]> result = fileMetadata.Provider.UpdateDocument(fileTransaction.GetTransaction(dbId), collection, key,
                                                                                     update);

                result.FileId = fileId;
                DisplaySize();
                return(result);
            }
        }
        public override StorageResult <byte[]> UpdateDocument(ITransaction transaction, long fileId, string collection, long key, byte[] update)
        {
            lock (_oneOppLock)
            {
                PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;

                if (!_collectionMetadataDictionary.ContainsKey(collection))
                {
                    throw new ArgumentException("Specified collection '" + collection + "' does not exist.");
                }

                string dbId = GetFullDbId(fileId);
                FileMetadata <long, byte[]> fileMetadata = _fileMetadataDictionary[dbId];

                if (fileMetadata == null)
                {
                    throw new Exception("Unable to find database file.");
                }

                if (pmTransaction != null)
                {
                    FileTransaction fileTransaction = pmTransaction.DataTransaction;
                    if (!fileTransaction.IsTransactionBegin(dbId))
                    {
                        fileTransaction.Begin(dbId, fileMetadata.Provider.BeginTransaction(null, false));
                    }

                    StorageResult <byte[]> result = fileMetadata.Provider.UpdateDocument(fileTransaction.GetTransaction(dbId), collection, key,
                                                                                         update);

                    if (result.Status == StoreResult.FailureDatabaseFull)
                    {
                        StorageResult <byte[]> deleteResult = DeleteDocument(transaction, fileId, collection, key);
                        if (deleteResult.Status == StoreResult.Failure)
                        {
                            throw new Exception("Error deleting document from store. key = " + key);
                        }

                        //todo: this decrement is not a proper fix as increments are on one level and decrements are on another level.
                        //if (_statsCollector != null)
                        //{
                        //    _statsCollector.DecrementStatsValue(StatisticsType.DocumentCount);
                        //}

                        StorageResult <byte[]> insertResult = StoreDocument(transaction, collection, key, update);
                        result.Status = insertResult.Status;
                        result.FileId = insertResult.FileId;

                        DisplaySize();
                        return(result);
                    }

                    result.FileId = fileId;
                    DisplaySize();
                    return(result);
                }
            }
            return(null);
        }
Esempio n. 4
0
        public void Rollback(ITransaction transaction)
        {
            PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;

            _storageManager.RollbackMetadataTransaction(pmTransaction.MetadataTransaction);
            RollbackMetaDataIndex(pmTransaction.MetadataTransaction);
            _storageManager.Rollback(pmTransaction.DataTransaction);
        }
Esempio n. 5
0
        public ITransaction BeginTransaction(ITransaction parentTransaction, bool isReadOnly)
        {
            PersistenceManagerTransaction pmTransaction = new PersistenceManagerTransaction();

            pmTransaction.DataTransaction = _storageManager.BeginTransaction(parentTransaction, isReadOnly);
            if (!isReadOnly)
            {
                pmTransaction.MetadataTransaction = new MetaDataIndexTransaction(_storageManager.BeginMetadataTransaction(isReadOnly));
            }
            return(pmTransaction);
        }
        public override StorageResult <byte[]> StoreDocument(ITransaction transaction, string collection, long key, byte[] value)
        {
            lock (_oneOppLock)
            {
                PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;

                if (!_collectionMetadataDictionary.ContainsKey(collection))
                {
                    throw new ArgumentException("Specified collection '" + collection + "' does not exist.");
                }

                if (pmTransaction != null)
                {
                    KeyMetadata keyMetadata = new KeyMetadata(key, GenerateFileId(pmTransaction.MetadataTransaction));
                    string      dbId        = GetFullDbId(keyMetadata.FileId);
                    FileMetadata <long, byte[]> fileMetadata = _fileMetadataDictionary[dbId];

                    if (fileMetadata == null)
                    {
                        throw new Exception("unable to find database file.");
                    }

                    if (!pmTransaction.DataTransaction.IsTransactionBegin(dbId))
                    {
                        pmTransaction.DataTransaction.Begin(dbId, fileMetadata.Provider.BeginTransaction(null, false));
                    }

                    StorageResult <byte[]> result = fileMetadata.Provider.StoreDocument(pmTransaction.DataTransaction.GetTransaction(dbId), collection, keyMetadata.RowId,
                                                                                        value);

                    result.FileId = keyMetadata.FileId;

                    if (result.Status == StoreResult.FailureDatabaseFull)
                    {
                        StorageResult <byte[]> insertResult = StoreDocument(transaction, collection, key, value);
                        result.Status = insertResult.Status;
                        result.FileId = insertResult.FileId;
                    }

                    DisplaySize();
                    return(result);
                }
            }
            return(null);
        }
Esempio n. 7
0
        public StoreResult RemoveDocument(ITransaction transaction, string collection, long rowId, JSONDocument document, IOperationContext context)
        {
            PersistenceManagerTransaction pmTransaction = transaction as PersistenceManagerTransaction;
            StorageResult <byte[]>        storageResult = _storageManager.DeleteDocument(pmTransaction, _metadataIndices[collection].GetFileId(rowId), collection, rowId);

            if (storageResult.Status != StoreResult.Success && storageResult.Status != StoreResult.SuccessDelete && storageResult.Status != StoreResult.SuccessKeyDoesNotExist)
            {
                return(storageResult.Status);
            }
            MetaDataIndexOperation operation = new MetaDataIndexOperation()
            {
                ActualDocumentSize = document.Size, FileId = storageResult.FileId, OperationType = OperationType.Remove, RowId = rowId
            };

            (pmTransaction.MetadataTransaction as MetaDataIndexTransaction).AddOperation(new DocumentKey(document.Key), operation);
            StoreResult metadataResult = _metadataIndices[collection].RemovekeyMetadata(pmTransaction.MetadataTransaction.InnerObject as ITransaction, document, rowId, context);

            if (metadataResult != StoreResult.Success) //undo data operation
            {
                _storageManager.StoreDocument(pmTransaction, collection, rowId, SerializeDocument(document));
                return(metadataResult);
            }
            return(StoreResult.SuccessDelete);
        }