~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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/* Copyright (C) 2008 PrimeBase Technologies GmbH, Germany
 *
 * PrimeBase XT
 *
 * 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
 *
 * Paul McCullagh
 *
 * 2007-07-18
 *
 * H&G2JCtL
 *
 * PBXT System tables.
 *
 */

/*

DROP TABLE IF EXISTS pbms_repository;
CREATE TABLE pbms_repository (
	Repository_id     INT COMMENT 'The reppository file number',
	Repo_blob_offset  BIGINT COMMENT 'The offset of the BLOB in the repository file',
	Blob_size         BIGINT COMMENT 'The size of the BLOB in bytes',
	Head_size         SMALLINT UNSIGNED COMMENT 'The size of the BLOB header - preceeds the BLOB data',
	Access_code       INT COMMENT 'The 4-byte authorisation code required to access the BLOB - part of the BLOB URL',
	Creation_time     TIMESTAMP COMMENT 'The time the BLOB was created',
	Last_ref_time     TIMESTAMP COMMENT 'The last time the BLOB was referenced',
	Last_access_time  TIMESTAMP COMMENT 'The last time the BLOB was accessed (read)',
	Content_type      CHAR(128) COMMENT 'The content type of the BLOB - returned by HTTP GET calls',
	Blob_data         LONGBLOB COMMENT 'The data of this BLOB'
) ENGINE=PBMS;

	PRIMARY KEY (Repository_id, Repo_blob_offset)

DROP TABLE IF EXISTS pbms_reference;
CREATE TABLE pbms_reference (
	Table_name        CHAR(64) COMMENT 'The name of the referencing table',
	Blob_id           BIGINT COMMENT 'The BLOB reference number - part of the BLOB URL',
	Column_name       CHAR(64) COMMENT 'The column name of the referencing field',
	Row_condition     VARCHAR(255) COMMENT 'This condition identifies the row in the table',
	Blob_url          VARCHAR(200) COMMENT 'The BLOB URL for HTTP GET access',
	Repository_id     INT COMMENT 'The repository file number of the BLOB',
	Repo_blob_offset  BIGINT COMMENT 'The offset in the repository file',
	Blob_size         BIGINT COMMENT 'The size of the BLOB in bytes',
	Deletion_time     TIMESTAMP COMMENT 'The time the BLOB was deleted',
	Remove_in         INT COMMENT 'The number of seconds before the reference/BLOB is removed perminently',
	Temp_log_id       INT COMMENT 'Temporary log number of the referencing deletion entry',
	Temp_log_offset   BIGINT COMMENT 'Temporary log offset of the referencing deletion entry'
) ENGINE=PBMS;

	PRIMARY KEY (Table_name, Blob_id, Column_name, Condition)
*/

#ifndef __SYSTAB_XT_H__
#define __SYSTAB_XT_H__

#include "ccutils_xt.h"
#include "discover_xt.h"
#include "thread_xt.h"

struct XTSystemTableShare;
struct XTDatabase;

class XTOpenSystemTable : public XTObject {
public:
	XTSystemTableShare		*ost_share;
	TABLE					*ost_my_table;
	struct XTDatabase		*ost_db;

	XTOpenSystemTable(XTThreadPtr self, struct XTDatabase *db, XTSystemTableShare *share, TABLE *table);
	virtual ~XTOpenSystemTable();

	virtual bool use() { return true; }
	virtual bool unuse() { return true; }
	virtual bool seqScanInit() { return true; }
	virtual bool seqScanNext(char *XT_UNUSED(buf), bool *eof) {
		*eof = true;
		return false;
	}
	virtual int	getRefLen() { return 4; }
	virtual xtWord4 seqScanPos(xtWord1 *XT_UNUSED(buf)) {
		return 0;
	}
	virtual bool seqScanRead(xtWord4 XT_UNUSED(rec_id), char *XT_UNUSED(buf)) {
		return true;
	}

private:
};

class XTLocationTable : public XTOpenSystemTable {
	u_int	lt_index;

public:
	XTLocationTable(XTThreadPtr self, struct XTDatabase *db, XTSystemTableShare *share, TABLE *table);
	virtual ~XTLocationTable();

	virtual bool use();
	virtual bool unuse();
	virtual bool seqScanInit();
	virtual bool seqScanNext(char *buf, bool *eof);
	virtual void loadRow(char *buf, xtWord4 row_id);
	virtual xtWord4 seqScanPos(xtWord1 *buf);
	virtual bool seqScanRead(xtWord4 rec_id, char *buf);
};

class XTStatisticsTable : public XTOpenSystemTable {
	u_int				tt_index;
	XTStatisticsRec		tt_statistics;

public:
	XTStatisticsTable(XTThreadPtr self, struct XTDatabase *db, XTSystemTableShare *share, TABLE *table);
	virtual ~XTStatisticsTable();

	virtual bool use();
	virtual bool unuse();
	virtual bool seqScanInit();
	virtual bool seqScanNext(char *buf, bool *eof);
	virtual void loadRow(char *buf, xtWord4 row_id);
	virtual xtWord4 seqScanPos(xtWord1 *buf);
	virtual bool seqScanRead(xtWord4 rec_id, char *buf);
};

typedef struct XTSystemTableShare {
	u_int						sts_id;
	const char					*sts_path;
	THR_LOCK					*sts_my_lock;
	DT_FIELD_INFO				*sts_info;
	DT_KEY_INFO					*sts_keys;
	xtBool						sts_exists;

	static void					startUp(XTThreadPtr self);
	static void					shutDown(XTThreadPtr self);
	
	static bool					isSystemTable(const char *table_path);
	static void					setSystemTableDeleted(const char *table_path);
	static bool					doesSystemTableExist();
	static void					createSystemTables(XTThreadPtr self, struct XTDatabase *db);
	static XTOpenSystemTable	*openSystemTable(XTThreadPtr self, const char *table_path, TABLE *table);
	static void					releaseSystemTable(XTOpenSystemTable *tab);
} XTSystemTableShareRec, *XTSystemTableSharePtr;

#endif