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
|