xref: /illumos-gate/usr/src/cmd/idmap/idmapd/schema.h (revision 48258c6b)
1cd37da74Snw /*
2cd37da74Snw  * CDDL HEADER START
3cd37da74Snw  *
4cd37da74Snw  * The contents of this file are subject to the terms of the
5cd37da74Snw  * Common Development and Distribution License (the "License").
6cd37da74Snw  * You may not use this file except in compliance with the License.
7cd37da74Snw  *
8cd37da74Snw  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9cd37da74Snw  * or http://www.opensolaris.org/os/licensing.
10cd37da74Snw  * See the License for the specific language governing permissions
11cd37da74Snw  * and limitations under the License.
12cd37da74Snw  *
13cd37da74Snw  * When distributing Covered Code, include this CDDL HEADER in each
14cd37da74Snw  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15cd37da74Snw  * If applicable, add the following below this CDDL HEADER, with the
16cd37da74Snw  * fields enclosed by brackets "[]" replaced with your own identifying
17cd37da74Snw  * information: Portions Copyright [yyyy] [name of copyright owner]
18cd37da74Snw  *
19cd37da74Snw  * CDDL HEADER END
20cd37da74Snw  */
21cd37da74Snw /*
22*48258c6bSjp  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
23cd37da74Snw  * Use is subject to license terms.
24cd37da74Snw  */
25cd37da74Snw 
26cd37da74Snw #ifndef _SCHEMA_H
27cd37da74Snw #define	_SCHEMA_H
28cd37da74Snw 
29cd37da74Snw #pragma ident	"%Z%%M%	%I%	%E% SMI"
30cd37da74Snw 
31cd37da74Snw #ifdef __cplusplus
32cd37da74Snw extern "C" {
33cd37da74Snw #endif
34cd37da74Snw 
35cd37da74Snw /*
36cd37da74Snw  * Various macros (constant strings) containing:
37cd37da74Snw  *
38cd37da74Snw  *  - CREATE TABLE/INDEX/TRIGGER/VIEW SQL
39cd37da74Snw  *  - old versions of schema items that have changed
40cd37da74Snw  *  - SQL to detect the version currently installed in a db
41cd37da74Snw  *  - SQL to upgrade the schema from any older version to the current
42cd37da74Snw  *     - the SQL to install the current version of the schema on a
43cd37da74Snw  *       freshly created db is the SQL used to "upgrade" from "version 0"
44cd37da74Snw  *
45cd37da74Snw  * There is one set of such macros for the cache DB (CACHE_*) and
46cd37da74Snw  * another set for the persistent DB (DB_*).  The macros ending in _SQL
47cd37da74Snw  * are used in arguments to init_db_instance().
48cd37da74Snw  *
49cd37da74Snw  * Schema version detection SQL has the following form:
50cd37da74Snw  *
51cd37da74Snw  * SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE
52cd37da74Snw  * (CASE (SELECT count(*) FROM sqlite_master WHERE sql = <original schema> ...)
53cd37da74Snw  * WHEN <correct count> THEN 1 ELSE (CASE (<v2 schema>) WHEN ... THEN 2
54cd37da74Snw  * ELSE -1 END) END AS version;
55cd37da74Snw  *
56cd37da74Snw  * That is, check that there is no schema else that the current schema
57cd37da74Snw  * sql matches the original schema, else the next version, ... and
58cd37da74Snw  * return an integer identifying the schema.  Version numbers returned:
59cd37da74Snw  *
60cd37da74Snw  * -1 -> unknown schema  (shouldn't happen)
61cd37da74Snw  *  0 -> no schema       (brand new DB, install latest schema)
62cd37da74Snw  *  1 -> original schema (if != latest, then upgrade)
63cd37da74Snw  *  . -> ...             (if != latest, then upgrade)
64cd37da74Snw  *  n -> latest schema   (nothing to do)
65cd37da74Snw  *
66cd37da74Snw  * Upgrade SQL for the cache DB is simple: drop everything, create
67cd37da74Snw  * latest schema.  This means losing ephemeral mappings, so idmapd must
68cd37da74Snw  * tell the kernel about that in its registration call.
69cd37da74Snw  *
70cd37da74Snw  * Upgrade SQL for the persistent DB is simple: drop the indexes, create
71cd37da74Snw  * temporary tables with the latest schema, insert into those from the
72cd37da74Snw  * old tables (transforming the data in the process), then drop the old
73cd37da74Snw  * tables, create the latest schema, restore the data from the temp.
74cd37da74Snw  * tables and drop the temp tables.
75cd37da74Snw  *
76cd37da74Snw  * Complex, but it avoids all sorts of packaging install/upgrade
77cd37da74Snw  * complexity, requiring reboots on patch.
78cd37da74Snw  *
79cd37da74Snw  * Conventions:
80cd37da74Snw  * - each TABLE/INDEX gets its own macro, and the SQL therein must not
81cd37da74Snw  *   end in a semi-colon (';)
82cd37da74Snw  * - macros are named * TABLE_* for tables, INDEX_* for indexes,
83cd37da74Snw  *   *_VERSION_SQL for SQL for determining version number,
84cd37da74Snw  *   *_UPGRADE_FROM_v<version>_SQL for SQL for upgrading from some
85cd37da74Snw  *   schema, *_LATEST_SQL for SQL for installing the latest schema.
86cd37da74Snw  * - some macros nest expansions of other macros
87cd37da74Snw  *
88cd37da74Snw  * The latest schema has two columns for Windows user/group name in
89cd37da74Snw  * tables where there used to be one.  One of those columns contains the
90cd37da74Snw  * name as it came from the user or from AD, the other is set via a
91cd37da74Snw  * TRIGGER to be the lower-case version of the first, and we always
92cd37da74Snw  * search (and index) by the latter.  This is for case-insensitivity.
93cd37da74Snw  */
94cd37da74Snw #define	TABLE_IDMAP_CACHE_v1 \
95cd37da74Snw 	"CREATE TABLE idmap_cache (" \
96cd37da74Snw 	"	sidprefix TEXT," \
97cd37da74Snw 	"	rid INTEGER," \
98cd37da74Snw 	"	windomain TEXT," \
99cd37da74Snw 	"	winname TEXT," \
100cd37da74Snw 	"	pid INTEGER," \
101cd37da74Snw 	"	unixname TEXT," \
102cd37da74Snw 	"	is_user INTEGER," \
103cd37da74Snw 	"	w2u INTEGER," \
104cd37da74Snw 	"	u2w INTEGER," \
105cd37da74Snw 	"	expiration INTEGER" \
106cd37da74Snw 	")"
107cd37da74Snw 
108*48258c6bSjp #define	TABLE_IDMAP_CACHE_v2 \
109*48258c6bSjp 	"CREATE TABLE idmap_cache " \
110*48258c6bSjp 	"(" \
111*48258c6bSjp 	"	sidprefix TEXT," \
112*48258c6bSjp 	"	rid INTEGER," \
113*48258c6bSjp 	"	windomain TEXT," \
114*48258c6bSjp 	"	canon_winname TEXT," \
115*48258c6bSjp 	"	winname TEXT," \
116*48258c6bSjp 	"	pid INTEGER," \
117*48258c6bSjp 	"	unixname TEXT," \
118*48258c6bSjp 	"	is_user INTEGER," \
119*48258c6bSjp 	"	is_wuser INTEGER," \
120*48258c6bSjp 	"	w2u INTEGER," \
121*48258c6bSjp 	"	u2w INTEGER," \
122*48258c6bSjp 	"	expiration INTEGER" \
123*48258c6bSjp 	")"
124*48258c6bSjp 
125cd37da74Snw #define	TABLE_IDMAP_CACHE \
126cd37da74Snw 	"CREATE TABLE idmap_cache " \
127cd37da74Snw 	"(" \
128cd37da74Snw 	"	sidprefix TEXT," \
129cd37da74Snw 	"	rid INTEGER," \
130cd37da74Snw 	"	windomain TEXT," \
131cd37da74Snw 	"	canon_winname TEXT," \
132cd37da74Snw 	"	winname TEXT," \
133cd37da74Snw 	"	pid INTEGER," \
134cd37da74Snw 	"	unixname TEXT," \
135cd37da74Snw 	"	is_user INTEGER," \
136cd37da74Snw 	"	is_wuser INTEGER," \
137cd37da74Snw 	"	w2u INTEGER," \
138cd37da74Snw 	"	u2w INTEGER," \
139*48258c6bSjp 	"	map_type INTEGER," \
140*48258c6bSjp 	"	map_dn TEXT, "\
141*48258c6bSjp 	"	map_attr TEXT, "\
142*48258c6bSjp 	"	map_value TEXT, "\
143*48258c6bSjp 	"	map_windomain TEXT, "\
144*48258c6bSjp 	"	map_winname TEXT, "\
145*48258c6bSjp 	"	map_unixname TEXT, "\
146*48258c6bSjp 	"	map_is_nt4 INTEGER, "\
147cd37da74Snw 	"	expiration INTEGER" \
148cd37da74Snw 	")"
149cd37da74Snw 
150cd37da74Snw #define	INDEX_IDMAP_CACHE_SID_W2U_v1 \
151cd37da74Snw 	"CREATE UNIQUE INDEX idmap_cache_sid_w2u ON idmap_cache" \
152cd37da74Snw 	"		(sidprefix, rid, w2u)"
153cd37da74Snw 
154cd37da74Snw #define	INDEX_IDMAP_CACHE_SID_W2U \
155cd37da74Snw 	"CREATE UNIQUE INDEX idmap_cache_sid_w2u ON idmap_cache" \
156cd37da74Snw 	"		(sidprefix, rid, is_user, w2u)"
157cd37da74Snw 
158cd37da74Snw #define	INDEX_IDMAP_CACHE_PID_U2W \
159cd37da74Snw 	"CREATE UNIQUE INDEX idmap_cache_pid_u2w ON idmap_cache" \
160cd37da74Snw 	"		(pid, is_user, u2w)"
161cd37da74Snw 
162cd37da74Snw #define	TRIGGER_IDMAP_CACHE_TOLOWER_INSERT \
163cd37da74Snw 	"CREATE TRIGGER idmap_cache_tolower_name_insert " \
164cd37da74Snw 	"AFTER INSERT ON idmap_cache " \
165cd37da74Snw 	"BEGIN " \
166cd37da74Snw 	"	UPDATE idmap_cache SET winname = lower_utf8(canon_winname)" \
167cd37da74Snw 	"		WHERE rowid = new.rowid;" \
168cd37da74Snw 	"END"
169cd37da74Snw 
170cd37da74Snw #define	TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE \
171cd37da74Snw 	"CREATE TRIGGER idmap_cache_tolower_name_update " \
172cd37da74Snw 	"AFTER UPDATE ON idmap_cache " \
173cd37da74Snw 	"BEGIN " \
174cd37da74Snw 	"	UPDATE idmap_cache SET winname = lower_utf8(canon_winname)" \
175cd37da74Snw 	"		WHERE rowid = new.rowid;" \
176cd37da74Snw 	"END"
177cd37da74Snw 
178cd37da74Snw #define	TABLE_NAME_CACHE \
179cd37da74Snw 	"CREATE TABLE name_cache (" \
180cd37da74Snw 	"	sidprefix TEXT," \
181cd37da74Snw 	"	rid INTEGER," \
182cd37da74Snw 	"	name TEXT," \
183cd37da74Snw 	"	canon_name TEXT," \
184cd37da74Snw 	"	domain TEXT," \
185cd37da74Snw 	"	type INTEGER," \
186cd37da74Snw 	"	expiration INTEGER" \
187cd37da74Snw 	")"
188cd37da74Snw 
189cd37da74Snw #define	TABLE_NAME_CACHE_v1 \
190cd37da74Snw 	"CREATE TABLE name_cache (" \
191cd37da74Snw 	"	sidprefix TEXT," \
192cd37da74Snw 	"	rid INTEGER," \
193cd37da74Snw 	"	name TEXT," \
194cd37da74Snw 	"	domain TEXT," \
195cd37da74Snw 	"	type INTEGER," \
196cd37da74Snw 	"	expiration INTEGER" \
197cd37da74Snw 	")"
198cd37da74Snw 
199cd37da74Snw #define	TRIGGER_NAME_CACHE_TOLOWER_INSERT \
200cd37da74Snw 	"CREATE TRIGGER name_cache_tolower_name_insert " \
201cd37da74Snw 	"AFTER INSERT ON name_cache " \
202cd37da74Snw 	"BEGIN " \
203cd37da74Snw 	"	UPDATE name_cache SET name = lower_utf8(canon_name)" \
204cd37da74Snw 	"		WHERE rowid = new.rowid;" \
205cd37da74Snw 	"END"
206cd37da74Snw 
207cd37da74Snw #define	TRIGGER_NAME_CACHE_TOLOWER_UPDATE \
208cd37da74Snw 	"CREATE TRIGGER name_cache_tolower_name_update " \
209cd37da74Snw 	"AFTER UPDATE ON name_cache " \
210cd37da74Snw 	"BEGIN " \
211cd37da74Snw 	"	UPDATE name_cache SET name = lower_utf8(canon_name)" \
212cd37da74Snw 	"		WHERE rowid = new.rowid;" \
213cd37da74Snw 	"END"
214cd37da74Snw 
215cd37da74Snw #define	INDEX_NAME_CACHE_SID \
216cd37da74Snw 	"CREATE UNIQUE INDEX name_cache_sid ON name_cache" \
217cd37da74Snw 	"		(sidprefix, rid)"
218cd37da74Snw 
219cd37da74Snw #define	INDEX_NAME_CACHE_NAME \
220cd37da74Snw 	"CREATE UNIQUE INDEX name_cache_name ON name_cache" \
221cd37da74Snw 	"		(name, domain)"
222cd37da74Snw 
223cd37da74Snw #define	CACHE_INSTALL_SQL \
224cd37da74Snw 	TABLE_IDMAP_CACHE ";" \
225cd37da74Snw 	INDEX_IDMAP_CACHE_SID_W2U ";" \
226cd37da74Snw 	INDEX_IDMAP_CACHE_PID_U2W ";" \
227cd37da74Snw 	TRIGGER_IDMAP_CACHE_TOLOWER_INSERT ";" \
228cd37da74Snw 	TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE ";" \
229cd37da74Snw 	TABLE_NAME_CACHE ";" \
230cd37da74Snw 	INDEX_NAME_CACHE_SID ";" \
231cd37da74Snw 	INDEX_NAME_CACHE_NAME ";" \
232cd37da74Snw 	TRIGGER_NAME_CACHE_TOLOWER_INSERT ";" \
233cd37da74Snw 	TRIGGER_NAME_CACHE_TOLOWER_UPDATE ";"
234cd37da74Snw 
235cd37da74Snw #define	CACHE_VERSION_SQL \
236cd37da74Snw 	"SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE " \
237cd37da74Snw 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
238cd37da74Snw 	"sql = '" TABLE_IDMAP_CACHE_v1 "' OR " \
239cd37da74Snw 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U_v1 "' OR " \
240cd37da74Snw 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
241cd37da74Snw 	"sql = '" TABLE_NAME_CACHE_v1 "' OR " \
242cd37da74Snw 	"sql = '" INDEX_NAME_CACHE_SID "') " \
243cd37da74Snw 	"WHEN 5 THEN 1 ELSE " \
244cd37da74Snw 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
245*48258c6bSjp 	"sql = '" TABLE_IDMAP_CACHE_v2"' OR " \
246*48258c6bSjp 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U "' OR " \
247*48258c6bSjp 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
248*48258c6bSjp 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_INSERT "' OR " \
249*48258c6bSjp 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE "' OR " \
250*48258c6bSjp 	"sql = '" TABLE_NAME_CACHE "' OR " \
251*48258c6bSjp 	"sql = '" INDEX_NAME_CACHE_SID "' OR " \
252*48258c6bSjp 	"sql = '" INDEX_NAME_CACHE_NAME "' OR " \
253*48258c6bSjp 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_INSERT "' OR " \
254*48258c6bSjp 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_UPDATE "') " \
255*48258c6bSjp 	"WHEN 10 THEN 2 ELSE " \
256*48258c6bSjp 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
257cd37da74Snw 	"sql = '" TABLE_IDMAP_CACHE"' OR " \
258cd37da74Snw 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U "' OR " \
259cd37da74Snw 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
260cd37da74Snw 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_INSERT "' OR " \
261cd37da74Snw 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE "' OR " \
262cd37da74Snw 	"sql = '" TABLE_NAME_CACHE "' OR " \
263cd37da74Snw 	"sql = '" INDEX_NAME_CACHE_SID "' OR " \
264cd37da74Snw 	"sql = '" INDEX_NAME_CACHE_NAME "' OR " \
265cd37da74Snw 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_INSERT "' OR " \
266cd37da74Snw 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_UPDATE "') " \
267*48258c6bSjp 	"WHEN 10 THEN 3 ELSE -1 END) END) END) END AS version;"
268cd37da74Snw 
269cd37da74Snw #define	CACHE_UPGRADE_FROM_v1_SQL \
270cd37da74Snw 	"DROP TABLE idmap_cache;" \
271cd37da74Snw 	"DROP TABLE name_cache;" \
272cd37da74Snw 	CACHE_INSTALL_SQL
273cd37da74Snw 
274*48258c6bSjp #define	CACHE_UPGRADE_FROM_v2_SQL \
275*48258c6bSjp 	"DROP TABLE idmap_cache;" \
276*48258c6bSjp 	"DROP TABLE name_cache;" \
277*48258c6bSjp 	CACHE_INSTALL_SQL
278*48258c6bSjp 
279*48258c6bSjp #define	CACHE_VERSION	3
280cd37da74Snw 
281cd37da74Snw 
282cd37da74Snw #define	TABLE_NAMERULES_v1 \
283cd37da74Snw 	"CREATE TABLE namerules (" \
284cd37da74Snw 	"	is_user INTEGER NOT NULL," \
285cd37da74Snw 	"	windomain TEXT," \
286cd37da74Snw 	"	winname TEXT NOT NULL," \
287cd37da74Snw 	"	is_nt4 INTEGER NOT NULL," \
288cd37da74Snw 	"	unixname NOT NULL," \
289cd37da74Snw 	"	w2u_order INTEGER," \
290cd37da74Snw 	"	u2w_order INTEGER" \
291cd37da74Snw 	")"
292cd37da74Snw 
293cd37da74Snw #define	TABLE_NAMERULES_BODY \
294cd37da74Snw 	"(" \
295cd37da74Snw 	"	is_user INTEGER NOT NULL," \
296cd37da74Snw 	"	is_wuser INTEGER NOT NULL," \
297cd37da74Snw 	"	windomain TEXT," \
298cd37da74Snw 	"	winname_display TEXT NOT NULL," \
299cd37da74Snw 	"	winname TEXT," \
300cd37da74Snw 	"	is_nt4 INTEGER NOT NULL," \
301cd37da74Snw 	"	unixname NOT NULL," \
302cd37da74Snw 	"	w2u_order INTEGER," \
303cd37da74Snw 	"	u2w_order INTEGER" \
304cd37da74Snw 	")"
305cd37da74Snw 
306cd37da74Snw #define	TABLE_NAMERULES \
307cd37da74Snw 	"CREATE TABLE namerules " \
308cd37da74Snw 	TABLE_NAMERULES_BODY
309cd37da74Snw 
310cd37da74Snw #define	INDEX_NAMERULES_W2U_v1 \
311cd37da74Snw 	"CREATE UNIQUE INDEX namerules_w2u ON namerules" \
312cd37da74Snw 	"		(winname, windomain, is_user, w2u_order)"
313cd37da74Snw 
314cd37da74Snw #define	INDEX_NAMERULES_W2U \
315cd37da74Snw 	"CREATE UNIQUE INDEX namerules_w2u ON namerules" \
316cd37da74Snw 	"		(winname, windomain, is_user, is_wuser, w2u_order)"
317cd37da74Snw 
318cd37da74Snw #define	INDEX_NAMERULES_U2W \
319cd37da74Snw 	"CREATE UNIQUE INDEX namerules_u2w ON namerules" \
320cd37da74Snw 	"		(unixname, is_user, u2w_order)"
321cd37da74Snw 
322cd37da74Snw #define	TRIGGER_NAMERULES_TOLOWER_BODY \
323cd37da74Snw 	"BEGIN " \
324cd37da74Snw 	"	UPDATE namerules SET winname = lower_utf8(winname_display)" \
325cd37da74Snw 	"		WHERE rowid = new.rowid;" \
326cd37da74Snw 	"END"
327cd37da74Snw 
328cd37da74Snw #define	TRIGGER_NAMERULES_TOLOWER_INSERT \
329cd37da74Snw 	"CREATE TRIGGER namerules_tolower_name_insert " \
330cd37da74Snw 	"AFTER INSERT ON namerules " \
331cd37da74Snw 	TRIGGER_NAMERULES_TOLOWER_BODY
332cd37da74Snw 
333cd37da74Snw #define	TRIGGER_NAMERULES_TOLOWER_UPDATE \
334cd37da74Snw 	"CREATE TRIGGER namerules_tolower_name_update " \
335cd37da74Snw 	"AFTER UPDATE ON namerules " \
336cd37da74Snw 	TRIGGER_NAMERULES_TOLOWER_BODY
337cd37da74Snw 
338cd37da74Snw #define	TRIGGER_NAMERULES_UNIQUE_BODY \
339cd37da74Snw 	"	SELECT CASE (SELECT count(*) FROM namerules AS n" \
340cd37da74Snw 	"		WHERE n.unixname = NEW.unixname AND" \
341cd37da74Snw 	"		n.is_user = NEW.is_user AND" \
342cd37da74Snw 	"		(n.winname != lower(NEW.winname_display) OR" \
343cd37da74Snw 	"		n.windomain != NEW.windomain ) AND" \
344cd37da74Snw 	"		n.u2w_order = NEW.u2w_order AND" \
345cd37da74Snw 	"		n.is_wuser != NEW.is_wuser) > 0" \
346cd37da74Snw 	"	WHEN 1 THEN" \
347cd37da74Snw 	"		raise(ROLLBACK, 'Conflicting w2u namerules')"\
348cd37da74Snw 	"	END; " \
349cd37da74Snw 	"END"
350cd37da74Snw 
351cd37da74Snw #define	TRIGGER_NAMERULES_UNIQUE_INSERT \
352cd37da74Snw 	"CREATE TRIGGER namerules_unique_insert " \
353cd37da74Snw 	"BEFORE INSERT ON namerules " \
354cd37da74Snw 	"BEGIN " \
355cd37da74Snw 	TRIGGER_NAMERULES_UNIQUE_BODY
356cd37da74Snw 
357cd37da74Snw #define	TRIGGER_NAMERULES_UNIQUE_UPDATE \
358cd37da74Snw 	"CREATE TRIGGER namerules_unique_update " \
359cd37da74Snw 	"BEFORE INSERT ON namerules " \
360cd37da74Snw 	"BEGIN " \
361cd37da74Snw 	TRIGGER_NAMERULES_UNIQUE_BODY
362cd37da74Snw 
363cd37da74Snw #define	DB_INSTALL_SQL \
364cd37da74Snw 	TABLE_NAMERULES ";" \
365cd37da74Snw 	INDEX_NAMERULES_W2U ";" \
366cd37da74Snw 	INDEX_NAMERULES_U2W ";" \
367cd37da74Snw 	TRIGGER_NAMERULES_TOLOWER_INSERT ";" \
368cd37da74Snw 	TRIGGER_NAMERULES_TOLOWER_UPDATE ";" \
369cd37da74Snw 	TRIGGER_NAMERULES_UNIQUE_INSERT ";" \
370cd37da74Snw 	TRIGGER_NAMERULES_UNIQUE_UPDATE ";"
371cd37da74Snw 
372cd37da74Snw #define	DB_VERSION_SQL \
373cd37da74Snw 	"SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE " \
374cd37da74Snw 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
375cd37da74Snw 	"sql = '" TABLE_NAMERULES_v1 "' OR " \
376cd37da74Snw 	"sql = '" INDEX_NAMERULES_W2U_v1 "' OR " \
377cd37da74Snw 	"sql = '" INDEX_NAMERULES_U2W "') " \
378cd37da74Snw 	"WHEN 3 THEN 1 ELSE "\
379cd37da74Snw 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
380cd37da74Snw 	"sql = '" TABLE_NAMERULES "' OR " \
381cd37da74Snw 	"sql = '" INDEX_NAMERULES_W2U "' OR " \
382cd37da74Snw 	"sql = '" INDEX_NAMERULES_U2W "' OR " \
383cd37da74Snw 	"sql = '" TRIGGER_NAMERULES_TOLOWER_INSERT "' OR " \
384cd37da74Snw 	"sql = '" TRIGGER_NAMERULES_TOLOWER_UPDATE "' OR " \
385cd37da74Snw 	"sql = \"" TRIGGER_NAMERULES_UNIQUE_INSERT "\" OR " \
386cd37da74Snw 	"sql = \"" TRIGGER_NAMERULES_UNIQUE_UPDATE "\") " \
387cd37da74Snw 	"WHEN 7 THEN 2 ELSE -1 END) END) END AS version;"
388cd37da74Snw 
389cd37da74Snw /* SQL for upgrading an existing name rules DB.  Includes DB_INSTALL_SQL */
390cd37da74Snw #define	DB_UPGRADE_FROM_v1_SQL \
391cd37da74Snw 	"CREATE TABLE namerules_new " TABLE_NAMERULES_BODY ";" \
392cd37da74Snw 	"INSERT INTO namerules_new SELECT is_user, is_user, windomain, " \
393cd37da74Snw 	"winname, winname, is_nt4, unixname, w2u_order, u2w_order " \
394cd37da74Snw 	"FROM namerules;" \
395cd37da74Snw 	"DROP TABLE namerules;" \
396cd37da74Snw 	DB_INSTALL_SQL \
397cd37da74Snw 	"INSERT INTO namerules SELECT * FROM namerules_new;" \
398cd37da74Snw 	"DROP TABLE namerules_new;"
399cd37da74Snw 
400cd37da74Snw #define	DB_VERSION	2
401cd37da74Snw 
402cd37da74Snw #ifdef __cplusplus
403cd37da74Snw }
404cd37da74Snw #endif
405cd37da74Snw 
406cd37da74Snw 
407cd37da74Snw #endif	/* _SCHEMA_H */
408