~drizzle-trunk/drizzle/development

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
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* Copyright (C) 2008 PrimeBase Technologies GmbH, Germany
 *
 * PrimeBase Media Stream for MySQL
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 *
 * Original author: Paul McCullagh
 * Continued development: Barry Leslie
 *
 * 2007-06-26
 *
 * H&G2JCtL
 *
 * Contains the information about a table.
 *
 */

#ifndef __TABLE_MS_H__
#define __TABLE_MS_H__

#include "defs_ms.h"

#define MS_TABLE_FILE_MAGIC			0x1234ABCD
#define MS_TABLE_FILE_VERSION		1
#define MS_TABLE_FILE_HEAD_SIZE		128

class MSOpenTable;
class MSDatabase;
class CSHTTPOutputStream;

typedef struct MSTableHead {
	CSDiskValue4			th_magic_4;							/* Table magic number. */
	CSDiskValue2			th_version_2;						/* The header version. */
	CSDiskValue2			th_head_size_2;						/* The size of the header. */
	CSDiskValue8			th_free_list_8;

	/* These 3 fields are written together by prepareToDelete()! */
	CSDiskValue4			th_del_time_4;						/* The time this table was deleted. */
	CSDiskValue4			th_temp_log_id_4;					/* The temp log entry for this deleted table. */
	CSDiskValue4			th_temp_log_offset_4;

	CSDiskValue4			th_reserved_4;
} MSTableHeadRec, *MSTableHeadPtr;

/* File offset = th_size_4 + (Blob ID - 1) * sizeof(MSTableBlobRec) */ 
typedef struct MSTableBlob {
	CSDiskValue1			tb_status_1;						/* 0 = free, 1 = inuse*/

	/* These 3 fields are written together: */
	CSDiskValue3			tb_repo_id_3;						/* File ID (non-zero). */
	CSDiskValue6			tb_offset_6;						/* Offset into the file of the BLOB. */
	CSDiskValue2			tb_header_size_2;					/* Size of the header section of the blob. */

	CSDiskValue6			tb_size_6;							/* Size of the BLOB data. (Where ever it may be stored.) */ 
	CSDiskValue4			tb_auth_code_4;						/* BLOB authorisation code. */
} MSTableBlobRec, *MSTableBlobPtr;

typedef struct MSTableFreeBlob {
	CSDiskValue4			tf_null_4;							/* Set to zero */
	CSDiskValue6			tf_next_6;							/* Next record in the free list. */
} MSTableFreeBlobRec, *MSTableFreeBlobPtr;

class MSTable : public CSSharedRefObject {
public:
	CSString	*myTableName;
	uint32_t		myTableID;
	MSDatabase	*myDatabase;

	MSTable();
	virtual ~MSTable();

	CSPath *getTableFile(const char *table_name, bool to_delete);

	CSPath *getTableFile();

	CSFile *openTableFile();
	
	void prepareToDelete();

	uint64_t createBlobHandle(MSOpenTable *otab, uint32_t repo_id, uint64_t file_offset, uint64_t size, uint16_t head_size, uint32_t auth_code);

	uint64_t findBlobHandle(MSOpenTable *otab, uint32_t repo_id, uint64_t file_offset, uint64_t size, uint16_t head_size, uint32_t auth_code);

	void setBlobHandle(MSOpenTable *otab, uint64_t blob_id, uint32_t repo_id, uint64_t file_offset, uint64_t size, uint16_t head_size, uint32_t auth_code);

	void updateBlobHandle(MSOpenTable *otab, uint64_t blob_id, uint32_t repo_id, uint64_t offset, uint16_t head_size);

	bool readBlobHandle(MSOpenTable *otab, uint64_t blob_id, uint32_t *auth_code, uint32_t *repo_id, uint64_t *offset, uint64_t *data_size, uint16_t *head_size, bool throw_error);

	void freeBlobHandle(MSOpenTable *otab, uint64_t blob_id, uint32_t repo_id, uint64_t file_offset, uint32_t auth_code);

	/* Make this object hashable: */
	virtual CSObject *getKey();
	virtual int compareKey(CSObject *);
	virtual uint32_t hashKey();

	off64_t getTableFileSize() { return iTableFileSize; }
	CSString *getTableName();
	bool isToDelete() { return iToDelete; }
	void getDeleteInfo(uint32_t *log, uint32_t *offs, time_t *tim);
	bool isNoTable() { return myTableName->length() == 0; }

private:
	off64_t		iTableFileSize;
	size_t		iTableHeadSize;
	off64_t		iFreeList;
	bool		iToDelete;
	uint32_t		iTabDeleteTime;
	uint32_t		iTabTempLogID;
	uint32_t		iTabTempLogOffset;

public:
	static MSTable *newTable(uint32_t tab_id, CSString *name, MSDatabase *db, off64_t file_size, bool to_delete);

	static MSTable *newTable(uint32_t tab_id, const char *name, MSDatabase *db, off64_t file_size, bool to_delete);	
};

#endif