summaryrefslogtreecommitdiff
path: root/db/storage.h
blob: e1eea4cf287e8732beb3cd0eefa4f5d13f5c02fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/**
*    Copyright (C) 2008 10gen Inc.
*  
*    This program is free software: you can redistribute it and/or  modify
*    it under the terms of the GNU Affero General Public License, version 3,
*    as published by the Free Software Foundation.
*  
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU Affero General Public License for more details.
*  
*    You should have received a copy of the GNU Affero General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/* storage.h

   Storage subsystem management.
   Lays out our datafiles on disk, manages disk space.
*/

#pragma once

#pragma pack(push)
#pragma pack(1)

class Record;
class DeletedRecord;
class Extent;
class BtreeBucket;
class JSObj;
class PhysicalDataFile;

class DiskLoc {
	int fileNo; /* this will be volume, file #, etc. */
	int ofs;
public:
	enum { NullOfs = -1, MaxFiles=4000 };
	int a() const { return fileNo; }
	DiskLoc(int a, int b) : fileNo(a), ofs(b) { 
		assert(ofs!=0);
	}
	DiskLoc() { fileNo = -1; ofs = NullOfs; }

	DiskLoc(const DiskLoc& l) { fileNo=l.fileNo; ofs=l.ofs; }

	bool questionable() { 
	  return ofs < -1 ||
	    fileNo < -1 ||
	    fileNo > 20;
	}

	bool isNull() const { return ofs == NullOfs; }
	void Null() { fileNo = -1; ofs = NullOfs; }
	void setInvalid() { fileNo = -2; }
	void assertOk() { assert(!isNull()); }

	string toString() const {
		if( isNull() ) 
			return "null";
		stringstream ss;
		ss << hex << fileNo << ':' << ofs;
		return ss.str();
	}

	int& GETOFS() { return ofs; }
	int getOfs() const { return ofs; }
	void set(int a, int b) { fileNo=a; ofs=b; }
	void setOfs(int _fileNo, int _ofs) { 
		fileNo = _fileNo;
		ofs = _ofs;
	}

	void inc(int amt) {
		assert( !isNull() );
		ofs += amt;
	}

	bool sameFile(DiskLoc b) { return fileNo == b.fileNo; }

	bool operator==(const DiskLoc& b) const { return fileNo==b.fileNo && ofs == b.ofs; }
	bool operator!=(const DiskLoc& b) const { return !(*this==b); }
	const DiskLoc& operator=(const DiskLoc& b) { 
		fileNo=b.fileNo; ofs = b.ofs;
		assert(ofs!=0);
		return *this;
	}
	int compare(const DiskLoc& b) const { 
		int x = fileNo - b.fileNo;
		if( x ) 
			return x;
		if( ofs == b.ofs ) return 0;
		return ofs < b.ofs ? -1 : 1;
	}
	bool operator<(const DiskLoc& b) const { 
		if( fileNo == b.fileNo )
			return ofs < b.ofs;
		return fileNo < b.fileNo;
	}

	/* get the "thing" associated with this disk location.
	   it is assumed the object is what it is -- you must asure that: 
	   think of this as an unchecked type cast.
    */
	JSObj obj() const;
	Record* rec() const;
	DeletedRecord* drec() const;
	Extent* ext() const;
	BtreeBucket* btree() const;

	PhysicalDataFile& pdf() const;
};

#pragma pack(pop)