1#ifndef JOURNAL_H
2#define JOURNAL_H
3/* Journal - emulation for the B+Tree torture test
4**
5** Initial version by Axel D��rfler, axeld@pinc-software.de
6** This file may be used under the terms of the MIT License.
7*/
8
9
10#include <stdio.h>
11
12#include "Volume.h"
13#include "Debug.h"
14#include "Utility.h"
15
16#include "cache.h"
17
18
19class TransactionListener
20	: public DoublyLinkedListLinkImpl<TransactionListener> {
21public:
22								TransactionListener()
23								{
24								}
25
26	virtual						~TransactionListener()
27								{
28								}
29
30	virtual void				TransactionDone(bool success) = 0;
31	virtual void				RemovedFromTransaction() = 0;
32};
33
34typedef DoublyLinkedList<TransactionListener> TransactionListeners;
35
36
37class Transaction {
38	public:
39		Transaction(Volume *volume, off_t refBlock)
40			:
41			fVolume(volume),
42			fID(volume->GenerateTransactionID())
43		{
44		}
45
46		~Transaction()
47		{
48		}
49
50		int32 ID() const
51		{
52			return fID;
53		}
54
55		Volume* GetVolume()
56		{
57			return fVolume;
58		}
59
60		status_t WriteBlocks(off_t blockNumber, const uint8* buffer,
61			size_t numBlocks = 1)
62		{
63			return cached_write(fVolume->Device(), blockNumber, buffer,
64				numBlocks);
65		}
66
67
68		status_t Start(Volume* volume, off_t refBlock)
69		{
70			return B_OK;
71		}
72
73
74		status_t Done()
75		{
76			NotifyListeners(true);
77			return B_OK;
78		}
79
80		void
81		AddListener(TransactionListener* listener)
82		{
83			fListeners.Add(listener);
84		}
85
86		void
87		RemoveListener(TransactionListener* listener)
88		{
89			fListeners.Remove(listener);
90			listener->RemovedFromTransaction();
91		}
92
93		void
94		NotifyListeners(bool success)
95		{
96			while (TransactionListener* listener = fListeners.RemoveHead()) {
97				listener->TransactionDone(success);
98				listener->RemovedFromTransaction();
99			}
100		}
101
102	protected:
103		Volume*	fVolume;
104		int32	fID;
105		TransactionListeners	fListeners;
106};
107
108
109#endif	/* JOURNAL_H */
110