-//\r
-// Mainsoft.Web.Security.DerbyDBSchema\r
-//\r
-// Authors:\r
-// Vladimir Krasnov (vladimirk@mainsoft.com)\r
-//\r
-// (C) 2006 Mainsoft\r
-//\r
-// Permission is hereby granted, free of charge, to any person obtaining\r
-// a copy of this software and associated documentation files (the\r
-// "Software"), to deal in the Software without restriction, including\r
-// without limitation the rights to use, copy, modify, merge, publish,\r
-// distribute, sublicense, and/or sell copies of the Software, and to\r
-// permit persons to whom the Software is furnished to do so, subject to\r
-// the following conditions:\r
-// \r
-// The above copyright notice and this permission notice shall be\r
-// included in all copies or substantial portions of the Software.\r
-// \r
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\r
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\r
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
-//\r
-\r
-#if NET_2_0\r
-\r
-using System;\r
-using System.Data;\r
-using System.Data.OleDb;\r
-using System.Collections.Generic;\r
-using System.Text;\r
-\r
-namespace Mainsoft.Web.Security\r
-{\r
- internal class DerbyDBSchema\r
- {\r
- #region schema string array\r
- static string [] schemaElements = new string [] {\r
- // Applications table\r
- @"CREATE TABLE aspnet_Applications (\r
- ApplicationId char(36) PRIMARY KEY,\r
- ApplicationName varchar(256) NOT NULL UNIQUE,\r
- LoweredApplicationName varchar(256) NOT NULL UNIQUE,\r
- Description varchar(256)\r
- )",\r
- @"CREATE INDEX aspnet_Applications_Index ON aspnet_Applications(LoweredApplicationName)",\r
-\r
- // Users table\r
- @"CREATE TABLE aspnet_Users (\r
- ApplicationId char(36) NOT NULL,\r
- UserId char(36) NOT NULL PRIMARY KEY,\r
- UserName varchar(256) NOT NULL,\r
- LoweredUserName varchar(256) NOT NULL,\r
- MobileAlias varchar(16) DEFAULT NULL,\r
- IsAnonymous int NOT NULL DEFAULT 0,\r
- LastActivityDate timestamp NOT NULL,\r
-\r
- CONSTRAINT Users_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)\r
- )",\r
- @"CREATE UNIQUE INDEX aspnet_Users_Index ON aspnet_Users(ApplicationId, LoweredUserName)",\r
- @"CREATE INDEX aspnet_Users_Index2 ON aspnet_Users(ApplicationId, LastActivityDate)",\r
-\r
- // Membership table\r
- @"CREATE TABLE aspnet_Membership (\r
- ApplicationId char(36) NOT NULL,\r
- UserId char(36) NOT NULL PRIMARY KEY, \r
- Password varchar(128) NOT NULL,\r
- PasswordFormat int NOT NULL DEFAULT 0,\r
- PasswordSalt varchar(128) NOT NULL,\r
- MobilePIN varchar(16),\r
- Email varchar(256),\r
- LoweredEmail varchar(256),\r
- PasswordQuestion varchar(256),\r
- PasswordAnswer varchar(128),\r
- IsApproved int NOT NULL,\r
- IsLockedOut int NOT NULL,\r
- CreateDate timestamp NOT NULL,\r
- LastLoginDate timestamp NOT NULL,\r
- LastPasswordChangedDate timestamp NOT NULL,\r
- LastLockoutDate timestamp NOT NULL,\r
- FailedPasswordAttemptCount int NOT NULL,\r
- FailedPasswordAttemptWindowStart timestamp NOT NULL,\r
- FailedPasswordAnswerAttemptCount int NOT NULL,\r
- FailedPasswordAnswerAttemptWindowStart timestamp NOT NULL,\r
- Comment varchar(256), \r
-\r
- CONSTRAINT Member_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId),\r
- CONSTRAINT UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users(UserId)\r
- )",\r
- @"CREATE INDEX aspnet_Membership_index ON aspnet_Membership(ApplicationId, LoweredEmail)",\r
-\r
- // Roles table\r
- @"CREATE TABLE aspnet_Roles (\r
- ApplicationId char(36) NOT NULL,\r
- RoleId char(36) NOT NULL PRIMARY KEY,\r
- RoleName varchar(256) NOT NULL,\r
- LoweredRoleName varchar(256) NOT NULL,\r
- Description varchar(256),\r
-\r
- CONSTRAINT Roles_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)\r
- )",\r
- @"CREATE UNIQUE INDEX aspnet_Roles_index ON aspnet_Roles(ApplicationId, LoweredRoleName)",\r
-\r
- // UsersInRoles table\r
- @"CREATE TABLE aspnet_UsersInRoles (\r
- UserId char(36) NOT NULL, \r
- RoleId char(36) NOT NULL,\r
-\r
- CONSTRAINT RoleId_UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId),\r
- CONSTRAINT UserId_RoleId_PK FOREIGN KEY (RoleId) REFERENCES aspnet_Roles (RoleId)\r
- )",\r
- @"ALTER TABLE aspnet_UsersInRoles ADD PRIMARY KEY (UserId, RoleId)",\r
- @"CREATE INDEX aspnet_UsersInRoles_index ON aspnet_UsersInRoles(RoleId)",\r
-\r
- // Profile table\r
- @"CREATE TABLE aspnet_Profile (\r
- UserId char(36) NOT NULL PRIMARY KEY,\r
- PropertyNames long varchar NOT NULL,\r
- PropertyValuesString long varchar NOT NULL,\r
- PropertyValuesBinary blob NOT NULL,\r
- LastUpdatedDate timestamp NOT NULL,\r
-\r
- CONSTRAINT Profile_UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId)\r
- )",\r
-\r
- // Pathes table\r
- @"CREATE TABLE aspnet_Paths (\r
- ApplicationId char(36) NOT NULL,\r
- PathId char(36) NOT NULL PRIMARY KEY,\r
- Path varchar(256) NOT NULL,\r
- LoweredPath varchar(256) NOT NULL,\r
-\r
- CONSTRAINT Paths_ApplicationId_FK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)\r
- )",\r
- @"CREATE UNIQUE INDEX aspnet_Paths_index ON aspnet_Paths(ApplicationId, LoweredPath)",\r
-\r
- // Personalization tables\r
- @"CREATE TABLE aspnet_PersonalizationAllUsers (\r
- PathId char(36) NOT NULL PRIMARY KEY,\r
- PageSettings blob NOT NULL,\r
- LastUpdatedDate timestamp NOT NULL,\r
-\r
- CONSTRAINT PersnlUsers_PathId_PK FOREIGN KEY (PathId) REFERENCES aspnet_Paths (PathId)\r
- )",\r
- @"CREATE TABLE aspnet_PersonalizationPerUser (\r
- Id char(36) NOT NULL PRIMARY KEY,\r
- PathId char(36) NOT NULL,\r
- UserId char(36) NOT NULL,\r
- PageSettings blob NOT NULL,\r
- LastUpdatedDate timestamp NOT NULL,\r
-\r
- CONSTRAINT PersnlPerUser_PathId_FK FOREIGN KEY (PathId) REFERENCES aspnet_Paths (PathId),\r
- CONSTRAINT PersnlPerUser_UserId_FK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId)\r
- )",\r
- @"CREATE UNIQUE INDEX aspnet_PersonalizationPerUser_index1 ON aspnet_PersonalizationPerUser(PathId,UserId)",\r
- @"CREATE UNIQUE INDEX aspnet_PersonalizationPerUser_ncindex2 ON aspnet_PersonalizationPerUser(UserId,PathId)"\r
- };\r
- #endregion\r
-\r
- public static void InitializeSchema (string connectionString)\r
- {\r
- if (IsSchemaExists (connectionString))\r
- return;\r
-\r
- if (connectionString.ToLower ().IndexOf ("create=true") < 0) {\r
- if (!connectionString.Trim ().EndsWith (";"))\r
- connectionString += ";";\r
-\r
- connectionString += "create=true";\r
- }\r
-\r
- OleDbConnection connection = new OleDbConnection ();\r
- connection.ConnectionString = connectionString;\r
-\r
- connection.Open ();\r
-\r
- using (connection) {\r
- for (int i = 0; i < schemaElements.Length; i++) {\r
- try {\r
- OleDbCommand cmd = new OleDbCommand (schemaElements [i], connection);\r
- cmd.ExecuteNonQuery ();\r
- }\r
- catch (Exception) {\r
- }\r
- }\r
- }\r
- }\r
-\r
- public static bool IsSchemaExists (string connectionString)\r
- {\r
- OleDbConnection connection = new OleDbConnection (connectionString);\r
-\r
- try {\r
- connection.Open ();\r
- }\r
- catch (Exception) {\r
- return false;\r
- }\r
-\r
- using (connection) {\r
- OleDbCommand cmd = new OleDbCommand ("SELECT COUNT(*) FROM aspnet_Applications", connection);\r
- try {\r
- using (OleDbDataReader reader = cmd.ExecuteReader ()) {\r
- if (reader.Read ())\r
- return true;\r
- }\r
- }\r
- catch (Exception) {\r
- return false;\r
- }\r
- }\r
-\r
- return false;\r
- }\r
- }\r
-}\r
-\r
-#endif\r
+//
+// Mainsoft.Web.Security.DerbyDBSchema
+//
+// Authors:
+// Vladimir Krasnov (vladimirk@mainsoft.com)
+//
+// (C) 2006 Mainsoft
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_2_0
+
+using System;
+using System.Data;
+using System.Data.OleDb;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Mainsoft.Web.Security
+{
+ internal class DerbyDBSchema
+ {
+ #region schema string array
+ static string [] schemaElements = new string [] {
+ // Applications table
+ @"CREATE TABLE aspnet_Applications (
+ ApplicationId char(36) PRIMARY KEY,
+ ApplicationName varchar(256) NOT NULL UNIQUE,
+ LoweredApplicationName varchar(256) NOT NULL UNIQUE,
+ Description varchar(256)
+ )",
+ @"CREATE INDEX aspnet_Applications_Index ON aspnet_Applications(LoweredApplicationName)",
+
+ // Users table
+ @"CREATE TABLE aspnet_Users (
+ ApplicationId char(36) NOT NULL,
+ UserId char(36) NOT NULL PRIMARY KEY,
+ UserName varchar(256) NOT NULL,
+ LoweredUserName varchar(256) NOT NULL,
+ MobileAlias varchar(16) DEFAULT NULL,
+ IsAnonymous int NOT NULL DEFAULT 0,
+ LastActivityDate timestamp NOT NULL,
+
+ CONSTRAINT Users_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)
+ )",
+ @"CREATE UNIQUE INDEX aspnet_Users_Index ON aspnet_Users(ApplicationId, LoweredUserName)",
+ @"CREATE INDEX aspnet_Users_Index2 ON aspnet_Users(ApplicationId, LastActivityDate)",
+
+ // Membership table
+ @"CREATE TABLE aspnet_Membership (
+ ApplicationId char(36) NOT NULL,
+ UserId char(36) NOT NULL PRIMARY KEY,
+ Password varchar(128) NOT NULL,
+ PasswordFormat int NOT NULL DEFAULT 0,
+ PasswordSalt varchar(128) NOT NULL,
+ MobilePIN varchar(16),
+ Email varchar(256),
+ LoweredEmail varchar(256),
+ PasswordQuestion varchar(256),
+ PasswordAnswer varchar(128),
+ IsApproved int NOT NULL,
+ IsLockedOut int NOT NULL,
+ CreateDate timestamp NOT NULL,
+ LastLoginDate timestamp NOT NULL,
+ LastPasswordChangedDate timestamp NOT NULL,
+ LastLockoutDate timestamp NOT NULL,
+ FailedPasswordAttemptCount int NOT NULL,
+ FailedPasswordAttemptWindowStart timestamp NOT NULL,
+ FailedPasswordAnswerAttemptCount int NOT NULL,
+ FailedPasswordAnswerAttemptWindowStart timestamp NOT NULL,
+ Comment varchar(256),
+
+ CONSTRAINT Member_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId),
+ CONSTRAINT UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users(UserId)
+ )",
+ @"CREATE INDEX aspnet_Membership_index ON aspnet_Membership(ApplicationId, LoweredEmail)",
+
+ // Roles table
+ @"CREATE TABLE aspnet_Roles (
+ ApplicationId char(36) NOT NULL,
+ RoleId char(36) NOT NULL PRIMARY KEY,
+ RoleName varchar(256) NOT NULL,
+ LoweredRoleName varchar(256) NOT NULL,
+ Description varchar(256),
+
+ CONSTRAINT Roles_ApplicationId_PK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)
+ )",
+ @"CREATE UNIQUE INDEX aspnet_Roles_index ON aspnet_Roles(ApplicationId, LoweredRoleName)",
+
+ // UsersInRoles table
+ @"CREATE TABLE aspnet_UsersInRoles (
+ UserId char(36) NOT NULL,
+ RoleId char(36) NOT NULL,
+
+ CONSTRAINT RoleId_UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId),
+ CONSTRAINT UserId_RoleId_PK FOREIGN KEY (RoleId) REFERENCES aspnet_Roles (RoleId)
+ )",
+ @"ALTER TABLE aspnet_UsersInRoles ADD PRIMARY KEY (UserId, RoleId)",
+ @"CREATE INDEX aspnet_UsersInRoles_index ON aspnet_UsersInRoles(RoleId)",
+
+ // Profile table
+ @"CREATE TABLE aspnet_Profile (
+ UserId char(36) NOT NULL PRIMARY KEY,
+ PropertyNames long varchar NOT NULL,
+ PropertyValuesString long varchar NOT NULL,
+ PropertyValuesBinary blob NOT NULL,
+ LastUpdatedDate timestamp NOT NULL,
+
+ CONSTRAINT Profile_UserId_PK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId)
+ )",
+
+ // Pathes table
+ @"CREATE TABLE aspnet_Paths (
+ ApplicationId char(36) NOT NULL,
+ PathId char(36) NOT NULL PRIMARY KEY,
+ Path varchar(256) NOT NULL,
+ LoweredPath varchar(256) NOT NULL,
+
+ CONSTRAINT Paths_ApplicationId_FK FOREIGN KEY (ApplicationId) REFERENCES aspnet_Applications(ApplicationId)
+ )",
+ @"CREATE UNIQUE INDEX aspnet_Paths_index ON aspnet_Paths(ApplicationId, LoweredPath)",
+
+ // Personalization tables
+ @"CREATE TABLE aspnet_PersonalizationAllUsers (
+ PathId char(36) NOT NULL PRIMARY KEY,
+ PageSettings blob NOT NULL,
+ LastUpdatedDate timestamp NOT NULL,
+
+ CONSTRAINT PersnlUsers_PathId_PK FOREIGN KEY (PathId) REFERENCES aspnet_Paths (PathId)
+ )",
+ @"CREATE TABLE aspnet_PersonalizationPerUser (
+ Id char(36) NOT NULL PRIMARY KEY,
+ PathId char(36) NOT NULL,
+ UserId char(36) NOT NULL,
+ PageSettings blob NOT NULL,
+ LastUpdatedDate timestamp NOT NULL,
+
+ CONSTRAINT PersnlPerUser_PathId_FK FOREIGN KEY (PathId) REFERENCES aspnet_Paths (PathId),
+ CONSTRAINT PersnlPerUser_UserId_FK FOREIGN KEY (UserId) REFERENCES aspnet_Users (UserId)
+ )",
+ @"CREATE UNIQUE INDEX aspnet_PersonalizationPerUser_index1 ON aspnet_PersonalizationPerUser(PathId,UserId)",
+ @"CREATE UNIQUE INDEX aspnet_PersonalizationPerUser_ncindex2 ON aspnet_PersonalizationPerUser(UserId,PathId)"
+ };
+ #endregion
+
+ public static void InitializeSchema (string connectionString)
+ {
+ RegisterUnloadHandler (connectionString);
+
+ if (IsSchemaExists (connectionString))
+ return;
+
+ if (connectionString.ToLower ().IndexOf ("create=true") < 0) {
+ if (!connectionString.Trim ().EndsWith (";"))
+ connectionString += ";";
+
+ connectionString += "create=true";
+ }
+
+ OleDbConnection connection = new OleDbConnection ();
+ connection.ConnectionString = connectionString;
+
+ connection.Open ();
+
+ using (connection) {
+ for (int i = 0; i < schemaElements.Length; i++) {
+ try {
+ OleDbCommand cmd = new OleDbCommand (schemaElements [i], connection);
+ cmd.ExecuteNonQuery ();
+ }
+ catch (Exception) {
+ }
+ }
+ }
+ }
+
+ public static bool IsSchemaExists (string connectionString)
+ {
+ OleDbConnection connection = new OleDbConnection (connectionString);
+
+ try {
+ connection.Open ();
+ }
+ catch (Exception) {
+ return false;
+ }
+
+ using (connection) {
+ OleDbCommand cmd = new OleDbCommand ("SELECT COUNT(*) FROM aspnet_Applications", connection);
+ try {
+ using (OleDbDataReader reader = cmd.ExecuteReader ()) {
+ if (reader.Read ())
+ return true;
+ }
+ }
+ catch (Exception) {
+ return false;
+ }
+ }
+
+ return false;
+ }
+
+ static void RegisterUnloadHandler (string connectionString)
+ {
+ DerbyUnloadManager derbyMan = new DerbyUnloadManager (connectionString);
+ derbyMan.RegisterUnloadHandler ();
+ }
+ }
+
+ internal class DerbyUnloadManager
+ {
+ private string _releaseString = null;
+
+ public DerbyUnloadManager (string connectionString)
+ {
+ _releaseString = connectionString;
+
+ string [] parts = _releaseString.Split (';');
+ bool found = false;
+
+ for (int i=0; i<parts.Length; i++)
+ {
+ if (parts[i].ToLower().Trim().StartsWith("create"))
+ {
+ parts[i] = parts[i].ToLower().Trim().Replace("create", "shutdown");
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ _releaseString = string.Join (";", parts);
+ else
+ {
+ if (!_releaseString.Trim ().EndsWith (";"))
+ _releaseString += ";";
+
+ _releaseString += "shutdown=true";
+ }
+ }
+
+ public void UnloadHandler (object sender, EventArgs e)
+ {
+ OleDbConnection connection = new OleDbConnection (_releaseString);
+
+ try {
+ connection.Open ();
+ }
+ catch (Exception) {
+ }
+ }
+
+ public void RegisterUnloadHandler ()
+ {
+ AppDomain.CurrentDomain.DomainUnload += new EventHandler (UnloadHandler);
+ }
+
+ public void UnregisterUnloadHandler ()
+ {
+ AppDomain.CurrentDomain.DomainUnload -= new EventHandler (UnloadHandler);
+ }
+ }
+}
+
+#endif