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