xref: /onnv-gate/usr/src/cmd/idmap/idmapd/schema.h (revision 6386:46b4028ff648)
15696Snw141292 /*
25696Snw141292  * CDDL HEADER START
35696Snw141292  *
45696Snw141292  * The contents of this file are subject to the terms of the
55696Snw141292  * Common Development and Distribution License (the "License").
65696Snw141292  * You may not use this file except in compliance with the License.
75696Snw141292  *
85696Snw141292  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
95696Snw141292  * or http://www.opensolaris.org/os/licensing.
105696Snw141292  * See the License for the specific language governing permissions
115696Snw141292  * and limitations under the License.
125696Snw141292  *
135696Snw141292  * When distributing Covered Code, include this CDDL HEADER in each
145696Snw141292  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
155696Snw141292  * If applicable, add the following below this CDDL HEADER, with the
165696Snw141292  * fields enclosed by brackets "[]" replaced with your own identifying
175696Snw141292  * information: Portions Copyright [yyyy] [name of copyright owner]
185696Snw141292  *
195696Snw141292  * CDDL HEADER END
205696Snw141292  */
215696Snw141292 /*
22*6386Sjp151216  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
235696Snw141292  * Use is subject to license terms.
245696Snw141292  */
255696Snw141292 
265696Snw141292 #ifndef _SCHEMA_H
275696Snw141292 #define	_SCHEMA_H
285696Snw141292 
295696Snw141292 #pragma ident	"%Z%%M%	%I%	%E% SMI"
305696Snw141292 
315696Snw141292 #ifdef __cplusplus
325696Snw141292 extern "C" {
335696Snw141292 #endif
345696Snw141292 
355696Snw141292 /*
365696Snw141292  * Various macros (constant strings) containing:
375696Snw141292  *
385696Snw141292  *  - CREATE TABLE/INDEX/TRIGGER/VIEW SQL
395696Snw141292  *  - old versions of schema items that have changed
405696Snw141292  *  - SQL to detect the version currently installed in a db
415696Snw141292  *  - SQL to upgrade the schema from any older version to the current
425696Snw141292  *     - the SQL to install the current version of the schema on a
435696Snw141292  *       freshly created db is the SQL used to "upgrade" from "version 0"
445696Snw141292  *
455696Snw141292  * There is one set of such macros for the cache DB (CACHE_*) and
465696Snw141292  * another set for the persistent DB (DB_*).  The macros ending in _SQL
475696Snw141292  * are used in arguments to init_db_instance().
485696Snw141292  *
495696Snw141292  * Schema version detection SQL has the following form:
505696Snw141292  *
515696Snw141292  * SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE
525696Snw141292  * (CASE (SELECT count(*) FROM sqlite_master WHERE sql = <original schema> ...)
535696Snw141292  * WHEN <correct count> THEN 1 ELSE (CASE (<v2 schema>) WHEN ... THEN 2
545696Snw141292  * ELSE -1 END) END AS version;
555696Snw141292  *
565696Snw141292  * That is, check that there is no schema else that the current schema
575696Snw141292  * sql matches the original schema, else the next version, ... and
585696Snw141292  * return an integer identifying the schema.  Version numbers returned:
595696Snw141292  *
605696Snw141292  * -1 -> unknown schema  (shouldn't happen)
615696Snw141292  *  0 -> no schema       (brand new DB, install latest schema)
625696Snw141292  *  1 -> original schema (if != latest, then upgrade)
635696Snw141292  *  . -> ...             (if != latest, then upgrade)
645696Snw141292  *  n -> latest schema   (nothing to do)
655696Snw141292  *
665696Snw141292  * Upgrade SQL for the cache DB is simple: drop everything, create
675696Snw141292  * latest schema.  This means losing ephemeral mappings, so idmapd must
685696Snw141292  * tell the kernel about that in its registration call.
695696Snw141292  *
705696Snw141292  * Upgrade SQL for the persistent DB is simple: drop the indexes, create
715696Snw141292  * temporary tables with the latest schema, insert into those from the
725696Snw141292  * old tables (transforming the data in the process), then drop the old
735696Snw141292  * tables, create the latest schema, restore the data from the temp.
745696Snw141292  * tables and drop the temp tables.
755696Snw141292  *
765696Snw141292  * Complex, but it avoids all sorts of packaging install/upgrade
775696Snw141292  * complexity, requiring reboots on patch.
785696Snw141292  *
795696Snw141292  * Conventions:
805696Snw141292  * - each TABLE/INDEX gets its own macro, and the SQL therein must not
815696Snw141292  *   end in a semi-colon (';)
825696Snw141292  * - macros are named * TABLE_* for tables, INDEX_* for indexes,
835696Snw141292  *   *_VERSION_SQL for SQL for determining version number,
845696Snw141292  *   *_UPGRADE_FROM_v<version>_SQL for SQL for upgrading from some
855696Snw141292  *   schema, *_LATEST_SQL for SQL for installing the latest schema.
865696Snw141292  * - some macros nest expansions of other macros
875696Snw141292  *
885696Snw141292  * The latest schema has two columns for Windows user/group name in
895696Snw141292  * tables where there used to be one.  One of those columns contains the
905696Snw141292  * name as it came from the user or from AD, the other is set via a
915696Snw141292  * TRIGGER to be the lower-case version of the first, and we always
925696Snw141292  * search (and index) by the latter.  This is for case-insensitivity.
935696Snw141292  */
945696Snw141292 #define	TABLE_IDMAP_CACHE_v1 \
955696Snw141292 	"CREATE TABLE idmap_cache (" \
965696Snw141292 	"	sidprefix TEXT," \
975696Snw141292 	"	rid INTEGER," \
985696Snw141292 	"	windomain TEXT," \
995696Snw141292 	"	winname TEXT," \
1005696Snw141292 	"	pid INTEGER," \
1015696Snw141292 	"	unixname TEXT," \
1025696Snw141292 	"	is_user INTEGER," \
1035696Snw141292 	"	w2u INTEGER," \
1045696Snw141292 	"	u2w INTEGER," \
1055696Snw141292 	"	expiration INTEGER" \
1065696Snw141292 	")"
1075696Snw141292 
108*6386Sjp151216 #define	TABLE_IDMAP_CACHE_v2 \
109*6386Sjp151216 	"CREATE TABLE idmap_cache " \
110*6386Sjp151216 	"(" \
111*6386Sjp151216 	"	sidprefix TEXT," \
112*6386Sjp151216 	"	rid INTEGER," \
113*6386Sjp151216 	"	windomain TEXT," \
114*6386Sjp151216 	"	canon_winname TEXT," \
115*6386Sjp151216 	"	winname TEXT," \
116*6386Sjp151216 	"	pid INTEGER," \
117*6386Sjp151216 	"	unixname TEXT," \
118*6386Sjp151216 	"	is_user INTEGER," \
119*6386Sjp151216 	"	is_wuser INTEGER," \
120*6386Sjp151216 	"	w2u INTEGER," \
121*6386Sjp151216 	"	u2w INTEGER," \
122*6386Sjp151216 	"	expiration INTEGER" \
123*6386Sjp151216 	")"
124*6386Sjp151216 
1255696Snw141292 #define	TABLE_IDMAP_CACHE \
1265696Snw141292 	"CREATE TABLE idmap_cache " \
1275696Snw141292 	"(" \
1285696Snw141292 	"	sidprefix TEXT," \
1295696Snw141292 	"	rid INTEGER," \
1305696Snw141292 	"	windomain TEXT," \
1315696Snw141292 	"	canon_winname TEXT," \
1325696Snw141292 	"	winname TEXT," \
1335696Snw141292 	"	pid INTEGER," \
1345696Snw141292 	"	unixname TEXT," \
1355696Snw141292 	"	is_user INTEGER," \
1365696Snw141292 	"	is_wuser INTEGER," \
1375696Snw141292 	"	w2u INTEGER," \
1385696Snw141292 	"	u2w INTEGER," \
139*6386Sjp151216 	"	map_type INTEGER," \
140*6386Sjp151216 	"	map_dn TEXT, "\
141*6386Sjp151216 	"	map_attr TEXT, "\
142*6386Sjp151216 	"	map_value TEXT, "\
143*6386Sjp151216 	"	map_windomain TEXT, "\
144*6386Sjp151216 	"	map_winname TEXT, "\
145*6386Sjp151216 	"	map_unixname TEXT, "\
146*6386Sjp151216 	"	map_is_nt4 INTEGER, "\
1475696Snw141292 	"	expiration INTEGER" \
1485696Snw141292 	")"
1495696Snw141292 
1505696Snw141292 #define	INDEX_IDMAP_CACHE_SID_W2U_v1 \
1515696Snw141292 	"CREATE UNIQUE INDEX idmap_cache_sid_w2u ON idmap_cache" \
1525696Snw141292 	"		(sidprefix, rid, w2u)"
1535696Snw141292 
1545696Snw141292 #define	INDEX_IDMAP_CACHE_SID_W2U \
1555696Snw141292 	"CREATE UNIQUE INDEX idmap_cache_sid_w2u ON idmap_cache" \
1565696Snw141292 	"		(sidprefix, rid, is_user, w2u)"
1575696Snw141292 
1585696Snw141292 #define	INDEX_IDMAP_CACHE_PID_U2W \
1595696Snw141292 	"CREATE UNIQUE INDEX idmap_cache_pid_u2w ON idmap_cache" \
1605696Snw141292 	"		(pid, is_user, u2w)"
1615696Snw141292 
1625696Snw141292 #define	TRIGGER_IDMAP_CACHE_TOLOWER_INSERT \
1635696Snw141292 	"CREATE TRIGGER idmap_cache_tolower_name_insert " \
1645696Snw141292 	"AFTER INSERT ON idmap_cache " \
1655696Snw141292 	"BEGIN " \
1665696Snw141292 	"	UPDATE idmap_cache SET winname = lower_utf8(canon_winname)" \
1675696Snw141292 	"		WHERE rowid = new.rowid;" \
1685696Snw141292 	"END"
1695696Snw141292 
1705696Snw141292 #define	TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE \
1715696Snw141292 	"CREATE TRIGGER idmap_cache_tolower_name_update " \
1725696Snw141292 	"AFTER UPDATE ON idmap_cache " \
1735696Snw141292 	"BEGIN " \
1745696Snw141292 	"	UPDATE idmap_cache SET winname = lower_utf8(canon_winname)" \
1755696Snw141292 	"		WHERE rowid = new.rowid;" \
1765696Snw141292 	"END"
1775696Snw141292 
1785696Snw141292 #define	TABLE_NAME_CACHE \
1795696Snw141292 	"CREATE TABLE name_cache (" \
1805696Snw141292 	"	sidprefix TEXT," \
1815696Snw141292 	"	rid INTEGER," \
1825696Snw141292 	"	name TEXT," \
1835696Snw141292 	"	canon_name TEXT," \
1845696Snw141292 	"	domain TEXT," \
1855696Snw141292 	"	type INTEGER," \
1865696Snw141292 	"	expiration INTEGER" \
1875696Snw141292 	")"
1885696Snw141292 
1895696Snw141292 #define	TABLE_NAME_CACHE_v1 \
1905696Snw141292 	"CREATE TABLE name_cache (" \
1915696Snw141292 	"	sidprefix TEXT," \
1925696Snw141292 	"	rid INTEGER," \
1935696Snw141292 	"	name TEXT," \
1945696Snw141292 	"	domain TEXT," \
1955696Snw141292 	"	type INTEGER," \
1965696Snw141292 	"	expiration INTEGER" \
1975696Snw141292 	")"
1985696Snw141292 
1995696Snw141292 #define	TRIGGER_NAME_CACHE_TOLOWER_INSERT \
2005696Snw141292 	"CREATE TRIGGER name_cache_tolower_name_insert " \
2015696Snw141292 	"AFTER INSERT ON name_cache " \
2025696Snw141292 	"BEGIN " \
2035696Snw141292 	"	UPDATE name_cache SET name = lower_utf8(canon_name)" \
2045696Snw141292 	"		WHERE rowid = new.rowid;" \
2055696Snw141292 	"END"
2065696Snw141292 
2075696Snw141292 #define	TRIGGER_NAME_CACHE_TOLOWER_UPDATE \
2085696Snw141292 	"CREATE TRIGGER name_cache_tolower_name_update " \
2095696Snw141292 	"AFTER UPDATE ON name_cache " \
2105696Snw141292 	"BEGIN " \
2115696Snw141292 	"	UPDATE name_cache SET name = lower_utf8(canon_name)" \
2125696Snw141292 	"		WHERE rowid = new.rowid;" \
2135696Snw141292 	"END"
2145696Snw141292 
2155696Snw141292 #define	INDEX_NAME_CACHE_SID \
2165696Snw141292 	"CREATE UNIQUE INDEX name_cache_sid ON name_cache" \
2175696Snw141292 	"		(sidprefix, rid)"
2185696Snw141292 
2195696Snw141292 #define	INDEX_NAME_CACHE_NAME \
2205696Snw141292 	"CREATE UNIQUE INDEX name_cache_name ON name_cache" \
2215696Snw141292 	"		(name, domain)"
2225696Snw141292 
2235696Snw141292 #define	CACHE_INSTALL_SQL \
2245696Snw141292 	TABLE_IDMAP_CACHE ";" \
2255696Snw141292 	INDEX_IDMAP_CACHE_SID_W2U ";" \
2265696Snw141292 	INDEX_IDMAP_CACHE_PID_U2W ";" \
2275696Snw141292 	TRIGGER_IDMAP_CACHE_TOLOWER_INSERT ";" \
2285696Snw141292 	TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE ";" \
2295696Snw141292 	TABLE_NAME_CACHE ";" \
2305696Snw141292 	INDEX_NAME_CACHE_SID ";" \
2315696Snw141292 	INDEX_NAME_CACHE_NAME ";" \
2325696Snw141292 	TRIGGER_NAME_CACHE_TOLOWER_INSERT ";" \
2335696Snw141292 	TRIGGER_NAME_CACHE_TOLOWER_UPDATE ";"
2345696Snw141292 
2355696Snw141292 #define	CACHE_VERSION_SQL \
2365696Snw141292 	"SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE " \
2375696Snw141292 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
2385696Snw141292 	"sql = '" TABLE_IDMAP_CACHE_v1 "' OR " \
2395696Snw141292 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U_v1 "' OR " \
2405696Snw141292 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
2415696Snw141292 	"sql = '" TABLE_NAME_CACHE_v1 "' OR " \
2425696Snw141292 	"sql = '" INDEX_NAME_CACHE_SID "') " \
2435696Snw141292 	"WHEN 5 THEN 1 ELSE " \
2445696Snw141292 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
245*6386Sjp151216 	"sql = '" TABLE_IDMAP_CACHE_v2"' OR " \
246*6386Sjp151216 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U "' OR " \
247*6386Sjp151216 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
248*6386Sjp151216 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_INSERT "' OR " \
249*6386Sjp151216 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE "' OR " \
250*6386Sjp151216 	"sql = '" TABLE_NAME_CACHE "' OR " \
251*6386Sjp151216 	"sql = '" INDEX_NAME_CACHE_SID "' OR " \
252*6386Sjp151216 	"sql = '" INDEX_NAME_CACHE_NAME "' OR " \
253*6386Sjp151216 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_INSERT "' OR " \
254*6386Sjp151216 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_UPDATE "') " \
255*6386Sjp151216 	"WHEN 10 THEN 2 ELSE " \
256*6386Sjp151216 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
2575696Snw141292 	"sql = '" TABLE_IDMAP_CACHE"' OR " \
2585696Snw141292 	"sql = '" INDEX_IDMAP_CACHE_SID_W2U "' OR " \
2595696Snw141292 	"sql = '" INDEX_IDMAP_CACHE_PID_U2W "' OR " \
2605696Snw141292 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_INSERT "' OR " \
2615696Snw141292 	"sql = '" TRIGGER_IDMAP_CACHE_TOLOWER_UPDATE "' OR " \
2625696Snw141292 	"sql = '" TABLE_NAME_CACHE "' OR " \
2635696Snw141292 	"sql = '" INDEX_NAME_CACHE_SID "' OR " \
2645696Snw141292 	"sql = '" INDEX_NAME_CACHE_NAME "' OR " \
2655696Snw141292 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_INSERT "' OR " \
2665696Snw141292 	"sql = '" TRIGGER_NAME_CACHE_TOLOWER_UPDATE "') " \
267*6386Sjp151216 	"WHEN 10 THEN 3 ELSE -1 END) END) END) END AS version;"
2685696Snw141292 
2695696Snw141292 #define	CACHE_UPGRADE_FROM_v1_SQL \
2705696Snw141292 	"DROP TABLE idmap_cache;" \
2715696Snw141292 	"DROP TABLE name_cache;" \
2725696Snw141292 	CACHE_INSTALL_SQL
2735696Snw141292 
274*6386Sjp151216 #define	CACHE_UPGRADE_FROM_v2_SQL \
275*6386Sjp151216 	"DROP TABLE idmap_cache;" \
276*6386Sjp151216 	"DROP TABLE name_cache;" \
277*6386Sjp151216 	CACHE_INSTALL_SQL
278*6386Sjp151216 
279*6386Sjp151216 #define	CACHE_VERSION	3
2805696Snw141292 
2815696Snw141292 
2825696Snw141292 #define	TABLE_NAMERULES_v1 \
2835696Snw141292 	"CREATE TABLE namerules (" \
2845696Snw141292 	"	is_user INTEGER NOT NULL," \
2855696Snw141292 	"	windomain TEXT," \
2865696Snw141292 	"	winname TEXT NOT NULL," \
2875696Snw141292 	"	is_nt4 INTEGER NOT NULL," \
2885696Snw141292 	"	unixname NOT NULL," \
2895696Snw141292 	"	w2u_order INTEGER," \
2905696Snw141292 	"	u2w_order INTEGER" \
2915696Snw141292 	")"
2925696Snw141292 
2935696Snw141292 #define	TABLE_NAMERULES_BODY \
2945696Snw141292 	"(" \
2955696Snw141292 	"	is_user INTEGER NOT NULL," \
2965696Snw141292 	"	is_wuser INTEGER NOT NULL," \
2975696Snw141292 	"	windomain TEXT," \
2985696Snw141292 	"	winname_display TEXT NOT NULL," \
2995696Snw141292 	"	winname TEXT," \
3005696Snw141292 	"	is_nt4 INTEGER NOT NULL," \
3015696Snw141292 	"	unixname NOT NULL," \
3025696Snw141292 	"	w2u_order INTEGER," \
3035696Snw141292 	"	u2w_order INTEGER" \
3045696Snw141292 	")"
3055696Snw141292 
3065696Snw141292 #define	TABLE_NAMERULES \
3075696Snw141292 	"CREATE TABLE namerules " \
3085696Snw141292 	TABLE_NAMERULES_BODY
3095696Snw141292 
3105696Snw141292 #define	INDEX_NAMERULES_W2U_v1 \
3115696Snw141292 	"CREATE UNIQUE INDEX namerules_w2u ON namerules" \
3125696Snw141292 	"		(winname, windomain, is_user, w2u_order)"
3135696Snw141292 
3145696Snw141292 #define	INDEX_NAMERULES_W2U \
3155696Snw141292 	"CREATE UNIQUE INDEX namerules_w2u ON namerules" \
3165696Snw141292 	"		(winname, windomain, is_user, is_wuser, w2u_order)"
3175696Snw141292 
3185696Snw141292 #define	INDEX_NAMERULES_U2W \
3195696Snw141292 	"CREATE UNIQUE INDEX namerules_u2w ON namerules" \
3205696Snw141292 	"		(unixname, is_user, u2w_order)"
3215696Snw141292 
3225696Snw141292 #define	TRIGGER_NAMERULES_TOLOWER_BODY \
3235696Snw141292 	"BEGIN " \
3245696Snw141292 	"	UPDATE namerules SET winname = lower_utf8(winname_display)" \
3255696Snw141292 	"		WHERE rowid = new.rowid;" \
3265696Snw141292 	"END"
3275696Snw141292 
3285696Snw141292 #define	TRIGGER_NAMERULES_TOLOWER_INSERT \
3295696Snw141292 	"CREATE TRIGGER namerules_tolower_name_insert " \
3305696Snw141292 	"AFTER INSERT ON namerules " \
3315696Snw141292 	TRIGGER_NAMERULES_TOLOWER_BODY
3325696Snw141292 
3335696Snw141292 #define	TRIGGER_NAMERULES_TOLOWER_UPDATE \
3345696Snw141292 	"CREATE TRIGGER namerules_tolower_name_update " \
3355696Snw141292 	"AFTER UPDATE ON namerules " \
3365696Snw141292 	TRIGGER_NAMERULES_TOLOWER_BODY
3375696Snw141292 
3385696Snw141292 #define	TRIGGER_NAMERULES_UNIQUE_BODY \
3395696Snw141292 	"	SELECT CASE (SELECT count(*) FROM namerules AS n" \
3405696Snw141292 	"		WHERE n.unixname = NEW.unixname AND" \
3415696Snw141292 	"		n.is_user = NEW.is_user AND" \
3425696Snw141292 	"		(n.winname != lower(NEW.winname_display) OR" \
3435696Snw141292 	"		n.windomain != NEW.windomain ) AND" \
3445696Snw141292 	"		n.u2w_order = NEW.u2w_order AND" \
3455696Snw141292 	"		n.is_wuser != NEW.is_wuser) > 0" \
3465696Snw141292 	"	WHEN 1 THEN" \
3475696Snw141292 	"		raise(ROLLBACK, 'Conflicting w2u namerules')"\
3485696Snw141292 	"	END; " \
3495696Snw141292 	"END"
3505696Snw141292 
3515696Snw141292 #define	TRIGGER_NAMERULES_UNIQUE_INSERT \
3525696Snw141292 	"CREATE TRIGGER namerules_unique_insert " \
3535696Snw141292 	"BEFORE INSERT ON namerules " \
3545696Snw141292 	"BEGIN " \
3555696Snw141292 	TRIGGER_NAMERULES_UNIQUE_BODY
3565696Snw141292 
3575696Snw141292 #define	TRIGGER_NAMERULES_UNIQUE_UPDATE \
3585696Snw141292 	"CREATE TRIGGER namerules_unique_update " \
3595696Snw141292 	"BEFORE INSERT ON namerules " \
3605696Snw141292 	"BEGIN " \
3615696Snw141292 	TRIGGER_NAMERULES_UNIQUE_BODY
3625696Snw141292 
3635696Snw141292 #define	DB_INSTALL_SQL \
3645696Snw141292 	TABLE_NAMERULES ";" \
3655696Snw141292 	INDEX_NAMERULES_W2U ";" \
3665696Snw141292 	INDEX_NAMERULES_U2W ";" \
3675696Snw141292 	TRIGGER_NAMERULES_TOLOWER_INSERT ";" \
3685696Snw141292 	TRIGGER_NAMERULES_TOLOWER_UPDATE ";" \
3695696Snw141292 	TRIGGER_NAMERULES_UNIQUE_INSERT ";" \
3705696Snw141292 	TRIGGER_NAMERULES_UNIQUE_UPDATE ";"
3715696Snw141292 
3725696Snw141292 #define	DB_VERSION_SQL \
3735696Snw141292 	"SELECT CASE (SELECT count(*) FROM sqlite_master) WHEN 0 THEN 0 ELSE " \
3745696Snw141292 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
3755696Snw141292 	"sql = '" TABLE_NAMERULES_v1 "' OR " \
3765696Snw141292 	"sql = '" INDEX_NAMERULES_W2U_v1 "' OR " \
3775696Snw141292 	"sql = '" INDEX_NAMERULES_U2W "') " \
3785696Snw141292 	"WHEN 3 THEN 1 ELSE "\
3795696Snw141292 	"(CASE (SELECT count(*) FROM sqlite_master WHERE " \
3805696Snw141292 	"sql = '" TABLE_NAMERULES "' OR " \
3815696Snw141292 	"sql = '" INDEX_NAMERULES_W2U "' OR " \
3825696Snw141292 	"sql = '" INDEX_NAMERULES_U2W "' OR " \
3835696Snw141292 	"sql = '" TRIGGER_NAMERULES_TOLOWER_INSERT "' OR " \
3845696Snw141292 	"sql = '" TRIGGER_NAMERULES_TOLOWER_UPDATE "' OR " \
3855696Snw141292 	"sql = \"" TRIGGER_NAMERULES_UNIQUE_INSERT "\" OR " \
3865696Snw141292 	"sql = \"" TRIGGER_NAMERULES_UNIQUE_UPDATE "\") " \
3875696Snw141292 	"WHEN 7 THEN 2 ELSE -1 END) END) END AS version;"
3885696Snw141292 
3895696Snw141292 /* SQL for upgrading an existing name rules DB.  Includes DB_INSTALL_SQL */
3905696Snw141292 #define	DB_UPGRADE_FROM_v1_SQL \
3915696Snw141292 	"CREATE TABLE namerules_new " TABLE_NAMERULES_BODY ";" \
3925696Snw141292 	"INSERT INTO namerules_new SELECT is_user, is_user, windomain, " \
3935696Snw141292 	"winname, winname, is_nt4, unixname, w2u_order, u2w_order " \
3945696Snw141292 	"FROM namerules;" \
3955696Snw141292 	"DROP TABLE namerules;" \
3965696Snw141292 	DB_INSTALL_SQL \
3975696Snw141292 	"INSERT INTO namerules SELECT * FROM namerules_new;" \
3985696Snw141292 	"DROP TABLE namerules_new;"
3995696Snw141292 
4005696Snw141292 #define	DB_VERSION	2
4015696Snw141292 
4025696Snw141292 #ifdef __cplusplus
4035696Snw141292 }
4045696Snw141292 #endif
4055696Snw141292 
4065696Snw141292 
4075696Snw141292 #endif	/* _SCHEMA_H */
408