aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Data/SQLiteLegacy/Properties/AssemblyInfo.cs65
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_AssetStore.sql12
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_AuthStore.sql18
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_Avatar.sql9
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_FriendsStore.sql10
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_InventoryStore.sql32
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_RegionStore.sql144
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_UserAccount.sql17
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/001_UserStore.sql39
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_AssetStore.sql10
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_AuthStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_FriendsStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_InventoryStore.sql8
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_RegionStore.sql10
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_UserAccount.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/002_UserStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/003_AssetStore.sql1
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/003_InventoryStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/003_RegionStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/003_UserStore.sql6
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/004_AssetStore.sql7
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/004_InventoryStore.sql36
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/004_RegionStore.sql38
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/004_UserStore.sql6
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/005_RegionStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/005_UserStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/006_RegionStore.sql102
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/006_UserStore.sql20
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/007_RegionStore.sql8
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/007_UserStore.sql7
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/008_RegionStore.sql6
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/008_UserStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/009_RegionStore.sql8
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/009_UserStore.sql11
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/010_RegionStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/010_UserStore.sql37
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/011_RegionStore.sql28
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/012_RegionStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/013_RegionStore.sql6
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/014_RegionStore.sql8
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/015_RegionStore.sql6
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/016_RegionStore.sql5
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/017_RegionStore.sql8
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/018_RegionStore.sql79
-rw-r--r--OpenSim/Data/SQLiteLegacy/Resources/OpenSim.Data.SQLite.addin.xml20
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteAssetData.cs349
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteAuthenticationData.cs266
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteAvatarData.cs74
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs451
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteFramework.cs91
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteFriendsData.cs70
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteGenericTableHandler.cs268
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteInventoryStore.cs898
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs2274
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteUserAccountData.cs86
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteUtils.cs307
-rw-r--r--OpenSim/Data/SQLiteLegacy/SQLiteXInventoryData.cs155
-rw-r--r--OpenSim/Framework/ILandObject.cs22
-rw-r--r--OpenSim/Region/Application/Application.cs14
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs12
-rw-r--r--OpenSim/Region/CoreModules/World/Land/LandObject.cs14
-rw-r--r--OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs25
-rw-r--r--OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs114
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneGraph.cs2
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs2
-rw-r--r--OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs16
66 files changed, 169 insertions, 6223 deletions
diff --git a/OpenSim/Data/SQLiteLegacy/Properties/AssemblyInfo.cs b/OpenSim/Data/SQLiteLegacy/Properties/AssemblyInfo.cs
deleted file mode 100644
index 609a024..0000000
--- a/OpenSim/Data/SQLiteLegacy/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,65 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System.Reflection;
29using System.Runtime.InteropServices;
30
31// General information about an assembly is controlled through the following
32// set of attributes. Change these attribute values to modify the information
33// associated with an assembly.
34
35[assembly : AssemblyTitle("OpenSim.Data.SQLiteLegacy")]
36[assembly : AssemblyDescription("")]
37[assembly : AssemblyConfiguration("")]
38[assembly : AssemblyCompany("http://opensimulator.org")]
39[assembly : AssemblyProduct("OpenSim.Data.SQLiteLegacy")]
40[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
41[assembly : AssemblyTrademark("")]
42[assembly : AssemblyCulture("")]
43
44// Setting ComVisible to false makes the types in this assembly not visible
45// to COM components. If you need to access a type in this assembly from
46// COM, set the ComVisible attribute to true on that type.
47
48[assembly : ComVisible(false)]
49
50// The following GUID is for the ID of the typelib if this project is exposed to COM
51
52[assembly : Guid("6113d5ce-4547-49f4-9236-0dcc503457b1")]
53
54// Version information for an assembly consists of the following four values:
55//
56// Major Version
57// Minor Version
58// Build Number
59// Revision
60//
61// You can specify all the values or you can default the Revision and Build Numbers
62// by using the '*' as shown below:
63
64[assembly : AssemblyVersion("0.6.5.*")]
65[assembly : AssemblyFileVersion("0.6.5.0")]
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_AssetStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_AssetStore.sql
deleted file mode 100644
index 2e026ca..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_AssetStore.sql
+++ /dev/null
@@ -1,12 +0,0 @@
1BEGIN TRANSACTION;
2CREATE TABLE assets(
3 UUID varchar(255) primary key,
4 Name varchar(255),
5 Description varchar(255),
6 Type integer,
7 InvType integer,
8 Local integer,
9 Temporary integer,
10 Data blob);
11
12COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_AuthStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_AuthStore.sql
deleted file mode 100644
index 468567d..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_AuthStore.sql
+++ /dev/null
@@ -1,18 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE auth (
4 UUID char(36) NOT NULL,
5 passwordHash char(32) NOT NULL default '',
6 passwordSalt char(32) NOT NULL default '',
7 webLoginKey varchar(255) NOT NULL default '',
8 accountType VARCHAR(32) NOT NULL DEFAULT 'UserAccount',
9 PRIMARY KEY (`UUID`)
10);
11
12CREATE TABLE tokens (
13 UUID char(36) NOT NULL,
14 token varchar(255) NOT NULL,
15 validity datetime NOT NULL
16);
17
18COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_Avatar.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_Avatar.sql
deleted file mode 100644
index 7ec906b..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_Avatar.sql
+++ /dev/null
@@ -1,9 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE Avatars (
4 PrincipalID CHAR(36) NOT NULL,
5 Name VARCHAR(32) NOT NULL,
6 Value VARCHAR(255) NOT NULL DEFAULT '',
7 PRIMARY KEY(PrincipalID, Name));
8
9COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_FriendsStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_FriendsStore.sql
deleted file mode 100644
index f1b9ab9..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_FriendsStore.sql
+++ /dev/null
@@ -1,10 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE `Friends` (
4 `PrincipalID` CHAR(36) NOT NULL,
5 `Friend` VARCHAR(255) NOT NULL,
6 `Flags` VARCHAR(16) NOT NULL DEFAULT 0,
7 `Offered` VARCHAR(32) NOT NULL DEFAULT 0,
8 PRIMARY KEY(`PrincipalID`, `Friend`));
9
10COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_InventoryStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_InventoryStore.sql
deleted file mode 100644
index 554d5c2..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_InventoryStore.sql
+++ /dev/null
@@ -1,32 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE inventoryfolders(
4 UUID varchar(255) primary key,
5 name varchar(255),
6 agentID varchar(255),
7 parentID varchar(255),
8 type integer,
9 version integer);
10
11CREATE TABLE inventoryitems(
12 UUID varchar(255) primary key,
13 assetID varchar(255),
14 assetType integer,
15 invType integer,
16 parentFolderID varchar(255),
17 avatarID varchar(255),
18 creatorsID varchar(255),
19 inventoryName varchar(255),
20 inventoryDescription varchar(255),
21 inventoryNextPermissions integer,
22 inventoryCurrentPermissions integer,
23 inventoryBasePermissions integer,
24 inventoryEveryOnePermissions integer,
25 salePrice integer default 99,
26 saleType integer default 0,
27 creationDate integer default 2000,
28 groupID varchar(255) default '00000000-0000-0000-0000-000000000000',
29 groupOwned integer default 0,
30 flags integer default 0);
31
32COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_RegionStore.sql
deleted file mode 100644
index 39e8180..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_RegionStore.sql
+++ /dev/null
@@ -1,144 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE prims(
4 UUID varchar(255) primary key,
5 RegionUUID varchar(255),
6 ParentID integer,
7 CreationDate integer,
8 Name varchar(255),
9 SceneGroupID varchar(255),
10 Text varchar(255),
11 Description varchar(255),
12 SitName varchar(255),
13 TouchName varchar(255),
14 CreatorID varchar(255),
15 OwnerID varchar(255),
16 GroupID varchar(255),
17 LastOwnerID varchar(255),
18 OwnerMask integer,
19 NextOwnerMask integer,
20 GroupMask integer,
21 EveryoneMask integer,
22 BaseMask integer,
23 PositionX float,
24 PositionY float,
25 PositionZ float,
26 GroupPositionX float,
27 GroupPositionY float,
28 GroupPositionZ float,
29 VelocityX float,
30 VelocityY float,
31 VelocityZ float,
32 AngularVelocityX float,
33 AngularVelocityY float,
34 AngularVelocityZ float,
35 AccelerationX float,
36 AccelerationY float,
37 AccelerationZ float,
38 RotationX float,
39 RotationY float,
40 RotationZ float,
41 RotationW float,
42 ObjectFlags integer,
43 SitTargetOffsetX float NOT NULL default 0,
44 SitTargetOffsetY float NOT NULL default 0,
45 SitTargetOffsetZ float NOT NULL default 0,
46 SitTargetOrientW float NOT NULL default 0,
47 SitTargetOrientX float NOT NULL default 0,
48 SitTargetOrientY float NOT NULL default 0,
49 SitTargetOrientZ float NOT NULL default 0);
50
51CREATE TABLE primshapes(
52 UUID varchar(255) primary key,
53 Shape integer,
54 ScaleX float,
55 ScaleY float,
56 ScaleZ float,
57 PCode integer,
58 PathBegin integer,
59 PathEnd integer,
60 PathScaleX integer,
61 PathScaleY integer,
62 PathShearX integer,
63 PathShearY integer,
64 PathSkew integer,
65 PathCurve integer,
66 PathRadiusOffset integer,
67 PathRevolutions integer,
68 PathTaperX integer,
69 PathTaperY integer,
70 PathTwist integer,
71 PathTwistBegin integer,
72 ProfileBegin integer,
73 ProfileEnd integer,
74 ProfileCurve integer,
75 ProfileHollow integer,
76 Texture blob,
77 ExtraParams blob,
78 State Integer NOT NULL default 0);
79
80CREATE TABLE primitems(
81 itemID varchar(255) primary key,
82 primID varchar(255),
83 assetID varchar(255),
84 parentFolderID varchar(255),
85 invType integer,
86 assetType integer,
87 name varchar(255),
88 description varchar(255),
89 creationDate integer,
90 creatorID varchar(255),
91 ownerID varchar(255),
92 lastOwnerID varchar(255),
93 groupID varchar(255),
94 nextPermissions string,
95 currentPermissions string,
96 basePermissions string,
97 everyonePermissions string,
98 groupPermissions string);
99
100CREATE TABLE terrain(
101 RegionUUID varchar(255),
102 Revision integer,
103 Heightfield blob);
104
105CREATE TABLE land(
106 UUID varchar(255) primary key,
107 RegionUUID varchar(255),
108 LocalLandID string,
109 Bitmap blob,
110 Name varchar(255),
111 Desc varchar(255),
112 OwnerUUID varchar(255),
113 IsGroupOwned string,
114 Area integer,
115 AuctionID integer,
116 Category integer,
117 ClaimDate integer,
118 ClaimPrice integer,
119 GroupUUID varchar(255),
120 SalePrice integer,
121 LandStatus integer,
122 LandFlags string,
123 LandingType string,
124 MediaAutoScale string,
125 MediaTextureUUID varchar(255),
126 MediaURL varchar(255),
127 MusicURL varchar(255),
128 PassHours float,
129 PassPrice string,
130 SnapshotUUID varchar(255),
131 UserLocationX float,
132 UserLocationY float,
133 UserLocationZ float,
134 UserLookAtX float,
135 UserLookAtY float,
136 UserLookAtZ float,
137 AuthbuyerID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000');
138
139CREATE TABLE landaccesslist(
140 LandUUID varchar(255),
141 AccessUUID varchar(255),
142 Flags string);
143
144COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_UserAccount.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_UserAccount.sql
deleted file mode 100644
index c38d9a7..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_UserAccount.sql
+++ /dev/null
@@ -1,17 +0,0 @@
1BEGIN TRANSACTION;
2
3-- useraccounts table
4CREATE TABLE UserAccounts (
5 PrincipalID CHAR(36) primary key,
6 ScopeID CHAR(36) NOT NULL,
7 FirstName VARCHAR(64) NOT NULL,
8 LastName VARCHAR(64) NOT NULL,
9 Email VARCHAR(64),
10 ServiceURLs TEXT,
11 Created INT(11),
12 UserLevel integer NOT NULL DEFAULT 0,
13 UserFlags integer NOT NULL DEFAULT 0,
14 UserTitle varchar(64) NOT NULL DEFAULT ''
15);
16
17COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/001_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/001_UserStore.sql
deleted file mode 100644
index b584594..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/001_UserStore.sql
+++ /dev/null
@@ -1,39 +0,0 @@
1BEGIN TRANSACTION;
2
3-- users table
4CREATE TABLE users(
5 UUID varchar(255) primary key,
6 username varchar(255),
7 surname varchar(255),
8 passwordHash varchar(255),
9 passwordSalt varchar(255),
10 homeRegionX integer,
11 homeRegionY integer,
12 homeLocationX float,
13 homeLocationY float,
14 homeLocationZ float,
15 homeLookAtX float,
16 homeLookAtY float,
17 homeLookAtZ float,
18 created integer,
19 lastLogin integer,
20 rootInventoryFolderID varchar(255),
21 userInventoryURI varchar(255),
22 userAssetURI varchar(255),
23 profileCanDoMask integer,
24 profileWantDoMask integer,
25 profileAboutText varchar(255),
26 profileFirstText varchar(255),
27 profileImage varchar(255),
28 profileFirstImage varchar(255),
29 webLoginKey text default '00000000-0000-0000-0000-000000000000');
30-- friends table
31CREATE TABLE userfriends(
32 ownerID varchar(255),
33 friendID varchar(255),
34 friendPerms integer,
35 ownerPerms integer,
36 datetimestamp integer);
37
38COMMIT;
39
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_AssetStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_AssetStore.sql
deleted file mode 100644
index 5339b84..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_AssetStore.sql
+++ /dev/null
@@ -1,10 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TEMPORARY TABLE assets_backup(UUID,Name,Description,Type,Local,Temporary,Data);
4INSERT INTO assets_backup SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets;
5DROP TABLE assets;
6CREATE TABLE assets(UUID,Name,Description,Type,Local,Temporary,Data);
7INSERT INTO assets SELECT UUID,Name,Description,Type,Local,Temporary,Data FROM assets_backup;
8DROP TABLE assets_backup;
9
10COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_AuthStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_AuthStore.sql
deleted file mode 100644
index 3237b68..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_AuthStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN TRANSACTION;
2
3INSERT INTO auth (UUID, passwordHash, passwordSalt, webLoginKey) SELECT `UUID` AS UUID, `passwordHash` AS passwordHash, `passwordSalt` AS passwordSalt, `webLoginKey` AS webLoginKey FROM users;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_FriendsStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_FriendsStore.sql
deleted file mode 100644
index 6733502..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_FriendsStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN TRANSACTION;
2
3INSERT INTO `Friends` SELECT `ownerID`, `friendID`, `friendPerms`, 0 FROM `userfriends`;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_InventoryStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_InventoryStore.sql
deleted file mode 100644
index 01951d6..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_InventoryStore.sql
+++ /dev/null
@@ -1,8 +0,0 @@
1BEGIN TRANSACTION;
2
3create index inventoryfolders_agentid on inventoryfolders(agentid);
4create index inventoryfolders_parentid on inventoryfolders(parentid);
5create index inventoryitems_parentfolderid on inventoryitems(parentfolderid);
6create index inventoryitems_avatarid on inventoryitems(avatarid);
7
8COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_RegionStore.sql
deleted file mode 100644
index c5c7c99..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_RegionStore.sql
+++ /dev/null
@@ -1,10 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE regionban(
4 regionUUID varchar (255),
5 bannedUUID varchar (255),
6 bannedIp varchar (255),
7 bannedIpHostMask varchar (255)
8 );
9
10COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_UserAccount.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_UserAccount.sql
deleted file mode 100644
index c7a6293..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_UserAccount.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN TRANSACTION;
2
3INSERT INTO UserAccounts (PrincipalID, ScopeID, FirstName, LastName, Email, ServiceURLs, Created) SELECT `UUID` AS PrincipalID, '00000000-0000-0000-0000-000000000000' AS ScopeID, username AS FirstName, surname AS LastName, '' as Email, '' AS ServiceURLs, created as Created FROM users;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/002_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/002_UserStore.sql
deleted file mode 100644
index 48fc680..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/002_UserStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3ALTER TABLE users add homeRegionID varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/003_AssetStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/003_AssetStore.sql
deleted file mode 100644
index f54f8d9..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/003_AssetStore.sql
+++ /dev/null
@@ -1 +0,0 @@
1DELETE FROM assets WHERE UUID = 'dc4b9f0bd00845c696a401dd947ac621'
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/003_InventoryStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/003_InventoryStore.sql
deleted file mode 100644
index 4c6da91..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/003_InventoryStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3alter table inventoryitems add column inventoryGroupPermissions integer unsigned not null default 0;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/003_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/003_RegionStore.sql
deleted file mode 100644
index 4db2f75..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/003_RegionStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3ALTER TABLE primitems add flags integer not null default 0;
4
5COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/003_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/003_UserStore.sql
deleted file mode 100644
index 6f890ee..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/003_UserStore.sql
+++ /dev/null
@@ -1,6 +0,0 @@
1BEGIN;
2
3ALTER TABLE users add userFlags integer NOT NULL default 0;
4ALTER TABLE users add godLevel integer NOT NULL default 0;
5
6COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/004_AssetStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/004_AssetStore.sql
deleted file mode 100644
index 39421c4..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/004_AssetStore.sql
+++ /dev/null
@@ -1,7 +0,0 @@
1BEGIN;
2
3update assets
4 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
5 where UUID not like '%-%';
6
7COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/004_InventoryStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/004_InventoryStore.sql
deleted file mode 100644
index e8f4d46..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/004_InventoryStore.sql
+++ /dev/null
@@ -1,36 +0,0 @@
1BEGIN;
2
3update inventoryitems
4 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
5 where UUID not like '%-%';
6
7update inventoryitems
8 set assetID = substr(assetID, 1, 8) || "-" || substr(assetID, 9, 4) || "-" || substr(assetID, 13, 4) || "-" || substr(assetID, 17, 4) || "-" || substr(assetID, 21, 12)
9 where assetID not like '%-%';
10
11update inventoryitems
12 set parentFolderID = substr(parentFolderID, 1, 8) || "-" || substr(parentFolderID, 9, 4) || "-" || substr(parentFolderID, 13, 4) || "-" || substr(parentFolderID, 17, 4) || "-" || substr(parentFolderID, 21, 12)
13 where parentFolderID not like '%-%';
14
15update inventoryitems
16 set avatarID = substr(avatarID, 1, 8) || "-" || substr(avatarID, 9, 4) || "-" || substr(avatarID, 13, 4) || "-" || substr(avatarID, 17, 4) || "-" || substr(avatarID, 21, 12)
17 where avatarID not like '%-%';
18
19update inventoryitems
20 set creatorsID = substr(creatorsID, 1, 8) || "-" || substr(creatorsID, 9, 4) || "-" || substr(creatorsID, 13, 4) || "-" || substr(creatorsID, 17, 4) || "-" || substr(creatorsID, 21, 12)
21 where creatorsID not like '%-%';
22
23
24update inventoryfolders
25 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
26 where UUID not like '%-%';
27
28update inventoryfolders
29 set agentID = substr(agentID, 1, 8) || "-" || substr(agentID, 9, 4) || "-" || substr(agentID, 13, 4) || "-" || substr(agentID, 17, 4) || "-" || substr(agentID, 21, 12)
30 where agentID not like '%-%';
31
32update inventoryfolders
33 set parentID = substr(parentID, 1, 8) || "-" || substr(parentID, 9, 4) || "-" || substr(parentID, 13, 4) || "-" || substr(parentID, 17, 4) || "-" || substr(parentID, 21, 12)
34 where parentID not like '%-%';
35
36COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/004_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/004_RegionStore.sql
deleted file mode 100644
index de328cb..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/004_RegionStore.sql
+++ /dev/null
@@ -1,38 +0,0 @@
1BEGIN;
2
3create table regionsettings (
4 regionUUID char(36) not null,
5 block_terraform integer not null,
6 block_fly integer not null,
7 allow_damage integer not null,
8 restrict_pushing integer not null,
9 allow_land_resell integer not null,
10 allow_land_join_divide integer not null,
11 block_show_in_search integer not null,
12 agent_limit integer not null,
13 object_bonus float not null,
14 maturity integer not null,
15 disable_scripts integer not null,
16 disable_collisions integer not null,
17 disable_physics integer not null,
18 terrain_texture_1 char(36) not null,
19 terrain_texture_2 char(36) not null,
20 terrain_texture_3 char(36) not null,
21 terrain_texture_4 char(36) not null,
22 elevation_1_nw float not null,
23 elevation_2_nw float not null,
24 elevation_1_ne float not null,
25 elevation_2_ne float not null,
26 elevation_1_se float not null,
27 elevation_2_se float not null,
28 elevation_1_sw float not null,
29 elevation_2_sw float not null,
30 water_height float not null,
31 terrain_raise_limit float not null,
32 terrain_lower_limit float not null,
33 use_estate_sun integer not null,
34 fixed_sun integer not null,
35 sun_position float not null,
36 covenant char(36));
37
38COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/004_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/004_UserStore.sql
deleted file mode 100644
index 03142af..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/004_UserStore.sql
+++ /dev/null
@@ -1,6 +0,0 @@
1BEGIN;
2
3ALTER TABLE users add customType varchar(32) not null default '';
4ALTER TABLE users add partner char(36) not null default '00000000-0000-0000-0000-000000000000';
5
6COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/005_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/005_RegionStore.sql
deleted file mode 100644
index 1f6d1bd..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/005_RegionStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3delete from regionsettings;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/005_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/005_UserStore.sql
deleted file mode 100644
index e45c09a..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/005_UserStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3CREATE TABLE `avatarattachments` (`UUID` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `attachpoint` int(11) NOT NULL DEFAULT 0, `item` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', `asset` char(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000');
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/006_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/006_RegionStore.sql
deleted file mode 100644
index 94ed818..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/006_RegionStore.sql
+++ /dev/null
@@ -1,102 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE estate_groups (
4 EstateID int(10) NOT NULL,
5 uuid char(36) NOT NULL
6);
7
8CREATE TABLE estate_managers (
9 EstateID int(10) NOT NULL,
10 uuid char(36) NOT NULL
11);
12
13CREATE TABLE estate_map (
14 RegionID char(36) NOT NULL default '00000000-0000-0000-0000-000000000000',
15 EstateID int(11) NOT NULL
16);
17
18CREATE TABLE estate_settings (
19 EstateID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
20 EstateName varchar(64) default NULL,
21 AbuseEmailToEstateOwner tinyint(4) NOT NULL,
22 DenyAnonymous tinyint(4) NOT NULL,
23 ResetHomeOnTeleport tinyint(4) NOT NULL,
24 FixedSun tinyint(4) NOT NULL,
25 DenyTransacted tinyint(4) NOT NULL,
26 BlockDwell tinyint(4) NOT NULL,
27 DenyIdentified tinyint(4) NOT NULL,
28 AllowVoice tinyint(4) NOT NULL,
29 UseGlobalTime tinyint(4) NOT NULL,
30 PricePerMeter int(11) NOT NULL,
31 TaxFree tinyint(4) NOT NULL,
32 AllowDirectTeleport tinyint(4) NOT NULL,
33 RedirectGridX int(11) NOT NULL,
34 RedirectGridY int(11) NOT NULL,
35 ParentEstateID int(10) NOT NULL,
36 SunPosition double NOT NULL,
37 EstateSkipScripts tinyint(4) NOT NULL,
38 BillableFactor float NOT NULL,
39 PublicAccess tinyint(4) NOT NULL
40);
41insert into estate_settings (EstateID,EstateName,AbuseEmailToEstateOwner,DenyAnonymous,ResetHomeOnTeleport,FixedSun,DenyTransacted,BlockDwell,DenyIdentified,AllowVoice,UseGlobalTime,PricePerMeter,TaxFree,AllowDirectTeleport,RedirectGridX,RedirectGridY,ParentEstateID,SunPosition,PublicAccess,EstateSkipScripts,BillableFactor) values ( 99, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
42delete from estate_settings;
43CREATE TABLE estate_users (
44 EstateID int(10) NOT NULL,
45 uuid char(36) NOT NULL
46);
47
48CREATE TABLE estateban (
49 EstateID int(10) NOT NULL,
50 bannedUUID varchar(36) NOT NULL,
51 bannedIp varchar(16) NOT NULL,
52 bannedIpHostMask varchar(16) NOT NULL,
53 bannedNameMask varchar(64) default NULL
54);
55
56drop table regionsettings;
57CREATE TABLE regionsettings (
58 regionUUID char(36) NOT NULL,
59 block_terraform int(11) NOT NULL,
60 block_fly int(11) NOT NULL,
61 allow_damage int(11) NOT NULL,
62 restrict_pushing int(11) NOT NULL,
63 allow_land_resell int(11) NOT NULL,
64 allow_land_join_divide int(11) NOT NULL,
65 block_show_in_search int(11) NOT NULL,
66 agent_limit int(11) NOT NULL,
67 object_bonus float NOT NULL,
68 maturity int(11) NOT NULL,
69 disable_scripts int(11) NOT NULL,
70 disable_collisions int(11) NOT NULL,
71 disable_physics int(11) NOT NULL,
72 terrain_texture_1 char(36) NOT NULL,
73 terrain_texture_2 char(36) NOT NULL,
74 terrain_texture_3 char(36) NOT NULL,
75 terrain_texture_4 char(36) NOT NULL,
76 elevation_1_nw float NOT NULL,
77 elevation_2_nw float NOT NULL,
78 elevation_1_ne float NOT NULL,
79 elevation_2_ne float NOT NULL,
80 elevation_1_se float NOT NULL,
81 elevation_2_se float NOT NULL,
82 elevation_1_sw float NOT NULL,
83 elevation_2_sw float NOT NULL,
84 water_height float NOT NULL,
85 terrain_raise_limit float NOT NULL,
86 terrain_lower_limit float NOT NULL,
87 use_estate_sun int(11) NOT NULL,
88 fixed_sun int(11) NOT NULL,
89 sun_position float NOT NULL,
90 covenant char(36) default NULL,
91 Sandbox tinyint(4) NOT NULL,
92 PRIMARY KEY (regionUUID)
93);
94
95CREATE INDEX estate_ban_estate_id on estateban(EstateID);
96CREATE INDEX estate_groups_estate_id on estate_groups(EstateID);
97CREATE INDEX estate_managers_estate_id on estate_managers(EstateID);
98CREATE INDEX estate_map_estate_id on estate_map(EstateID);
99CREATE UNIQUE INDEX estate_map_region_id on estate_map(RegionID);
100CREATE INDEX estate_users_estate_id on estate_users(EstateID);
101
102COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/006_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/006_UserStore.sql
deleted file mode 100644
index f9454c5..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/006_UserStore.sql
+++ /dev/null
@@ -1,20 +0,0 @@
1BEGIN TRANSACTION;
2
3-- usersagents table
4CREATE TABLE IF NOT EXISTS useragents(
5 UUID varchar(255) primary key,
6 agentIP varchar(255),
7 agentPort integer,
8 agentOnline boolean,
9 sessionID varchar(255),
10 secureSessionID varchar(255),
11 regionID varchar(255),
12 loginTime integer,
13 logoutTime integer,
14 currentRegion varchar(255),
15 currentHandle varchar(255),
16 currentPosX float,
17 currentPosY float,
18 currentPosZ float);
19
20COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/007_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/007_RegionStore.sql
deleted file mode 100644
index 1c813a0..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/007_RegionStore.sql
+++ /dev/null
@@ -1,8 +0,0 @@
1begin;
2
3alter table estate_settings add column AbuseEmail varchar(255) not null default '';
4
5alter table estate_settings add column EstateOwner varchar(36) not null default '';
6
7commit;
8
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/007_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/007_UserStore.sql
deleted file mode 100644
index 8b0cd28..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/007_UserStore.sql
+++ /dev/null
@@ -1,7 +0,0 @@
1BEGIN TRANSACTION;
2
3ALTER TABLE useragents add currentLookAtX float not null default 128;
4ALTER TABLE useragents add currentLookAtY float not null default 128;
5ALTER TABLE useragents add currentLookAtZ float not null default 70;
6
7COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/008_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/008_RegionStore.sql
deleted file mode 100644
index 28bfbf5..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/008_RegionStore.sql
+++ /dev/null
@@ -1,6 +0,0 @@
1begin;
2
3alter table estate_settings add column DenyMinors tinyint not null default 0;
4
5commit;
6
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/008_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/008_UserStore.sql
deleted file mode 100644
index 97da818..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/008_UserStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN TRANSACTION;
2
3ALTER TABLE users add email varchar(250);
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/009_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/009_RegionStore.sql
deleted file mode 100644
index 1f40548..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/009_RegionStore.sql
+++ /dev/null
@@ -1,8 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN ColorR integer not null default 0;
4ALTER TABLE prims ADD COLUMN ColorG integer not null default 0;
5ALTER TABLE prims ADD COLUMN ColorB integer not null default 0;
6ALTER TABLE prims ADD COLUMN ColorA integer not null default 0;
7
8COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/009_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/009_UserStore.sql
deleted file mode 100644
index 8ab03ef..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/009_UserStore.sql
+++ /dev/null
@@ -1,11 +0,0 @@
1BEGIN;
2
3update users
4 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
5 where UUID not like '%-%';
6
7update useragents
8 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
9 where UUID not like '%-%';
10
11COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/010_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/010_RegionStore.sql
deleted file mode 100644
index b91ccf0..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/010_RegionStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN ClickAction INTEGER NOT NULL default 0;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/010_UserStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/010_UserStore.sql
deleted file mode 100644
index 5f956da..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/010_UserStore.sql
+++ /dev/null
@@ -1,37 +0,0 @@
1BEGIN TRANSACTION;
2
3CREATE TABLE IF NOT EXISTS avatarappearance(
4 Owner varchar(36) NOT NULL primary key,
5 BodyItem varchar(36) DEFAULT NULL,
6 BodyAsset varchar(36) DEFAULT NULL,
7 SkinItem varchar(36) DEFAULT NULL,
8 SkinAsset varchar(36) DEFAULT NULL,
9 HairItem varchar(36) DEFAULT NULL,
10 HairAsset varchar(36) DEFAULT NULL,
11 EyesItem varchar(36) DEFAULT NULL,
12 EyesAsset varchar(36) DEFAULT NULL,
13 ShirtItem varchar(36) DEFAULT NULL,
14 ShirtAsset varchar(36) DEFAULT NULL,
15 PantsItem varchar(36) DEFAULT NULL,
16 PantsAsset varchar(36) DEFAULT NULL,
17 ShoesItem varchar(36) DEFAULT NULL,
18 ShoesAsset varchar(36) DEFAULT NULL,
19 SocksItem varchar(36) DEFAULT NULL,
20 SocksAsset varchar(36) DEFAULT NULL,
21 JacketItem varchar(36) DEFAULT NULL,
22 JacketAsset varchar(36) DEFAULT NULL,
23 GlovesItem varchar(36) DEFAULT NULL,
24 GlovesAsset varchar(36) DEFAULT NULL,
25 UnderShirtItem varchar(36) DEFAULT NULL,
26 UnderShirtAsset varchar(36) DEFAULT NULL,
27 UnderPantsItem varchar(36) DEFAULT NULL,
28 UnderPantsAsset varchar(36) DEFAULT NULL,
29 SkirtItem varchar(36) DEFAULT NULL,
30 SkirtAsset varchar(36) DEFAULT NULL,
31 Texture blob,
32 VisualParams blob,
33 Serial int DEFAULT NULL,
34 AvatarHeight float DEFAULT NULL
35);
36
37COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/011_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/011_RegionStore.sql
deleted file mode 100644
index 42bef89..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/011_RegionStore.sql
+++ /dev/null
@@ -1,28 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN PayPrice INTEGER NOT NULL default 0;
4ALTER TABLE prims ADD COLUMN PayButton1 INTEGER NOT NULL default 0;
5ALTER TABLE prims ADD COLUMN PayButton2 INTEGER NOT NULL default 0;
6ALTER TABLE prims ADD COLUMN PayButton3 INTEGER NOT NULL default 0;
7ALTER TABLE prims ADD COLUMN PayButton4 INTEGER NOT NULL default 0;
8ALTER TABLE prims ADD COLUMN LoopedSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
9ALTER TABLE prims ADD COLUMN LoopedSoundGain float NOT NULL default 0;
10ALTER TABLE prims ADD COLUMN TextureAnimation string;
11ALTER TABLE prims ADD COLUMN ParticleSystem string;
12ALTER TABLE prims ADD COLUMN OmegaX float NOT NULL default 0;
13ALTER TABLE prims ADD COLUMN OmegaY float NOT NULL default 0;
14ALTER TABLE prims ADD COLUMN OmegaZ float NOT NULL default 0;
15ALTER TABLE prims ADD COLUMN CameraEyeOffsetX float NOT NULL default 0;
16ALTER TABLE prims ADD COLUMN CameraEyeOffsetY float NOT NULL default 0;
17ALTER TABLE prims ADD COLUMN CameraEyeOffsetZ float NOT NULL default 0;
18ALTER TABLE prims ADD COLUMN CameraAtOffsetX float NOT NULL default 0;
19ALTER TABLE prims ADD COLUMN CameraAtOffsetY float NOT NULL default 0;
20ALTER TABLE prims ADD COLUMN CameraAtOffsetZ float NOT NULL default 0;
21ALTER TABLE prims ADD COLUMN ForceMouselook string NOT NULL default 0;
22ALTER TABLE prims ADD COLUMN ScriptAccessPin INTEGER NOT NULL default 0;
23ALTER TABLE prims ADD COLUMN AllowedDrop INTEGER NOT NULL default 0;
24ALTER TABLE prims ADD COLUMN DieAtEdge string NOT NULL default 0;
25ALTER TABLE prims ADD COLUMN SalePrice INTEGER NOT NULL default 0;
26ALTER TABLE prims ADD COLUMN SaleType string NOT NULL default 0;
27
28COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/012_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/012_RegionStore.sql
deleted file mode 100644
index d952b78..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/012_RegionStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN Material INTEGER NOT NULL default 3;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/013_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/013_RegionStore.sql
deleted file mode 100644
index 11529cd..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/013_RegionStore.sql
+++ /dev/null
@@ -1,6 +0,0 @@
1BEGIN;
2
3ALTER TABLE land ADD COLUMN OtherCleanTime INTEGER NOT NULL default 0;
4ALTER TABLE land ADD COLUMN Dwell INTEGER NOT NULL default 0;
5
6COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/014_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/014_RegionStore.sql
deleted file mode 100644
index c59b27e..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/014_RegionStore.sql
+++ /dev/null
@@ -1,8 +0,0 @@
1begin;
2
3ALTER TABLE regionsettings ADD COLUMN sunvectorx double NOT NULL default 0;
4ALTER TABLE regionsettings ADD COLUMN sunvectory double NOT NULL default 0;
5ALTER TABLE regionsettings ADD COLUMN sunvectorz double NOT NULL default 0;
6
7commit;
8
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/015_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/015_RegionStore.sql
deleted file mode 100644
index c43f356..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/015_RegionStore.sql
+++ /dev/null
@@ -1,6 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN CollisionSound varchar(36) NOT NULL default '00000000-0000-0000-0000-000000000000';
4ALTER TABLE prims ADD COLUMN CollisionSoundVolume float NOT NULL default 0;
5
6COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/016_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/016_RegionStore.sql
deleted file mode 100644
index 52f160c..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/016_RegionStore.sql
+++ /dev/null
@@ -1,5 +0,0 @@
1BEGIN;
2
3ALTER TABLE prims ADD COLUMN VolumeDetect INTEGER NOT NULL DEFAULT 0;
4
5COMMIT;
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/017_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/017_RegionStore.sql
deleted file mode 100644
index 6c6b7b5..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/017_RegionStore.sql
+++ /dev/null
@@ -1,8 +0,0 @@
1BEGIN;
2CREATE TEMPORARY TABLE prims_backup(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect);
3INSERT INTO prims_backup SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims;
4DROP TABLE prims;
5CREATE TABLE prims(UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect);
6INSERT INTO prims SELECT UUID,RegionUUID,CreationDate,Name,SceneGroupID,Text,Description,SitName,TouchName,CreatorID,OwnerID,GroupID,LastOwnerID,OwnerMask,NextOwnerMask,GroupMask,EveryoneMask,BaseMask,PositionX,PositionY,PositionZ,GroupPositionX,GroupPositionY,GroupPositionZ,VelocityX,VelocityY,VelocityZ,AngularVelocityX,AngularVelocityY,AngularVelocityZ,AccelerationX,AccelerationY,AccelerationZ,RotationX,RotationY,RotationZ,RotationW,ObjectFlags,SitTargetOffsetX,SitTargetOffsetY,SitTargetOffsetZ,SitTargetOrientW,SitTargetOrientX,SitTargetOrientY,SitTargetOrientZ,ColorR,ColorG,ColorB,ColorA,ClickAction,PayPrice,PayButton1,PayButton2,PayButton3,PayButton4,LoopedSound,LoopedSoundGain,TextureAnimation,ParticleSystem,OmegaX,OmegaY,OmegaZ,CameraEyeOffsetX,CameraEyeOffsetY,CameraEyeOffsetZ,CameraAtOffsetX,CameraAtOffsetY,CameraAtOffsetZ,ForceMouselook,ScriptAccessPin,AllowedDrop,DieAtEdge,SalePrice,SaleType,Material,CollisionSound,CollisionSoundVolume,VolumeDetect FROM prims_backup;
7DROP TABLE prims_backup;
8COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/018_RegionStore.sql b/OpenSim/Data/SQLiteLegacy/Resources/018_RegionStore.sql
deleted file mode 100644
index 6a390c2..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/018_RegionStore.sql
+++ /dev/null
@@ -1,79 +0,0 @@
1BEGIN;
2
3update terrain
4 set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
5 where RegionUUID not like '%-%';
6
7
8update landaccesslist
9 set LandUUID = substr(LandUUID, 1, 8) || "-" || substr(LandUUID, 9, 4) || "-" || substr(LandUUID, 13, 4) || "-" || substr(LandUUID, 17, 4) || "-" || substr(LandUUID, 21, 12)
10 where LandUUID not like '%-%';
11
12update landaccesslist
13 set AccessUUID = substr(AccessUUID, 1, 8) || "-" || substr(AccessUUID, 9, 4) || "-" || substr(AccessUUID, 13, 4) || "-" || substr(AccessUUID, 17, 4) || "-" || substr(AccessUUID, 21, 12)
14 where AccessUUID not like '%-%';
15
16
17update prims
18 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
19 where UUID not like '%-%';
20
21update prims
22 set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
23 where RegionUUID not like '%-%';
24
25update prims
26 set SceneGroupID = substr(SceneGroupID, 1, 8) || "-" || substr(SceneGroupID, 9, 4) || "-" || substr(SceneGroupID, 13, 4) || "-" || substr(SceneGroupID, 17, 4) || "-" || substr(SceneGroupID, 21, 12)
27 where SceneGroupID not like '%-%';
28
29update prims
30 set CreatorID = substr(CreatorID, 1, 8) || "-" || substr(CreatorID, 9, 4) || "-" || substr(CreatorID, 13, 4) || "-" || substr(CreatorID, 17, 4) || "-" || substr(CreatorID, 21, 12)
31 where CreatorID not like '%-%';
32
33update prims
34 set OwnerID = substr(OwnerID, 1, 8) || "-" || substr(OwnerID, 9, 4) || "-" || substr(OwnerID, 13, 4) || "-" || substr(OwnerID, 17, 4) || "-" || substr(OwnerID, 21, 12)
35 where OwnerID not like '%-%';
36
37update prims
38 set GroupID = substr(GroupID, 1, 8) || "-" || substr(GroupID, 9, 4) || "-" || substr(GroupID, 13, 4) || "-" || substr(GroupID, 17, 4) || "-" || substr(GroupID, 21, 12)
39 where GroupID not like '%-%';
40
41update prims
42 set LastOwnerID = substr(LastOwnerID, 1, 8) || "-" || substr(LastOwnerID, 9, 4) || "-" || substr(LastOwnerID, 13, 4) || "-" || substr(LastOwnerID, 17, 4) || "-" || substr(LastOwnerID, 21, 12)
43 where LastOwnerID not like '%-%';
44
45
46update primshapes
47 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
48 where UUID not like '%-%';
49
50
51update land
52 set UUID = substr(UUID, 1, 8) || "-" || substr(UUID, 9, 4) || "-" || substr(UUID, 13, 4) || "-" || substr(UUID, 17, 4) || "-" || substr(UUID, 21, 12)
53 where UUID not like '%-%';
54
55update land
56 set RegionUUID = substr(RegionUUID, 1, 8) || "-" || substr(RegionUUID, 9, 4) || "-" || substr(RegionUUID, 13, 4) || "-" || substr(RegionUUID, 17, 4) || "-" || substr(RegionUUID, 21, 12)
57 where RegionUUID not like '%-%';
58
59update land
60 set OwnerUUID = substr(OwnerUUID, 1, 8) || "-" || substr(OwnerUUID, 9, 4) || "-" || substr(OwnerUUID, 13, 4) || "-" || substr(OwnerUUID, 17, 4) || "-" || substr(OwnerUUID, 21, 12)
61 where OwnerUUID not like '%-%';
62
63update land
64 set GroupUUID = substr(GroupUUID, 1, 8) || "-" || substr(GroupUUID, 9, 4) || "-" || substr(GroupUUID, 13, 4) || "-" || substr(GroupUUID, 17, 4) || "-" || substr(GroupUUID, 21, 12)
65 where GroupUUID not like '%-%';
66
67update land
68 set MediaTextureUUID = substr(MediaTextureUUID, 1, 8) || "-" || substr(MediaTextureUUID, 9, 4) || "-" || substr(MediaTextureUUID, 13, 4) || "-" || substr(MediaTextureUUID, 17, 4) || "-" || substr(MediaTextureUUID, 21, 12)
69 where MediaTextureUUID not like '%-%';
70
71update land
72 set SnapshotUUID = substr(SnapshotUUID, 1, 8) || "-" || substr(SnapshotUUID, 9, 4) || "-" || substr(SnapshotUUID, 13, 4) || "-" || substr(SnapshotUUID, 17, 4) || "-" || substr(SnapshotUUID, 21, 12)
73 where SnapshotUUID not like '%-%';
74
75update land
76 set AuthbuyerID = substr(AuthbuyerID, 1, 8) || "-" || substr(AuthbuyerID, 9, 4) || "-" || substr(AuthbuyerID, 13, 4) || "-" || substr(AuthbuyerID, 17, 4) || "-" || substr(AuthbuyerID, 21, 12)
77 where AuthbuyerID not like '%-%';
78
79COMMIT; \ No newline at end of file
diff --git a/OpenSim/Data/SQLiteLegacy/Resources/OpenSim.Data.SQLite.addin.xml b/OpenSim/Data/SQLiteLegacy/Resources/OpenSim.Data.SQLite.addin.xml
deleted file mode 100644
index e6764fa..0000000
--- a/OpenSim/Data/SQLiteLegacy/Resources/OpenSim.Data.SQLite.addin.xml
+++ /dev/null
@@ -1,20 +0,0 @@
1<Addin id="OpenSim.Data.SQLite" version="0.1">
2 <Runtime>
3 <Import assembly="OpenSim.Data.SQLite.dll"/>
4 </Runtime>
5 <Dependencies>
6 <Addin id="OpenSim.Data" version="0.5" />
7 </Dependencies>
8 <Extension path = "/OpenSim/GridData">
9 <Plugin id="SQLiteGridData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteGridData" />
10 </Extension>
11 <Extension path = "/OpenSim/AssetData">
12 <Plugin id="SQLiteAssetData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteAssetData" />
13 </Extension>
14 <Extension path = "/OpenSim/InventoryData">
15 <Plugin id="SQLiteInventoryData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteInventoryStore" />
16 </Extension>
17 <Extension path = "/OpenSim/UserData">
18 <Plugin id="SQLiteUserData" provider="OpenSim.Data.SQLite.dll" type="OpenSim.Data.SQLite.SQLiteUserData" />
19 </Extension>
20</Addin>
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteAssetData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteAssetData.cs
deleted file mode 100644
index 3da298b..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteAssetData.cs
+++ /dev/null
@@ -1,349 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Data;
30using System.Reflection;
31using System.Collections.Generic;
32using log4net;
33using Mono.Data.SqliteClient;
34using OpenMetaverse;
35using OpenSim.Framework;
36
37namespace OpenSim.Data.SQLiteLegacy
38{
39 /// <summary>
40 /// An asset storage interface for the SQLite database system
41 /// </summary>
42 public class SQLiteAssetData : AssetDataBase
43 {
44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 private const string SelectAssetSQL = "select * from assets where UUID=:UUID";
47 private const string SelectAssetMetadataSQL = "select Name, Description, Type, Temporary, UUID from assets limit :start, :count";
48 private const string DeleteAssetSQL = "delete from assets where UUID=:UUID";
49 private const string InsertAssetSQL = "insert into assets(UUID, Name, Description, Type, Local, Temporary, Data) values(:UUID, :Name, :Description, :Type, :Local, :Temporary, :Data)";
50 private const string UpdateAssetSQL = "update assets set Name=:Name, Description=:Description, Type=:Type, Local=:Local, Temporary=:Temporary, Data=:Data where UUID=:UUID";
51 private const string assetSelect = "select * from assets";
52
53 private SqliteConnection m_conn;
54
55 override public void Dispose()
56 {
57 if (m_conn != null)
58 {
59 m_conn.Close();
60 m_conn = null;
61 }
62 }
63
64 /// <summary>
65 /// <list type="bullet">
66 /// <item>Initialises AssetData interface</item>
67 /// <item>Loads and initialises a new SQLite connection and maintains it.</item>
68 /// <item>use default URI if connect string is empty.</item>
69 /// </list>
70 /// </summary>
71 /// <param name="dbconnect">connect string</param>
72 override public void Initialise(string dbconnect)
73 {
74 if (dbconnect == string.Empty)
75 {
76 dbconnect = "URI=file:Asset.db,version=3";
77 }
78 m_conn = new SqliteConnection(dbconnect);
79 m_conn.Open();
80
81 Assembly assem = GetType().Assembly;
82 Migration m = new Migration(m_conn, assem, "AssetStore");
83 m.Update();
84
85 return;
86 }
87
88 /// <summary>
89 /// Fetch Asset
90 /// </summary>
91 /// <param name="uuid">UUID of ... ?</param>
92 /// <returns>Asset base</returns>
93 override public AssetBase GetAsset(UUID uuid)
94 {
95 lock (this)
96 {
97 using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn))
98 {
99 cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
100 using (IDataReader reader = cmd.ExecuteReader())
101 {
102 if (reader.Read())
103 {
104 AssetBase asset = buildAsset(reader);
105 reader.Close();
106 return asset;
107 }
108 else
109 {
110 reader.Close();
111 return null;
112 }
113 }
114 }
115 }
116 }
117
118 /// <summary>
119 /// Create an asset
120 /// </summary>
121 /// <param name="asset">Asset Base</param>
122 override public bool StoreAsset(AssetBase asset)
123 {
124 //m_log.Info("[ASSET DB]: Creating Asset " + asset.FullID.ToString());
125 if (ExistsAsset(asset.FullID))
126 {
127 //LogAssetLoad(asset);
128
129 lock (this)
130 {
131 using (SqliteCommand cmd = new SqliteCommand(UpdateAssetSQL, m_conn))
132 {
133 cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString()));
134 cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name));
135 cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description));
136 cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type));
137 cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local));
138 cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary));
139 cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data));
140
141 cmd.ExecuteNonQuery();
142 return true;
143 }
144 }
145 }
146 else
147 {
148 lock (this)
149 {
150 using (SqliteCommand cmd = new SqliteCommand(InsertAssetSQL, m_conn))
151 {
152 cmd.Parameters.Add(new SqliteParameter(":UUID", asset.FullID.ToString()));
153 cmd.Parameters.Add(new SqliteParameter(":Name", asset.Name));
154 cmd.Parameters.Add(new SqliteParameter(":Description", asset.Description));
155 cmd.Parameters.Add(new SqliteParameter(":Type", asset.Type));
156 cmd.Parameters.Add(new SqliteParameter(":Local", asset.Local));
157 cmd.Parameters.Add(new SqliteParameter(":Temporary", asset.Temporary));
158 cmd.Parameters.Add(new SqliteParameter(":Data", asset.Data));
159
160 cmd.ExecuteNonQuery();
161 return true;
162 }
163 }
164 }
165 }
166
167// /// <summary>
168// /// Some... logging functionnality
169// /// </summary>
170// /// <param name="asset"></param>
171// private static void LogAssetLoad(AssetBase asset)
172// {
173// string temporary = asset.Temporary ? "Temporary" : "Stored";
174// string local = asset.Local ? "Local" : "Remote";
175//
176// int assetLength = (asset.Data != null) ? asset.Data.Length : 0;
177//
178// m_log.Debug("[ASSET DB]: " +
179// string.Format("Loaded {5} {4} Asset: [{0}][{3}] \"{1}\":{2} ({6} bytes)",
180// asset.FullID, asset.Name, asset.Description, asset.Type,
181// temporary, local, assetLength));
182// }
183
184 /// <summary>
185 /// Check if an asset exist in database
186 /// </summary>
187 /// <param name="uuid">The asset UUID</param>
188 /// <returns>True if exist, or false.</returns>
189 override public bool ExistsAsset(UUID uuid)
190 {
191 lock (this) {
192 using (SqliteCommand cmd = new SqliteCommand(SelectAssetSQL, m_conn))
193 {
194 cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
195 using (IDataReader reader = cmd.ExecuteReader())
196 {
197 if (reader.Read())
198 {
199 reader.Close();
200 return true;
201 }
202 else
203 {
204 reader.Close();
205 return false;
206 }
207 }
208 }
209 }
210 }
211
212 /// <summary>
213 /// Delete an asset from database
214 /// </summary>
215 /// <param name="uuid"></param>
216 public void DeleteAsset(UUID uuid)
217 {
218 using (SqliteCommand cmd = new SqliteCommand(DeleteAssetSQL, m_conn))
219 {
220 cmd.Parameters.Add(new SqliteParameter(":UUID", uuid.ToString()));
221
222 cmd.ExecuteNonQuery();
223 }
224 }
225
226 /// <summary>
227 ///
228 /// </summary>
229 /// <param name="row"></param>
230 /// <returns></returns>
231 private static AssetBase buildAsset(IDataReader row)
232 {
233 // TODO: this doesn't work yet because something more
234 // interesting has to be done to actually get these values
235 // back out. Not enough time to figure it out yet.
236 AssetBase asset = new AssetBase(
237 new UUID((String)row["UUID"]),
238 (String)row["Name"],
239 Convert.ToSByte(row["Type"]),
240 UUID.Zero.ToString()
241 );
242
243 asset.Description = (String) row["Description"];
244 asset.Local = Convert.ToBoolean(row["Local"]);
245 asset.Temporary = Convert.ToBoolean(row["Temporary"]);
246 asset.Data = (byte[]) row["Data"];
247 return asset;
248 }
249
250 private static AssetMetadata buildAssetMetadata(IDataReader row)
251 {
252 AssetMetadata metadata = new AssetMetadata();
253
254 metadata.FullID = new UUID((string) row["UUID"]);
255 metadata.Name = (string) row["Name"];
256 metadata.Description = (string) row["Description"];
257 metadata.Type = Convert.ToSByte(row["Type"]);
258 metadata.Temporary = Convert.ToBoolean(row["Temporary"]); // Not sure if this is correct.
259
260 // Current SHA1s are not stored/computed.
261 metadata.SHA1 = new byte[] {};
262
263 return metadata;
264 }
265
266 /// <summary>
267 /// Returns a list of AssetMetadata objects. The list is a subset of
268 /// the entire data set offset by <paramref name="start" /> containing
269 /// <paramref name="count" /> elements.
270 /// </summary>
271 /// <param name="start">The number of results to discard from the total data set.</param>
272 /// <param name="count">The number of rows the returned list should contain.</param>
273 /// <returns>A list of AssetMetadata objects.</returns>
274 public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
275 {
276 List<AssetMetadata> retList = new List<AssetMetadata>(count);
277
278 lock (this)
279 {
280 using (SqliteCommand cmd = new SqliteCommand(SelectAssetMetadataSQL, m_conn))
281 {
282 cmd.Parameters.Add(new SqliteParameter(":start", start));
283 cmd.Parameters.Add(new SqliteParameter(":count", count));
284
285 using (IDataReader reader = cmd.ExecuteReader())
286 {
287 while (reader.Read())
288 {
289 AssetMetadata metadata = buildAssetMetadata(reader);
290 retList.Add(metadata);
291 }
292 }
293 }
294 }
295
296 return retList;
297 }
298
299 /***********************************************************************
300 *
301 * Database Binding functions
302 *
303 * These will be db specific due to typing, and minor differences
304 * in databases.
305 *
306 **********************************************************************/
307
308 #region IPlugin interface
309
310 /// <summary>
311 ///
312 /// </summary>
313 override public string Version
314 {
315 get
316 {
317 Module module = GetType().Module;
318 // string dllName = module.Assembly.ManifestModule.Name;
319 Version dllVersion = module.Assembly.GetName().Version;
320
321 return
322 string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
323 dllVersion.Revision);
324 }
325 }
326
327 /// <summary>
328 /// Initialise the AssetData interface using default URI
329 /// </summary>
330 override public void Initialise()
331 {
332 Initialise("URI=file:Asset.db,version=3");
333 }
334
335 /// <summary>
336 /// Name of this DB provider
337 /// </summary>
338 override public string Name
339 {
340 get { return "SQLite Asset storage engine"; }
341 }
342
343 public override bool Delete(string id)
344 {
345 return false;
346 }
347 #endregion
348 }
349}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteAuthenticationData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteAuthenticationData.cs
deleted file mode 100644
index 760221d..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteAuthenticationData.cs
+++ /dev/null
@@ -1,266 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using System.Reflection;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using Mono.Data.SqliteClient;
37
38namespace OpenSim.Data.SQLiteLegacy
39{
40 public class SQLiteAuthenticationData : SQLiteFramework, IAuthenticationData
41 {
42 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 private string m_Realm;
45 private List<string> m_ColumnNames;
46 private int m_LastExpire;
47 private string m_connectionString;
48
49 protected static SqliteConnection m_Connection;
50 private static bool m_initialized = false;
51
52 public SQLiteAuthenticationData(string connectionString, string realm)
53 : base(connectionString)
54 {
55 m_Realm = realm;
56 m_connectionString = connectionString;
57
58 if (!m_initialized)
59 {
60 m_Connection = new SqliteConnection(connectionString);
61 m_Connection.Open();
62
63 using (SqliteConnection dbcon = (SqliteConnection)((ICloneable)m_Connection).Clone())
64 {
65 dbcon.Open();
66 Migration m = new Migration(dbcon, GetType().Assembly, "AuthStore");
67 m.Update();
68 dbcon.Close();
69 }
70
71 m_initialized = true;
72 }
73 }
74
75 public AuthenticationData Get(UUID principalID)
76 {
77 AuthenticationData ret = new AuthenticationData();
78 ret.Data = new Dictionary<string, object>();
79
80 SqliteCommand cmd = new SqliteCommand("select * from `" + m_Realm + "` where UUID = :PrincipalID");
81 cmd.Parameters.Add(new SqliteParameter(":PrincipalID", principalID.ToString()));
82
83 IDataReader result = ExecuteReader(cmd, m_Connection);
84
85 try
86 {
87 if (result.Read())
88 {
89 ret.PrincipalID = principalID;
90
91 if (m_ColumnNames == null)
92 {
93 m_ColumnNames = new List<string>();
94
95 DataTable schemaTable = result.GetSchemaTable();
96 foreach (DataRow row in schemaTable.Rows)
97 m_ColumnNames.Add(row["ColumnName"].ToString());
98 }
99
100 foreach (string s in m_ColumnNames)
101 {
102 if (s == "UUID")
103 continue;
104
105 ret.Data[s] = result[s].ToString();
106 }
107
108 return ret;
109 }
110 else
111 {
112 return null;
113 }
114 }
115 catch
116 {
117 }
118 finally
119 {
120 CloseCommand(cmd);
121 }
122
123 return null;
124 }
125
126 public bool Store(AuthenticationData data)
127 {
128 if (data.Data.ContainsKey("UUID"))
129 data.Data.Remove("UUID");
130
131 string[] fields = new List<string>(data.Data.Keys).ToArray();
132 string[] values = new string[data.Data.Count];
133 int i = 0;
134 foreach (object o in data.Data.Values)
135 values[i++] = o.ToString();
136
137 SqliteCommand cmd = new SqliteCommand();
138
139 if (Get(data.PrincipalID) != null)
140 {
141
142
143 string update = "update `" + m_Realm + "` set ";
144 bool first = true;
145 foreach (string field in fields)
146 {
147 if (!first)
148 update += ", ";
149 update += "`" + field + "` = :" + field;
150 cmd.Parameters.Add(new SqliteParameter(":" + field, data.Data[field]));
151
152 first = false;
153 }
154
155 update += " where UUID = :UUID";
156 cmd.Parameters.Add(new SqliteParameter(":UUID", data.PrincipalID.ToString()));
157
158 cmd.CommandText = update;
159 try
160 {
161 if (ExecuteNonQuery(cmd, m_Connection) < 1)
162 {
163 CloseCommand(cmd);
164 return false;
165 }
166 }
167 catch (Exception e)
168 {
169 m_log.Error("[SQLITE]: Exception storing authentication data", e);
170 CloseCommand(cmd);
171 return false;
172 }
173 }
174
175 else
176 {
177 string insert = "insert into `" + m_Realm + "` (`UUID`, `" +
178 String.Join("`, `", fields) +
179 "`) values (:UUID, :" + String.Join(", :", fields) + ")";
180
181 cmd.Parameters.Add(new SqliteParameter(":UUID", data.PrincipalID.ToString()));
182 foreach (string field in fields)
183 cmd.Parameters.Add(new SqliteParameter(":" + field, data.Data[field]));
184
185 cmd.CommandText = insert;
186
187 try
188 {
189 if (ExecuteNonQuery(cmd, m_Connection) < 1)
190 {
191 CloseCommand(cmd);
192 return false;
193 }
194 }
195 catch (Exception e)
196 {
197 Console.WriteLine(e.ToString());
198 CloseCommand(cmd);
199 return false;
200 }
201 }
202
203 CloseCommand(cmd);
204
205 return true;
206 }
207
208 public bool SetDataItem(UUID principalID, string item, string value)
209 {
210 SqliteCommand cmd = new SqliteCommand("update `" + m_Realm +
211 "` set `" + item + "` = " + value + " where UUID = '" + principalID.ToString() + "'");
212
213 if (ExecuteNonQuery(cmd, m_Connection) > 0)
214 return true;
215
216 return false;
217 }
218
219 public bool SetToken(UUID principalID, string token, int lifetime)
220 {
221 if (System.Environment.TickCount - m_LastExpire > 30000)
222 DoExpire();
223
224 SqliteCommand cmd = new SqliteCommand("insert into tokens (UUID, token, validity) values ('" + principalID.ToString() +
225 "', '" + token + "', datetime('now', 'localtime', '+" + lifetime.ToString() + " minutes'))");
226
227 if (ExecuteNonQuery(cmd, m_Connection) > 0)
228 {
229 cmd.Dispose();
230 return true;
231 }
232
233 cmd.Dispose();
234 return false;
235 }
236
237 public bool CheckToken(UUID principalID, string token, int lifetime)
238 {
239 if (System.Environment.TickCount - m_LastExpire > 30000)
240 DoExpire();
241
242 SqliteCommand cmd = new SqliteCommand("update tokens set validity = datetime('now', 'localtime', '+" + lifetime.ToString() +
243 " minutes') where UUID = '" + principalID.ToString() + "' and token = '" + token + "' and validity > datetime('now', 'localtime')");
244
245 if (ExecuteNonQuery(cmd, m_Connection) > 0)
246 {
247 cmd.Dispose();
248 return true;
249 }
250
251 cmd.Dispose();
252
253 return false;
254 }
255
256 private void DoExpire()
257 {
258 SqliteCommand cmd = new SqliteCommand("delete from tokens where validity < datetime('now', 'localtime')");
259 ExecuteNonQuery(cmd, m_Connection);
260
261 cmd.Dispose();
262
263 m_LastExpire = System.Environment.TickCount;
264 }
265 }
266}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteAvatarData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteAvatarData.cs
deleted file mode 100644
index 660632c..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteAvatarData.cs
+++ /dev/null
@@ -1,74 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using System.Threading;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36using Mono.Data.SqliteClient;
37
38namespace OpenSim.Data.SQLiteLegacy
39{
40 /// <summary>
41 /// A SQLite Interface for Avatar Data
42 /// </summary>
43 public class SQLiteAvatarData : SQLiteGenericTableHandler<AvatarBaseData>,
44 IAvatarData
45 {
46 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
47
48 public SQLiteAvatarData(string connectionString, string realm) :
49 base(connectionString, realm, "Avatar")
50 {
51 }
52
53 public bool Delete(UUID principalID, string name)
54 {
55 SqliteCommand cmd = new SqliteCommand();
56
57 cmd.CommandText = String.Format("delete from {0} where `PrincipalID` = :PrincipalID and `Name` = :Name", m_Realm);
58 cmd.Parameters.Add(":PrincipalID", principalID.ToString());
59 cmd.Parameters.Add(":Name", name);
60
61 try
62 {
63 if (ExecuteNonQuery(cmd, m_Connection) > 0)
64 return true;
65
66 return false;
67 }
68 finally
69 {
70 CloseCommand(cmd);
71 }
72 }
73 }
74}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs
deleted file mode 100644
index 4dd225f..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteEstateData.cs
+++ /dev/null
@@ -1,451 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using log4net;
33using Mono.Data.SqliteClient;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37
38namespace OpenSim.Data.SQLiteLegacy
39{
40 public class SQLiteEstateStore : IEstateDataStore
41 {
42 private static readonly ILog m_log =
43 LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44
45 private SqliteConnection m_connection;
46 private string m_connectionString;
47
48 private FieldInfo[] m_Fields;
49 private Dictionary<string, FieldInfo> m_FieldMap =
50 new Dictionary<string, FieldInfo>();
51
52 public SQLiteEstateStore()
53 {
54 }
55
56 public SQLiteEstateStore(string connectionString)
57 {
58 Initialise(connectionString);
59 }
60
61 public void Initialise(string connectionString)
62 {
63 m_connectionString = connectionString;
64
65 m_log.Info("[ESTATE DB]: Sqlite - connecting: "+m_connectionString);
66
67 m_connection = new SqliteConnection(m_connectionString);
68 m_connection.Open();
69
70 Assembly assem = GetType().Assembly;
71 Migration m = new Migration(m_connection, assem, "EstateStore");
72 m.Update();
73
74 m_connection.Close();
75 m_connection.Open();
76
77 Type t = typeof(EstateSettings);
78 m_Fields = t.GetFields(BindingFlags.NonPublic |
79 BindingFlags.Instance |
80 BindingFlags.DeclaredOnly);
81
82 foreach (FieldInfo f in m_Fields)
83 if (f.Name.Substring(0, 2) == "m_")
84 m_FieldMap[f.Name.Substring(2)] = f;
85 }
86
87 private string[] FieldList
88 {
89 get { return new List<string>(m_FieldMap.Keys).ToArray(); }
90 }
91
92 public EstateSettings LoadEstateSettings(UUID regionID, bool create)
93 {
94 string sql = "select estate_settings."+String.Join(",estate_settings.", FieldList)+" from estate_map left join estate_settings on estate_map.EstateID = estate_settings.EstateID where estate_settings.EstateID is not null and RegionID = :RegionID";
95
96 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
97
98 cmd.CommandText = sql;
99 cmd.Parameters.Add(":RegionID", regionID.ToString());
100
101 return DoLoad(cmd, regionID, create);
102 }
103
104 public List<EstateSettings> LoadEstateSettingsAll()
105 {
106 List<EstateSettings> estateSettings = new List<EstateSettings>();
107
108 List<int> estateIds = GetEstatesAll();
109 foreach (int estateId in estateIds)
110 estateSettings.Add(LoadEstateSettings(estateId));
111
112 return estateSettings;
113 }
114
115 private EstateSettings DoLoad(SqliteCommand cmd, UUID regionID, bool create)
116 {
117 EstateSettings es = new EstateSettings();
118 es.OnSave += StoreEstateSettings;
119
120 IDataReader r = cmd.ExecuteReader();
121
122 if (r.Read())
123 {
124 foreach (string name in FieldList)
125 {
126 if (m_FieldMap[name].GetValue(es) is bool)
127 {
128 int v = Convert.ToInt32(r[name]);
129 if (v != 0)
130 m_FieldMap[name].SetValue(es, true);
131 else
132 m_FieldMap[name].SetValue(es, false);
133 }
134 else if (m_FieldMap[name].GetValue(es) is UUID)
135 {
136 UUID uuid = UUID.Zero;
137
138 UUID.TryParse(r[name].ToString(), out uuid);
139 m_FieldMap[name].SetValue(es, uuid);
140 }
141 else
142 {
143 m_FieldMap[name].SetValue(es, Convert.ChangeType(r[name], m_FieldMap[name].FieldType));
144 }
145 }
146 r.Close();
147 }
148 else if (create)
149 {
150 r.Close();
151
152 List<string> names = new List<string>(FieldList);
153
154 names.Remove("EstateID");
155
156 string sql = "insert into estate_settings ("+String.Join(",", names.ToArray())+") values ( :"+String.Join(", :", names.ToArray())+")";
157
158 cmd.CommandText = sql;
159 cmd.Parameters.Clear();
160
161 foreach (string name in FieldList)
162 {
163 if (m_FieldMap[name].GetValue(es) is bool)
164 {
165 if ((bool)m_FieldMap[name].GetValue(es))
166 cmd.Parameters.Add(":"+name, "1");
167 else
168 cmd.Parameters.Add(":"+name, "0");
169 }
170 else
171 {
172 cmd.Parameters.Add(":"+name, m_FieldMap[name].GetValue(es).ToString());
173 }
174 }
175
176 cmd.ExecuteNonQuery();
177
178 cmd.CommandText = "select LAST_INSERT_ROWID() as id";
179 cmd.Parameters.Clear();
180
181 r = cmd.ExecuteReader();
182
183 r.Read();
184
185 es.EstateID = Convert.ToUInt32(r["id"]);
186
187 r.Close();
188
189 cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
190 cmd.Parameters.Add(":RegionID", regionID.ToString());
191 cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
192
193 // This will throw on dupe key
194 try
195 {
196 cmd.ExecuteNonQuery();
197 }
198 catch (Exception)
199 {
200 }
201
202 es.Save();
203 }
204
205 LoadBanList(es);
206
207 es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
208 es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
209 es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
210 return es;
211 }
212
213 public void StoreEstateSettings(EstateSettings es)
214 {
215 List<string> fields = new List<string>(FieldList);
216 fields.Remove("EstateID");
217
218 List<string> terms = new List<string>();
219
220 foreach (string f in fields)
221 terms.Add(f+" = :"+f);
222
223 string sql = "update estate_settings set "+String.Join(", ", terms.ToArray())+" where EstateID = :EstateID";
224
225 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
226
227 cmd.CommandText = sql;
228
229 foreach (string name in FieldList)
230 {
231 if (m_FieldMap[name].GetValue(es) is bool)
232 {
233 if ((bool)m_FieldMap[name].GetValue(es))
234 cmd.Parameters.Add(":"+name, "1");
235 else
236 cmd.Parameters.Add(":"+name, "0");
237 }
238 else
239 {
240 cmd.Parameters.Add(":"+name, m_FieldMap[name].GetValue(es).ToString());
241 }
242 }
243
244 cmd.ExecuteNonQuery();
245
246 SaveBanList(es);
247 SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
248 SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
249 SaveUUIDList(es.EstateID, "estate_groups", es.EstateGroups);
250 }
251
252 private void LoadBanList(EstateSettings es)
253 {
254 es.ClearBans();
255
256 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
257
258 cmd.CommandText = "select bannedUUID from estateban where EstateID = :EstateID";
259 cmd.Parameters.Add(":EstateID", es.EstateID);
260
261 IDataReader r = cmd.ExecuteReader();
262
263 while (r.Read())
264 {
265 EstateBan eb = new EstateBan();
266
267 UUID uuid = new UUID();
268 UUID.TryParse(r["bannedUUID"].ToString(), out uuid);
269
270 eb.BannedUserID = uuid;
271 eb.BannedHostAddress = "0.0.0.0";
272 eb.BannedHostIPMask = "0.0.0.0";
273 es.AddBan(eb);
274 }
275 r.Close();
276 }
277
278 private void SaveBanList(EstateSettings es)
279 {
280 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
281
282 cmd.CommandText = "delete from estateban where EstateID = :EstateID";
283 cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
284
285 cmd.ExecuteNonQuery();
286
287 cmd.Parameters.Clear();
288
289 cmd.CommandText = "insert into estateban (EstateID, bannedUUID, bannedIp, bannedIpHostMask, bannedNameMask) values ( :EstateID, :bannedUUID, '', '', '' )";
290
291 foreach (EstateBan b in es.EstateBans)
292 {
293 cmd.Parameters.Add(":EstateID", es.EstateID.ToString());
294 cmd.Parameters.Add(":bannedUUID", b.BannedUserID.ToString());
295
296 cmd.ExecuteNonQuery();
297 cmd.Parameters.Clear();
298 }
299 }
300
301 void SaveUUIDList(uint EstateID, string table, UUID[] data)
302 {
303 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
304
305 cmd.CommandText = "delete from "+table+" where EstateID = :EstateID";
306 cmd.Parameters.Add(":EstateID", EstateID.ToString());
307
308 cmd.ExecuteNonQuery();
309
310 cmd.Parameters.Clear();
311
312 cmd.CommandText = "insert into "+table+" (EstateID, uuid) values ( :EstateID, :uuid )";
313
314 foreach (UUID uuid in data)
315 {
316 cmd.Parameters.Add(":EstateID", EstateID.ToString());
317 cmd.Parameters.Add(":uuid", uuid.ToString());
318
319 cmd.ExecuteNonQuery();
320 cmd.Parameters.Clear();
321 }
322 }
323
324 UUID[] LoadUUIDList(uint EstateID, string table)
325 {
326 List<UUID> uuids = new List<UUID>();
327
328 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
329
330 cmd.CommandText = "select uuid from "+table+" where EstateID = :EstateID";
331 cmd.Parameters.Add(":EstateID", EstateID);
332
333 IDataReader r = cmd.ExecuteReader();
334
335 while (r.Read())
336 {
337 // EstateBan eb = new EstateBan();
338
339 UUID uuid = new UUID();
340 UUID.TryParse(r["uuid"].ToString(), out uuid);
341
342 uuids.Add(uuid);
343 }
344 r.Close();
345
346 return uuids.ToArray();
347 }
348
349 public EstateSettings LoadEstateSettings(int estateID)
350 {
351 string sql = "select estate_settings."+String.Join(",estate_settings.", FieldList)+" from estate_settings where estate_settings.EstateID = :EstateID";
352
353 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
354
355 cmd.CommandText = sql;
356 cmd.Parameters.Add(":EstateID", estateID.ToString());
357
358 return DoLoad(cmd, UUID.Zero, false);
359 }
360
361 public List<int> GetEstates(string search)
362 {
363 List<int> result = new List<int>();
364
365 string sql = "select EstateID from estate_settings where estate_settings.EstateName = :EstateName";
366
367 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
368
369 cmd.CommandText = sql;
370 cmd.Parameters.Add(":EstateName", search);
371
372 IDataReader r = cmd.ExecuteReader();
373
374 while (r.Read())
375 {
376 result.Add(Convert.ToInt32(r["EstateID"]));
377 }
378 r.Close();
379
380 return result;
381 }
382
383
384 public List<int> GetEstatesAll()
385 {
386 List<int> result = new List<int>();
387
388 string sql = "select EstateID from estate_settings";
389
390 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
391
392 cmd.CommandText = sql;
393
394 IDataReader r = cmd.ExecuteReader();
395
396 while (r.Read())
397 {
398 result.Add(Convert.ToInt32(r["EstateID"]));
399 }
400 r.Close();
401
402 return result;
403 }
404
405 public List<int> GetEstatesByOwner(UUID ownerID)
406 {
407 List<int> result = new List<int>();
408
409 string sql = "select EstateID from estate_settings where estate_settings.EstateOwner = :EstateOwner";
410
411 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
412
413 cmd.CommandText = sql;
414 cmd.Parameters.Add(":EstateOwner", ownerID);
415
416 IDataReader r = cmd.ExecuteReader();
417
418 while (r.Read())
419 {
420 result.Add(Convert.ToInt32(r["EstateID"]));
421 }
422 r.Close();
423
424 return result;
425 }
426
427 public bool LinkRegion(UUID regionID, int estateID)
428 {
429 SqliteCommand cmd = (SqliteCommand)m_connection.CreateCommand();
430
431 cmd.CommandText = "insert into estate_map values (:RegionID, :EstateID)";
432 cmd.Parameters.Add(":RegionID", regionID.ToString());
433 cmd.Parameters.Add(":EstateID", estateID.ToString());
434
435 if (cmd.ExecuteNonQuery() == 0)
436 return false;
437
438 return true;
439 }
440
441 public List<UUID> GetRegions(int estateID)
442 {
443 return new List<UUID>();
444 }
445
446 public bool DeleteEstate(int estateID)
447 {
448 return false;
449 }
450 }
451}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteFramework.cs b/OpenSim/Data/SQLiteLegacy/SQLiteFramework.cs
deleted file mode 100644
index 606478e..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteFramework.cs
+++ /dev/null
@@ -1,91 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using Mono.Data.SqliteClient;
35
36namespace OpenSim.Data.SQLiteLegacy
37{
38 /// <summary>
39 /// A database interface class to a user profile storage system
40 /// </summary>
41 public class SQLiteFramework
42 {
43 protected Object m_lockObject = new Object();
44
45 protected SQLiteFramework(string connectionString)
46 {
47 }
48
49 //////////////////////////////////////////////////////////////
50 //
51 // All non queries are funneled through one connection
52 // to increase performance a little
53 //
54 protected int ExecuteNonQuery(SqliteCommand cmd, SqliteConnection connection)
55 {
56 lock (connection)
57 {
58 SqliteConnection newConnection =
59 (SqliteConnection)((ICloneable)connection).Clone();
60 newConnection.Open();
61
62 cmd.Connection = newConnection;
63 //Console.WriteLine("XXX " + cmd.CommandText);
64
65 return cmd.ExecuteNonQuery();
66 }
67 }
68
69 protected IDataReader ExecuteReader(SqliteCommand cmd, SqliteConnection connection)
70 {
71 lock (connection)
72 {
73 SqliteConnection newConnection =
74 (SqliteConnection)((ICloneable)connection).Clone();
75 newConnection.Open();
76
77 cmd.Connection = newConnection;
78 //Console.WriteLine("XXX " + cmd.CommandText);
79
80 return cmd.ExecuteReader();
81 }
82 }
83
84 protected void CloseCommand(SqliteCommand cmd)
85 {
86 cmd.Connection.Close();
87 cmd.Connection.Dispose();
88 cmd.Dispose();
89 }
90 }
91}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteFriendsData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteFriendsData.cs
deleted file mode 100644
index d529d4d..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteFriendsData.cs
+++ /dev/null
@@ -1,70 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using Mono.Data.SqliteClient;
35
36namespace OpenSim.Data.SQLiteLegacy
37{
38 public class SQLiteFriendsData : SQLiteGenericTableHandler<FriendsData>, IFriendsData
39 {
40 public SQLiteFriendsData(string connectionString, string realm)
41 : base(connectionString, realm, "FriendsStore")
42 {
43 }
44
45 public FriendsData[] GetFriends(UUID userID)
46 {
47 SqliteCommand cmd = new SqliteCommand();
48
49 cmd.CommandText = String.Format("select a.*,case when b.Flags is null then -1 else b.Flags end as TheirFlags from {0} as a left join {0} as b on a.PrincipalID = b.Friend and a.Friend = b.PrincipalID where a.PrincipalID = :PrincipalID", m_Realm);
50 cmd.Parameters.Add(":PrincipalID", userID.ToString());
51
52 return DoQuery(cmd);
53
54 }
55
56 public bool Delete(UUID principalID, string friend)
57 {
58 SqliteCommand cmd = new SqliteCommand();
59
60 cmd.CommandText = String.Format("delete from {0} where PrincipalID = :PrincipalID and Friend = :Friend", m_Realm);
61 cmd.Parameters.Add(":PrincipalID", principalID.ToString());
62 cmd.Parameters.Add(":Friend", friend);
63
64 ExecuteNonQuery(cmd, cmd.Connection);
65
66 return true;
67 }
68
69 }
70}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteGenericTableHandler.cs b/OpenSim/Data/SQLiteLegacy/SQLiteGenericTableHandler.cs
deleted file mode 100644
index 1c1fe8c..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteGenericTableHandler.cs
+++ /dev/null
@@ -1,268 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using log4net;
33using Mono.Data.SqliteClient;
34using OpenMetaverse;
35using OpenSim.Framework;
36using OpenSim.Region.Framework.Interfaces;
37
38namespace OpenSim.Data.SQLiteLegacy
39{
40 public class SQLiteGenericTableHandler<T> : SQLiteFramework where T: class, new()
41 {
42// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
43
44 protected Dictionary<string, FieldInfo> m_Fields =
45 new Dictionary<string, FieldInfo>();
46
47 protected List<string> m_ColumnNames = null;
48 protected string m_Realm;
49 protected FieldInfo m_DataField = null;
50
51 protected static SqliteConnection m_Connection;
52 private static bool m_initialized;
53
54 public SQLiteGenericTableHandler(string connectionString,
55 string realm, string storeName) : base(connectionString)
56 {
57 m_Realm = realm;
58
59 if (!m_initialized)
60 {
61 m_Connection = new SqliteConnection(connectionString);
62 m_Connection.Open();
63
64 if (storeName != String.Empty)
65 {
66 Assembly assem = GetType().Assembly;
67 SqliteConnection newConnection =
68 (SqliteConnection)((ICloneable)m_Connection).Clone();
69 newConnection.Open();
70
71 Migration m = new Migration(newConnection, assem, storeName);
72 m.Update();
73 newConnection.Close();
74 newConnection.Dispose();
75 }
76
77 m_initialized = true;
78 }
79
80 Type t = typeof(T);
81 FieldInfo[] fields = t.GetFields(BindingFlags.Public |
82 BindingFlags.Instance |
83 BindingFlags.DeclaredOnly);
84
85 if (fields.Length == 0)
86 return;
87
88 foreach (FieldInfo f in fields)
89 {
90 if (f.Name != "Data")
91 m_Fields[f.Name] = f;
92 else
93 m_DataField = f;
94 }
95 }
96
97 private void CheckColumnNames(IDataReader reader)
98 {
99 if (m_ColumnNames != null)
100 return;
101
102 m_ColumnNames = new List<string>();
103
104 DataTable schemaTable = reader.GetSchemaTable();
105 foreach (DataRow row in schemaTable.Rows)
106 {
107 if (row["ColumnName"] != null &&
108 (!m_Fields.ContainsKey(row["ColumnName"].ToString())))
109 m_ColumnNames.Add(row["ColumnName"].ToString());
110 }
111 }
112
113 public T[] Get(string field, string key)
114 {
115 return Get(new string[] { field }, new string[] { key });
116 }
117
118 public T[] Get(string[] fields, string[] keys)
119 {
120 if (fields.Length != keys.Length)
121 return new T[0];
122
123 List<string> terms = new List<string>();
124
125 SqliteCommand cmd = new SqliteCommand();
126
127 for (int i = 0 ; i < fields.Length ; i++)
128 {
129 cmd.Parameters.Add(new SqliteParameter(":" + fields[i], keys[i]));
130 terms.Add("`" + fields[i] + "` = :" + fields[i]);
131 }
132
133 string where = String.Join(" and ", terms.ToArray());
134
135 string query = String.Format("select * from {0} where {1}",
136 m_Realm, where);
137
138 cmd.CommandText = query;
139
140 return DoQuery(cmd);
141 }
142
143 protected T[] DoQuery(SqliteCommand cmd)
144 {
145 IDataReader reader = ExecuteReader(cmd, m_Connection);
146 if (reader == null)
147 return new T[0];
148
149 CheckColumnNames(reader);
150
151 List<T> result = new List<T>();
152
153 while (reader.Read())
154 {
155 T row = new T();
156
157 foreach (string name in m_Fields.Keys)
158 {
159 if (m_Fields[name].GetValue(row) is bool)
160 {
161 int v = Convert.ToInt32(reader[name]);
162 m_Fields[name].SetValue(row, v != 0 ? true : false);
163 }
164 else if (m_Fields[name].GetValue(row) is UUID)
165 {
166 UUID uuid = UUID.Zero;
167
168 UUID.TryParse(reader[name].ToString(), out uuid);
169 m_Fields[name].SetValue(row, uuid);
170 }
171 else if (m_Fields[name].GetValue(row) is int)
172 {
173 int v = Convert.ToInt32(reader[name]);
174 m_Fields[name].SetValue(row, v);
175 }
176 else
177 {
178 m_Fields[name].SetValue(row, reader[name]);
179 }
180 }
181
182 if (m_DataField != null)
183 {
184 Dictionary<string, string> data =
185 new Dictionary<string, string>();
186
187 foreach (string col in m_ColumnNames)
188 {
189 data[col] = reader[col].ToString();
190 if (data[col] == null)
191 data[col] = String.Empty;
192 }
193
194 m_DataField.SetValue(row, data);
195 }
196
197 result.Add(row);
198 }
199
200 CloseCommand(cmd);
201
202 return result.ToArray();
203 }
204
205 public T[] Get(string where)
206 {
207 SqliteCommand cmd = new SqliteCommand();
208
209 string query = String.Format("select * from {0} where {1}",
210 m_Realm, where);
211
212 cmd.CommandText = query;
213
214 return DoQuery(cmd);
215 }
216
217 public bool Store(T row)
218 {
219 SqliteCommand cmd = new SqliteCommand();
220
221 string query = "";
222 List<String> names = new List<String>();
223 List<String> values = new List<String>();
224
225 foreach (FieldInfo fi in m_Fields.Values)
226 {
227 names.Add(fi.Name);
228 values.Add(":" + fi.Name);
229 cmd.Parameters.Add(new SqliteParameter(":" + fi.Name, fi.GetValue(row).ToString()));
230 }
231
232 if (m_DataField != null)
233 {
234 Dictionary<string, string> data =
235 (Dictionary<string, string>)m_DataField.GetValue(row);
236
237 foreach (KeyValuePair<string, string> kvp in data)
238 {
239 names.Add(kvp.Key);
240 values.Add(":" + kvp.Key);
241 cmd.Parameters.Add(new SqliteParameter(":" + kvp.Key, kvp.Value));
242 }
243 }
244
245 query = String.Format("replace into {0} (`", m_Realm) + String.Join("`,`", names.ToArray()) + "`) values (" + String.Join(",", values.ToArray()) + ")";
246
247 cmd.CommandText = query;
248
249 if (ExecuteNonQuery(cmd, m_Connection) > 0)
250 return true;
251
252 return false;
253 }
254
255 public bool Delete(string field, string val)
256 {
257 SqliteCommand cmd = new SqliteCommand();
258
259 cmd.CommandText = String.Format("delete from {0} where `{1}` = :{1}", m_Realm, field);
260 cmd.Parameters.Add(new SqliteParameter(field, val));
261
262 if (ExecuteNonQuery(cmd, m_Connection) > 0)
263 return true;
264
265 return false;
266 }
267 }
268}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteInventoryStore.cs b/OpenSim/Data/SQLiteLegacy/SQLiteInventoryStore.cs
deleted file mode 100644
index 8ca48f9..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteInventoryStore.cs
+++ /dev/null
@@ -1,898 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Reflection;
32using log4net;
33using Mono.Data.SqliteClient;
34using OpenMetaverse;
35using OpenSim.Framework;
36
37namespace OpenSim.Data.SQLiteLegacy
38{
39 /// <summary>
40 /// An Inventory Interface to the SQLite database
41 /// </summary>
42 public class SQLiteInventoryStore : SQLiteUtil, IInventoryDataPlugin
43 {
44 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 private const string invItemsSelect = "select * from inventoryitems";
47 private const string invFoldersSelect = "select * from inventoryfolders";
48
49 private static SqliteConnection conn;
50 private static DataSet ds;
51 private static SqliteDataAdapter invItemsDa;
52 private static SqliteDataAdapter invFoldersDa;
53
54 private static bool m_Initialized = false;
55
56 public void Initialise()
57 {
58 m_log.Info("[SQLiteInventoryData]: " + Name + " cannot be default-initialized!");
59 throw new PluginNotInitialisedException(Name);
60 }
61
62 /// <summary>
63 /// <list type="bullet">
64 /// <item>Initialises Inventory interface</item>
65 /// <item>Loads and initialises a new SQLite connection and maintains it.</item>
66 /// <item>use default URI if connect string string is empty.</item>
67 /// </list>
68 /// </summary>
69 /// <param name="dbconnect">connect string</param>
70 public void Initialise(string dbconnect)
71 {
72 if (!m_Initialized)
73 {
74 m_Initialized = true;
75
76 if (dbconnect == string.Empty)
77 {
78 dbconnect = "URI=file:inventoryStore.db,version=3";
79 }
80 m_log.Info("[INVENTORY DB]: Sqlite - connecting: " + dbconnect);
81 conn = new SqliteConnection(dbconnect);
82
83 conn.Open();
84
85 Assembly assem = GetType().Assembly;
86 Migration m = new Migration(conn, assem, "InventoryStore");
87 m.Update();
88
89 SqliteCommand itemsSelectCmd = new SqliteCommand(invItemsSelect, conn);
90 invItemsDa = new SqliteDataAdapter(itemsSelectCmd);
91 // SqliteCommandBuilder primCb = new SqliteCommandBuilder(primDa);
92
93 SqliteCommand foldersSelectCmd = new SqliteCommand(invFoldersSelect, conn);
94 invFoldersDa = new SqliteDataAdapter(foldersSelectCmd);
95
96 ds = new DataSet();
97
98 ds.Tables.Add(createInventoryFoldersTable());
99 invFoldersDa.Fill(ds.Tables["inventoryfolders"]);
100 setupFoldersCommands(invFoldersDa, conn);
101 m_log.Info("[INVENTORY DB]: Populated Inventory Folders Definitions");
102
103 ds.Tables.Add(createInventoryItemsTable());
104 invItemsDa.Fill(ds.Tables["inventoryitems"]);
105 setupItemsCommands(invItemsDa, conn);
106 m_log.Info("[INVENTORY DB]: Populated Inventory Items Definitions");
107
108 ds.AcceptChanges();
109 }
110 }
111
112 /// <summary>
113 /// Closes the inventory interface
114 /// </summary>
115 public void Dispose()
116 {
117 if (conn != null)
118 {
119 conn.Close();
120 conn = null;
121 }
122 if (invItemsDa != null)
123 {
124 invItemsDa.Dispose();
125 invItemsDa = null;
126 }
127 if (invFoldersDa != null)
128 {
129 invFoldersDa.Dispose();
130 invFoldersDa = null;
131 }
132 if (ds != null)
133 {
134 ds.Dispose();
135 ds = null;
136 }
137 }
138
139 /// <summary>
140 ///
141 /// </summary>
142 /// <param name="row"></param>
143 /// <returns></returns>
144 public InventoryItemBase buildItem(DataRow row)
145 {
146 InventoryItemBase item = new InventoryItemBase();
147 item.ID = new UUID((string) row["UUID"]);
148 item.AssetID = new UUID((string) row["assetID"]);
149 item.AssetType = Convert.ToInt32(row["assetType"]);
150 item.InvType = Convert.ToInt32(row["invType"]);
151 item.Folder = new UUID((string) row["parentFolderID"]);
152 item.Owner = new UUID((string) row["avatarID"]);
153 item.CreatorIdentification = (string)row["creatorsID"];
154 item.Name = (string) row["inventoryName"];
155 item.Description = (string) row["inventoryDescription"];
156
157 item.NextPermissions = Convert.ToUInt32(row["inventoryNextPermissions"]);
158 item.CurrentPermissions = Convert.ToUInt32(row["inventoryCurrentPermissions"]);
159 item.BasePermissions = Convert.ToUInt32(row["inventoryBasePermissions"]);
160 item.EveryOnePermissions = Convert.ToUInt32(row["inventoryEveryOnePermissions"]);
161 item.GroupPermissions = Convert.ToUInt32(row["inventoryGroupPermissions"]);
162
163 // new fields
164 if (!Convert.IsDBNull(row["salePrice"]))
165 item.SalePrice = Convert.ToInt32(row["salePrice"]);
166
167 if (!Convert.IsDBNull(row["saleType"]))
168 item.SaleType = Convert.ToByte(row["saleType"]);
169
170 if (!Convert.IsDBNull(row["creationDate"]))
171 item.CreationDate = Convert.ToInt32(row["creationDate"]);
172
173 if (!Convert.IsDBNull(row["groupID"]))
174 item.GroupID = new UUID((string)row["groupID"]);
175
176 if (!Convert.IsDBNull(row["groupOwned"]))
177 item.GroupOwned = Convert.ToBoolean(row["groupOwned"]);
178
179 if (!Convert.IsDBNull(row["Flags"]))
180 item.Flags = Convert.ToUInt32(row["Flags"]);
181
182 return item;
183 }
184
185 /// <summary>
186 /// Fill a database row with item data
187 /// </summary>
188 /// <param name="row"></param>
189 /// <param name="item"></param>
190 private static void fillItemRow(DataRow row, InventoryItemBase item)
191 {
192 row["UUID"] = item.ID.ToString();
193 row["assetID"] = item.AssetID.ToString();
194 row["assetType"] = item.AssetType;
195 row["invType"] = item.InvType;
196 row["parentFolderID"] = item.Folder.ToString();
197 row["avatarID"] = item.Owner.ToString();
198 row["creatorsID"] = item.CreatorIdentification.ToString();
199 row["inventoryName"] = item.Name;
200 row["inventoryDescription"] = item.Description;
201
202 row["inventoryNextPermissions"] = item.NextPermissions;
203 row["inventoryCurrentPermissions"] = item.CurrentPermissions;
204 row["inventoryBasePermissions"] = item.BasePermissions;
205 row["inventoryEveryOnePermissions"] = item.EveryOnePermissions;
206 row["inventoryGroupPermissions"] = item.GroupPermissions;
207
208 // new fields
209 row["salePrice"] = item.SalePrice;
210 row["saleType"] = item.SaleType;
211 row["creationDate"] = item.CreationDate;
212 row["groupID"] = item.GroupID.ToString();
213 row["groupOwned"] = item.GroupOwned;
214 row["flags"] = item.Flags;
215 }
216
217 /// <summary>
218 /// Add inventory folder
219 /// </summary>
220 /// <param name="folder">Folder base</param>
221 /// <param name="add">true=create folder. false=update existing folder</param>
222 /// <remarks>nasty</remarks>
223 private void addFolder(InventoryFolderBase folder, bool add)
224 {
225 lock (ds)
226 {
227 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
228
229 DataRow inventoryRow = inventoryFolderTable.Rows.Find(folder.ID.ToString());
230 if (inventoryRow == null)
231 {
232 if (! add)
233 m_log.ErrorFormat("Interface Misuse: Attempting to Update non-existant inventory folder: {0}", folder.ID);
234
235 inventoryRow = inventoryFolderTable.NewRow();
236 fillFolderRow(inventoryRow, folder);
237 inventoryFolderTable.Rows.Add(inventoryRow);
238 }
239 else
240 {
241 if (add)
242 m_log.ErrorFormat("Interface Misuse: Attempting to Add inventory folder that already exists: {0}", folder.ID);
243
244 fillFolderRow(inventoryRow, folder);
245 }
246
247 invFoldersDa.Update(ds, "inventoryfolders");
248 }
249 }
250
251 /// <summary>
252 /// Move an inventory folder
253 /// </summary>
254 /// <param name="folder">folder base</param>
255 private void moveFolder(InventoryFolderBase folder)
256 {
257 lock (ds)
258 {
259 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
260
261 DataRow inventoryRow = inventoryFolderTable.Rows.Find(folder.ID.ToString());
262 if (inventoryRow == null)
263 {
264 inventoryRow = inventoryFolderTable.NewRow();
265 fillFolderRow(inventoryRow, folder);
266 inventoryFolderTable.Rows.Add(inventoryRow);
267 }
268 else
269 {
270 moveFolderRow(inventoryRow, folder);
271 }
272
273 invFoldersDa.Update(ds, "inventoryfolders");
274 }
275 }
276
277 /// <summary>
278 /// add an item in inventory
279 /// </summary>
280 /// <param name="item">the item</param>
281 /// <param name="add">true=add item ; false=update existing item</param>
282 private void addItem(InventoryItemBase item, bool add)
283 {
284 lock (ds)
285 {
286 DataTable inventoryItemTable = ds.Tables["inventoryitems"];
287
288 DataRow inventoryRow = inventoryItemTable.Rows.Find(item.ID.ToString());
289 if (inventoryRow == null)
290 {
291 if (!add)
292 m_log.ErrorFormat("[INVENTORY DB]: Interface Misuse: Attempting to Update non-existant inventory item: {0}", item.ID);
293
294 inventoryRow = inventoryItemTable.NewRow();
295 fillItemRow(inventoryRow, item);
296 inventoryItemTable.Rows.Add(inventoryRow);
297 }
298 else
299 {
300 if (add)
301 m_log.ErrorFormat("[INVENTORY DB]: Interface Misuse: Attempting to Add inventory item that already exists: {0}", item.ID);
302
303 fillItemRow(inventoryRow, item);
304 }
305
306 invItemsDa.Update(ds, "inventoryitems");
307
308 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
309
310 inventoryRow = inventoryFolderTable.Rows.Find(item.Folder.ToString());
311 if (inventoryRow != null) //MySQL doesn't throw an exception here, so sqlite shouldn't either.
312 inventoryRow["version"] = (int)inventoryRow["version"] + 1;
313
314 invFoldersDa.Update(ds, "inventoryfolders");
315 }
316 }
317
318 /// <summary>
319 /// TODO : DataSet commit
320 /// </summary>
321 public void Shutdown()
322 {
323 // TODO: DataSet commit
324 }
325
326 /// <summary>
327 /// The name of this DB provider
328 /// </summary>
329 /// <returns>Name of DB provider</returns>
330 public string Name
331 {
332 get { return "SQLite Inventory Data Interface"; }
333 }
334
335 /// <summary>
336 /// Returns the version of this DB provider
337 /// </summary>
338 /// <returns>A string containing the DB provider version</returns>
339 public string Version
340 {
341 get
342 {
343 Module module = GetType().Module;
344 // string dllName = module.Assembly.ManifestModule.Name;
345 Version dllVersion = module.Assembly.GetName().Version;
346
347
348 return
349 string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
350 dllVersion.Revision);
351 }
352 }
353
354 /// <summary>
355 /// Returns a list of inventory items contained within the specified folder
356 /// </summary>
357 /// <param name="folderID">The UUID of the target folder</param>
358 /// <returns>A List of InventoryItemBase items</returns>
359 public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
360 {
361 lock (ds)
362 {
363 List<InventoryItemBase> retval = new List<InventoryItemBase>();
364 DataTable inventoryItemTable = ds.Tables["inventoryitems"];
365 string selectExp = "parentFolderID = '" + folderID + "'";
366 DataRow[] rows = inventoryItemTable.Select(selectExp);
367 foreach (DataRow row in rows)
368 {
369 retval.Add(buildItem(row));
370 }
371
372 return retval;
373 }
374 }
375
376 /// <summary>
377 /// Returns a list of the root folders within a users inventory
378 /// </summary>
379 /// <param name="user">The user whos inventory is to be searched</param>
380 /// <returns>A list of folder objects</returns>
381 public List<InventoryFolderBase> getUserRootFolders(UUID user)
382 {
383 return new List<InventoryFolderBase>();
384 }
385
386 // see InventoryItemBase.getUserRootFolder
387 public InventoryFolderBase getUserRootFolder(UUID user)
388 {
389 lock (ds)
390 {
391 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
392 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
393 string selectExp = "agentID = '" + user + "' AND parentID = '" + UUID.Zero + "'";
394 DataRow[] rows = inventoryFolderTable.Select(selectExp);
395 foreach (DataRow row in rows)
396 {
397 folders.Add(buildFolder(row));
398 }
399
400 // There should only ever be one root folder for a user. However, if there's more
401 // than one we'll simply use the first one rather than failing. It would be even
402 // nicer to print some message to this effect, but this feels like it's too low a
403 // to put such a message out, and it's too minor right now to spare the time to
404 // suitably refactor.
405 if (folders.Count > 0)
406 {
407 return folders[0];
408 }
409
410 return null;
411 }
412 }
413
414 /// <summary>
415 /// Append a list of all the child folders of a parent folder
416 /// </summary>
417 /// <param name="folders">list where folders will be appended</param>
418 /// <param name="parentID">ID of parent</param>
419 protected void getInventoryFolders(ref List<InventoryFolderBase> folders, UUID parentID)
420 {
421 lock (ds)
422 {
423 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
424 string selectExp = "parentID = '" + parentID + "'";
425 DataRow[] rows = inventoryFolderTable.Select(selectExp);
426 foreach (DataRow row in rows)
427 {
428 folders.Add(buildFolder(row));
429 }
430
431 }
432 }
433
434 /// <summary>
435 /// Returns a list of inventory folders contained in the folder 'parentID'
436 /// </summary>
437 /// <param name="parentID">The folder to get subfolders for</param>
438 /// <returns>A list of inventory folders</returns>
439 public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
440 {
441 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
442 getInventoryFolders(ref folders, parentID);
443 return folders;
444 }
445
446 /// <summary>
447 /// See IInventoryDataPlugin
448 /// </summary>
449 /// <param name="parentID"></param>
450 /// <returns></returns>
451 public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
452 {
453 /* Note: There are subtle changes between this implementation of getFolderHierarchy and the previous one
454 * - We will only need to hit the database twice instead of n times.
455 * - We assume the database is well-formed - no stranded/dangling folders, all folders in heirarchy owned
456 * by the same person, each user only has 1 inventory heirarchy
457 * - The returned list is not ordered, instead of breadth-first ordered
458 There are basically 2 usage cases for getFolderHeirarchy:
459 1) Getting the user's entire inventory heirarchy when they log in
460 2) Finding a subfolder heirarchy to delete when emptying the trash.
461 This implementation will pull all inventory folders from the database, and then prune away any folder that
462 is not part of the requested sub-heirarchy. The theory is that it is cheaper to make 1 request from the
463 database than to make n requests. This pays off only if requested heirarchy is large.
464 By making this choice, we are making the worst case better at the cost of making the best case worse
465 - Francis
466 */
467
468 List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
469 DataRow[] folderRows = null, parentRow;
470 InventoryFolderBase parentFolder = null;
471 lock (ds)
472 {
473 /* Fetch the parent folder from the database to determine the agent ID.
474 * Then fetch all inventory folders for that agent from the agent ID.
475 */
476 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
477 string selectExp = "UUID = '" + parentID + "'";
478 parentRow = inventoryFolderTable.Select(selectExp); // Assume at most 1 result
479 if (parentRow.GetLength(0) >= 1) // No result means parent folder does not exist
480 {
481 parentFolder = buildFolder(parentRow[0]);
482 UUID agentID = parentFolder.Owner;
483 selectExp = "agentID = '" + agentID + "'";
484 folderRows = inventoryFolderTable.Select(selectExp);
485 }
486
487 if (folderRows != null && folderRows.GetLength(0) >= 1) // No result means parent folder does not exist
488 { // or has no children
489 /* if we're querying the root folder, just return an unordered list of all folders in the user's
490 * inventory
491 */
492 if (parentFolder.ParentID == UUID.Zero)
493 {
494 foreach (DataRow row in folderRows)
495 {
496 InventoryFolderBase curFolder = buildFolder(row);
497 if (curFolder.ID != parentID) // Return all folders except the parent folder of heirarchy
498 folders.Add(buildFolder(row));
499 }
500 } // If requesting root folder
501 /* else we are querying a non-root folder. We currently have a list of all of the user's folders,
502 * we must construct a list of all folders in the heirarchy below parentID.
503 * Our first step will be to construct a hash table of all folders, indexed by parent ID.
504 * Once we have constructed the hash table, we will do a breadth-first traversal on the tree using the
505 * hash table to find child folders.
506 */
507 else
508 { // Querying a non-root folder
509
510 // Build a hash table of all user's inventory folders, indexed by each folder's parent ID
511 Dictionary<UUID, List<InventoryFolderBase>> hashtable =
512 new Dictionary<UUID, List<InventoryFolderBase>>(folderRows.GetLength(0));
513
514 foreach (DataRow row in folderRows)
515 {
516 InventoryFolderBase curFolder = buildFolder(row);
517 if (curFolder.ParentID != UUID.Zero) // Discard root of tree - not needed
518 {
519 if (hashtable.ContainsKey(curFolder.ParentID))
520 {
521 // Current folder already has a sibling - append to sibling list
522 hashtable[curFolder.ParentID].Add(curFolder);
523 }
524 else
525 {
526 List<InventoryFolderBase> siblingList = new List<InventoryFolderBase>();
527 siblingList.Add(curFolder);
528 // Current folder has no known (yet) siblings
529 hashtable.Add(curFolder.ParentID, siblingList);
530 }
531 }
532 } // For all inventory folders
533
534 // Note: Could release the ds lock here - we don't access folderRows or the database anymore.
535 // This is somewhat of a moot point as the callers of this function usually lock db anyways.
536
537 if (hashtable.ContainsKey(parentID)) // if requested folder does have children
538 folders.AddRange(hashtable[parentID]);
539
540 // BreadthFirstSearch build inventory tree **Note: folders.Count is *not* static
541 for (int i = 0; i < folders.Count; i++)
542 if (hashtable.ContainsKey(folders[i].ID))
543 folders.AddRange(hashtable[folders[i].ID]);
544
545 } // if requesting a subfolder heirarchy
546 } // if folder parentID exists and has children
547 } // lock ds
548 return folders;
549 }
550
551 /// <summary>
552 /// Returns an inventory item by its UUID
553 /// </summary>
554 /// <param name="item">The UUID of the item to be returned</param>
555 /// <returns>A class containing item information</returns>
556 public InventoryItemBase getInventoryItem(UUID item)
557 {
558 lock (ds)
559 {
560 DataRow row = ds.Tables["inventoryitems"].Rows.Find(item.ToString());
561 if (row != null)
562 {
563 return buildItem(row);
564 }
565 else
566 {
567 return null;
568 }
569 }
570 }
571
572 /// <summary>
573 /// Returns a specified inventory folder by its UUID
574 /// </summary>
575 /// <param name="folder">The UUID of the folder to be returned</param>
576 /// <returns>A class containing folder information</returns>
577 public InventoryFolderBase getInventoryFolder(UUID folder)
578 {
579 // TODO: Deep voodoo here. If you enable this code then
580 // multi region breaks. No idea why, but I figured it was
581 // better to leave multi region at this point. It does mean
582 // that you don't get to see system textures why creating
583 // clothes and the like. :(
584 lock (ds)
585 {
586 DataRow row = ds.Tables["inventoryfolders"].Rows.Find(folder.ToString());
587 if (row != null)
588 {
589 return buildFolder(row);
590 }
591 else
592 {
593 return null;
594 }
595 }
596 }
597
598 /// <summary>
599 /// Creates a new inventory item based on item
600 /// </summary>
601 /// <param name="item">The item to be created</param>
602 public void addInventoryItem(InventoryItemBase item)
603 {
604 addItem(item, true);
605 }
606
607 /// <summary>
608 /// Updates an inventory item with item (updates based on ID)
609 /// </summary>
610 /// <param name="item">The updated item</param>
611 public void updateInventoryItem(InventoryItemBase item)
612 {
613 addItem(item, false);
614 }
615
616 /// <summary>
617 /// Delete an inventory item
618 /// </summary>
619 /// <param name="item">The item UUID</param>
620 public void deleteInventoryItem(UUID itemID)
621 {
622 lock (ds)
623 {
624 DataTable inventoryItemTable = ds.Tables["inventoryitems"];
625
626 DataRow inventoryRow = inventoryItemTable.Rows.Find(itemID.ToString());
627 if (inventoryRow != null)
628 {
629 inventoryRow.Delete();
630 }
631
632 invItemsDa.Update(ds, "inventoryitems");
633 }
634 }
635
636 public InventoryItemBase queryInventoryItem(UUID itemID)
637 {
638 return getInventoryItem(itemID);
639 }
640
641 public InventoryFolderBase queryInventoryFolder(UUID folderID)
642 {
643 return getInventoryFolder(folderID);
644 }
645
646 /// <summary>
647 /// Delete all items in the specified folder
648 /// </summary>
649 /// <param name="folderId">id of the folder, whose item content should be deleted</param>
650 /// <todo>this is horribly inefficient, but I don't want to ruin the overall structure of this implementation</todo>
651 private void deleteItemsInFolder(UUID folderId)
652 {
653 List<InventoryItemBase> items = getInventoryInFolder(folderId);
654
655 foreach (InventoryItemBase i in items)
656 deleteInventoryItem(i.ID);
657 }
658
659 /// <summary>
660 /// Adds a new folder specified by folder
661 /// </summary>
662 /// <param name="folder">The inventory folder</param>
663 public void addInventoryFolder(InventoryFolderBase folder)
664 {
665 addFolder(folder, true);
666 }
667
668 /// <summary>
669 /// Updates a folder based on its ID with folder
670 /// </summary>
671 /// <param name="folder">The inventory folder</param>
672 public void updateInventoryFolder(InventoryFolderBase folder)
673 {
674 addFolder(folder, false);
675 }
676
677 /// <summary>
678 /// Moves a folder based on its ID with folder
679 /// </summary>
680 /// <param name="folder">The inventory folder</param>
681 public void moveInventoryFolder(InventoryFolderBase folder)
682 {
683 moveFolder(folder);
684 }
685
686 /// <summary>
687 /// Delete a folder
688 /// </summary>
689 /// <remarks>
690 /// This will clean-up any child folders and child items as well
691 /// </remarks>
692 /// <param name="folderID">the folder UUID</param>
693 public void deleteInventoryFolder(UUID folderID)
694 {
695 lock (ds)
696 {
697 List<InventoryFolderBase> subFolders = getFolderHierarchy(folderID);
698
699 DataTable inventoryFolderTable = ds.Tables["inventoryfolders"];
700 DataRow inventoryRow;
701
702 //Delete all sub-folders
703 foreach (InventoryFolderBase f in subFolders)
704 {
705 inventoryRow = inventoryFolderTable.Rows.Find(f.ID.ToString());
706 if (inventoryRow != null)
707 {
708 deleteItemsInFolder(f.ID);
709 inventoryRow.Delete();
710 }
711 }
712
713 //Delete the actual row
714 inventoryRow = inventoryFolderTable.Rows.Find(folderID.ToString());
715 if (inventoryRow != null)
716 {
717 deleteItemsInFolder(folderID);
718 inventoryRow.Delete();
719 }
720
721 invFoldersDa.Update(ds, "inventoryfolders");
722 }
723 }
724
725 /***********************************************************************
726 *
727 * Data Table definitions
728 *
729 **********************************************************************/
730
731 /// <summary>
732 /// Create the "inventoryitems" table
733 /// </summary>
734 private static DataTable createInventoryItemsTable()
735 {
736 DataTable inv = new DataTable("inventoryitems");
737
738 createCol(inv, "UUID", typeof (String)); //inventoryID
739 createCol(inv, "assetID", typeof (String));
740 createCol(inv, "assetType", typeof (Int32));
741 createCol(inv, "invType", typeof (Int32));
742 createCol(inv, "parentFolderID", typeof (String));
743 createCol(inv, "avatarID", typeof (String));
744 createCol(inv, "creatorsID", typeof (String));
745
746 createCol(inv, "inventoryName", typeof (String));
747 createCol(inv, "inventoryDescription", typeof (String));
748 // permissions
749 createCol(inv, "inventoryNextPermissions", typeof (Int32));
750 createCol(inv, "inventoryCurrentPermissions", typeof (Int32));
751 createCol(inv, "inventoryBasePermissions", typeof (Int32));
752 createCol(inv, "inventoryEveryOnePermissions", typeof (Int32));
753 createCol(inv, "inventoryGroupPermissions", typeof (Int32));
754
755 // sale info
756 createCol(inv, "salePrice", typeof(Int32));
757 createCol(inv, "saleType", typeof(Byte));
758
759 // creation date
760 createCol(inv, "creationDate", typeof(Int32));
761
762 // group info
763 createCol(inv, "groupID", typeof(String));
764 createCol(inv, "groupOwned", typeof(Boolean));
765
766 // Flags
767 createCol(inv, "flags", typeof(UInt32));
768
769 inv.PrimaryKey = new DataColumn[] { inv.Columns["UUID"] };
770 return inv;
771 }
772
773 /// <summary>
774 /// Creates the "inventoryfolders" table
775 /// </summary>
776 /// <returns></returns>
777 private static DataTable createInventoryFoldersTable()
778 {
779 DataTable fol = new DataTable("inventoryfolders");
780
781 createCol(fol, "UUID", typeof (String)); //folderID
782 createCol(fol, "name", typeof (String));
783 createCol(fol, "agentID", typeof (String));
784 createCol(fol, "parentID", typeof (String));
785 createCol(fol, "type", typeof (Int32));
786 createCol(fol, "version", typeof (Int32));
787
788 fol.PrimaryKey = new DataColumn[] {fol.Columns["UUID"]};
789 return fol;
790 }
791
792 /// <summary>
793 ///
794 /// </summary>
795 /// <param name="da"></param>
796 /// <param name="conn"></param>
797 private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
798 {
799 lock (ds)
800 {
801 da.InsertCommand = createInsertCommand("inventoryitems", ds.Tables["inventoryitems"]);
802 da.InsertCommand.Connection = conn;
803
804 da.UpdateCommand = createUpdateCommand("inventoryitems", "UUID=:UUID", ds.Tables["inventoryitems"]);
805 da.UpdateCommand.Connection = conn;
806
807 SqliteCommand delete = new SqliteCommand("delete from inventoryitems where UUID = :UUID");
808 delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
809 delete.Connection = conn;
810 da.DeleteCommand = delete;
811 }
812 }
813
814 /// <summary>
815 ///
816 /// </summary>
817 /// <param name="da"></param>
818 /// <param name="conn"></param>
819 private void setupFoldersCommands(SqliteDataAdapter da, SqliteConnection conn)
820 {
821 lock (ds)
822 {
823 da.InsertCommand = createInsertCommand("inventoryfolders", ds.Tables["inventoryfolders"]);
824 da.InsertCommand.Connection = conn;
825
826 da.UpdateCommand = createUpdateCommand("inventoryfolders", "UUID=:UUID", ds.Tables["inventoryfolders"]);
827 da.UpdateCommand.Connection = conn;
828
829 SqliteCommand delete = new SqliteCommand("delete from inventoryfolders where UUID = :UUID");
830 delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
831 delete.Connection = conn;
832 da.DeleteCommand = delete;
833 }
834 }
835
836 /// <summary>
837 ///
838 /// </summary>
839 /// <param name="row"></param>
840 /// <returns></returns>
841 private static InventoryFolderBase buildFolder(DataRow row)
842 {
843 InventoryFolderBase folder = new InventoryFolderBase();
844 folder.ID = new UUID((string) row["UUID"]);
845 folder.Name = (string) row["name"];
846 folder.Owner = new UUID((string) row["agentID"]);
847 folder.ParentID = new UUID((string) row["parentID"]);
848 folder.Type = Convert.ToInt16(row["type"]);
849 folder.Version = Convert.ToUInt16(row["version"]);
850 return folder;
851 }
852
853 /// <summary>
854 ///
855 /// </summary>
856 /// <param name="row"></param>
857 /// <param name="folder"></param>
858 private static void fillFolderRow(DataRow row, InventoryFolderBase folder)
859 {
860 row["UUID"] = folder.ID.ToString();
861 row["name"] = folder.Name;
862 row["agentID"] = folder.Owner.ToString();
863 row["parentID"] = folder.ParentID.ToString();
864 row["type"] = folder.Type;
865 row["version"] = folder.Version;
866 }
867
868 /// <summary>
869 ///
870 /// </summary>
871 /// <param name="row"></param>
872 /// <param name="folder"></param>
873 private static void moveFolderRow(DataRow row, InventoryFolderBase folder)
874 {
875 row["UUID"] = folder.ID.ToString();
876 row["parentID"] = folder.ParentID.ToString();
877 }
878
879 public List<InventoryItemBase> fetchActiveGestures (UUID avatarID)
880 {
881 lock (ds)
882 {
883 List<InventoryItemBase> items = new List<InventoryItemBase>();
884
885 DataTable inventoryItemTable = ds.Tables["inventoryitems"];
886 string selectExp
887 = "avatarID = '" + avatarID + "' AND assetType = " + (int)AssetType.Gesture + " AND flags = 1";
888 //m_log.DebugFormat("[SQL]: sql = " + selectExp);
889 DataRow[] rows = inventoryItemTable.Select(selectExp);
890 foreach (DataRow row in rows)
891 {
892 items.Add(buildItem(row));
893 }
894 return items;
895 }
896 }
897 }
898}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs
deleted file mode 100644
index 644864a..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteSimulationData.cs
+++ /dev/null
@@ -1,2274 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections.Generic;
30using System.Data;
31using System.Drawing;
32using System.IO;
33using System.Reflection;
34using log4net;
35using Mono.Data.SqliteClient;
36using OpenMetaverse;
37using OpenSim.Framework;
38using OpenSim.Region.Framework.Interfaces;
39using OpenSim.Region.Framework.Scenes;
40
41namespace OpenSim.Data.SQLiteLegacy
42{
43 /// <summary>
44 /// A RegionData Interface to the SQLite database
45 /// </summary>
46 public class SQLiteSimulationData : ISimulationDataStore
47 {
48 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
49
50 private const string primSelect = "select * from prims";
51 private const string shapeSelect = "select * from primshapes";
52 private const string itemsSelect = "select * from primitems";
53 private const string terrainSelect = "select * from terrain limit 1";
54 private const string landSelect = "select * from land";
55 private const string landAccessListSelect = "select distinct * from landaccesslist";
56 private const string regionbanListSelect = "select * from regionban";
57 private const string regionSettingsSelect = "select * from regionsettings";
58
59 private DataSet ds;
60 private SqliteDataAdapter primDa;
61 private SqliteDataAdapter shapeDa;
62 private SqliteDataAdapter itemsDa;
63 private SqliteDataAdapter terrainDa;
64 private SqliteDataAdapter landDa;
65 private SqliteDataAdapter landAccessListDa;
66 private SqliteDataAdapter regionSettingsDa;
67
68 private SqliteConnection m_conn;
69
70 private String m_connectionString;
71
72 public SQLiteSimulationData()
73 {
74 }
75
76 public SQLiteSimulationData(string connectionString)
77 {
78 Initialise(connectionString);
79 }
80
81 // Temporary attribute while this is experimental
82
83 /***********************************************************************
84 *
85 * Public Interface Functions
86 *
87 **********************************************************************/
88
89 /// <summary>
90 /// <list type="bullet">
91 /// <item>Initialises RegionData Interface</item>
92 /// <item>Loads and initialises a new SQLite connection and maintains it.</item>
93 /// </list>
94 /// </summary>
95 /// <param name="connectionString">the connection string</param>
96 public void Initialise(string connectionString)
97 {
98 m_connectionString = connectionString;
99
100 ds = new DataSet();
101
102 m_log.Info("[REGION DB]: Sqlite - connecting: " + connectionString);
103 m_conn = new SqliteConnection(m_connectionString);
104 m_conn.Open();
105
106
107
108 SqliteCommand primSelectCmd = new SqliteCommand(primSelect, m_conn);
109 primDa = new SqliteDataAdapter(primSelectCmd);
110 // SqliteCommandBuilder primCb = new SqliteCommandBuilder(primDa);
111
112 SqliteCommand shapeSelectCmd = new SqliteCommand(shapeSelect, m_conn);
113 shapeDa = new SqliteDataAdapter(shapeSelectCmd);
114 // SqliteCommandBuilder shapeCb = new SqliteCommandBuilder(shapeDa);
115
116 SqliteCommand itemsSelectCmd = new SqliteCommand(itemsSelect, m_conn);
117 itemsDa = new SqliteDataAdapter(itemsSelectCmd);
118
119 SqliteCommand terrainSelectCmd = new SqliteCommand(terrainSelect, m_conn);
120 terrainDa = new SqliteDataAdapter(terrainSelectCmd);
121
122 SqliteCommand landSelectCmd = new SqliteCommand(landSelect, m_conn);
123 landDa = new SqliteDataAdapter(landSelectCmd);
124
125 SqliteCommand landAccessListSelectCmd = new SqliteCommand(landAccessListSelect, m_conn);
126 landAccessListDa = new SqliteDataAdapter(landAccessListSelectCmd);
127
128 SqliteCommand regionSettingsSelectCmd = new SqliteCommand(regionSettingsSelect, m_conn);
129 regionSettingsDa = new SqliteDataAdapter(regionSettingsSelectCmd);
130 // This actually does the roll forward assembly stuff
131 Assembly assem = GetType().Assembly;
132 Migration m = new Migration(m_conn, assem, "RegionStore");
133 m.Update();
134
135 lock (ds)
136 {
137 ds.Tables.Add(createPrimTable());
138 setupPrimCommands(primDa, m_conn);
139 primDa.Fill(ds.Tables["prims"]);
140
141 ds.Tables.Add(createShapeTable());
142 setupShapeCommands(shapeDa, m_conn);
143
144 ds.Tables.Add(createItemsTable());
145 setupItemsCommands(itemsDa, m_conn);
146 itemsDa.Fill(ds.Tables["primitems"]);
147
148 ds.Tables.Add(createTerrainTable());
149 setupTerrainCommands(terrainDa, m_conn);
150
151 ds.Tables.Add(createLandTable());
152 setupLandCommands(landDa, m_conn);
153
154 ds.Tables.Add(createLandAccessListTable());
155 setupLandAccessCommands(landAccessListDa, m_conn);
156
157 ds.Tables.Add(createRegionSettingsTable());
158
159 setupRegionSettingsCommands(regionSettingsDa, m_conn);
160
161 // WORKAROUND: This is a work around for sqlite on
162 // windows, which gets really unhappy with blob columns
163 // that have no sample data in them. At some point we
164 // need to actually find a proper way to handle this.
165 try
166 {
167 shapeDa.Fill(ds.Tables["primshapes"]);
168 }
169 catch (Exception)
170 {
171 m_log.Info("[REGION DB]: Caught fill error on primshapes table");
172 }
173
174 try
175 {
176 terrainDa.Fill(ds.Tables["terrain"]);
177 }
178 catch (Exception)
179 {
180 m_log.Info("[REGION DB]: Caught fill error on terrain table");
181 }
182
183 try
184 {
185 landDa.Fill(ds.Tables["land"]);
186 }
187 catch (Exception)
188 {
189 m_log.Info("[REGION DB]: Caught fill error on land table");
190 }
191
192 try
193 {
194 landAccessListDa.Fill(ds.Tables["landaccesslist"]);
195 }
196 catch (Exception)
197 {
198 m_log.Info("[REGION DB]: Caught fill error on landaccesslist table");
199 }
200
201 try
202 {
203 regionSettingsDa.Fill(ds.Tables["regionsettings"]);
204 }
205 catch (Exception)
206 {
207 m_log.Info("[REGION DB]: Caught fill error on regionsettings table");
208 }
209 return;
210 }
211 }
212
213 public void Dispose()
214 {
215 if (m_conn != null)
216 {
217 m_conn.Close();
218 m_conn = null;
219 }
220 if (ds != null)
221 {
222 ds.Dispose();
223 ds = null;
224 }
225 if (primDa != null)
226 {
227 primDa.Dispose();
228 primDa = null;
229 }
230 if (shapeDa != null)
231 {
232 shapeDa.Dispose();
233 shapeDa = null;
234 }
235 if (itemsDa != null)
236 {
237 itemsDa.Dispose();
238 itemsDa = null;
239 }
240 if (terrainDa != null)
241 {
242 terrainDa.Dispose();
243 terrainDa = null;
244 }
245 if (landDa != null)
246 {
247 landDa.Dispose();
248 landDa = null;
249 }
250 if (landAccessListDa != null)
251 {
252 landAccessListDa.Dispose();
253 landAccessListDa = null;
254 }
255 if (regionSettingsDa != null)
256 {
257 regionSettingsDa.Dispose();
258 regionSettingsDa = null;
259 }
260 }
261
262 public void StoreRegionSettings(RegionSettings rs)
263 {
264 lock (ds)
265 {
266 DataTable regionsettings = ds.Tables["regionsettings"];
267
268 DataRow settingsRow = regionsettings.Rows.Find(rs.RegionUUID.ToString());
269 if (settingsRow == null)
270 {
271 settingsRow = regionsettings.NewRow();
272 fillRegionSettingsRow(settingsRow, rs);
273 regionsettings.Rows.Add(settingsRow);
274 }
275 else
276 {
277 fillRegionSettingsRow(settingsRow, rs);
278 }
279
280 Commit();
281 }
282 }
283 public RegionLightShareData LoadRegionWindlightSettings(UUID regionUUID)
284 {
285 //This connector doesn't support the windlight module yet
286 //Return default LL windlight settings
287 return new RegionLightShareData();
288 }
289 public void RemoveRegionWindlightSettings(UUID regionID)
290 {
291 }
292 public void StoreRegionWindlightSettings(RegionLightShareData wl)
293 {
294 //This connector doesn't support the windlight module yet
295 }
296 public RegionSettings LoadRegionSettings(UUID regionUUID)
297 {
298 lock (ds)
299 {
300 DataTable regionsettings = ds.Tables["regionsettings"];
301
302 string searchExp = "regionUUID = '" + regionUUID.ToString() + "'";
303 DataRow[] rawsettings = regionsettings.Select(searchExp);
304 if (rawsettings.Length == 0)
305 {
306 RegionSettings rs = new RegionSettings();
307 rs.RegionUUID = regionUUID;
308 rs.OnSave += StoreRegionSettings;
309
310 StoreRegionSettings(rs);
311
312 return rs;
313 }
314 DataRow row = rawsettings[0];
315
316 RegionSettings newSettings = buildRegionSettings(row);
317 newSettings.OnSave += StoreRegionSettings;
318
319 return newSettings;
320 }
321 }
322
323 /// <summary>
324 /// Adds an object into region storage
325 /// </summary>
326 /// <param name="obj">the object</param>
327 /// <param name="regionUUID">the region UUID</param>
328 public void StoreObject(SceneObjectGroup obj, UUID regionUUID)
329 {
330 uint flags = obj.RootPart.GetEffectiveObjectFlags();
331
332 // Eligibility check
333 //
334 if ((flags & (uint)PrimFlags.Temporary) != 0)
335 return;
336 if ((flags & (uint)PrimFlags.TemporaryOnRez) != 0)
337 return;
338
339 lock (ds)
340 {
341 foreach (SceneObjectPart prim in obj.Parts)
342 {
343// m_log.Info("[REGION DB]: Adding obj: " + obj.UUID + " to region: " + regionUUID);
344 addPrim(prim, obj.UUID, regionUUID);
345 }
346 }
347
348 Commit();
349 // m_log.Info("[Dump of prims]: " + ds.GetXml());
350 }
351
352 /// <summary>
353 /// Removes an object from region storage
354 /// </summary>
355 /// <param name="obj">the object</param>
356 /// <param name="regionUUID">the region UUID</param>
357 public void RemoveObject(UUID obj, UUID regionUUID)
358 {
359 // m_log.InfoFormat("[REGION DB]: Removing obj: {0} from region: {1}", obj.Guid, regionUUID);
360
361 DataTable prims = ds.Tables["prims"];
362 DataTable shapes = ds.Tables["primshapes"];
363
364 string selectExp = "SceneGroupID = '" + obj + "' and RegionUUID = '" + regionUUID + "'";
365 lock (ds)
366 {
367 DataRow[] primRows = prims.Select(selectExp);
368 foreach (DataRow row in primRows)
369 {
370 // Remove shape rows
371 UUID uuid = new UUID((string) row["UUID"]);
372 DataRow shapeRow = shapes.Rows.Find(uuid.ToString());
373 if (shapeRow != null)
374 {
375 shapeRow.Delete();
376 }
377
378 RemoveItems(uuid);
379
380 // Remove prim row
381 row.Delete();
382 }
383 }
384
385 Commit();
386 }
387
388 /// <summary>
389 /// Remove all persisted items of the given prim.
390 /// The caller must acquire the necessrary synchronization locks and commit or rollback changes.
391 /// </summary>
392 /// <param name="uuid">The item UUID</param>
393 private void RemoveItems(UUID uuid)
394 {
395 DataTable items = ds.Tables["primitems"];
396
397 String sql = String.Format("primID = '{0}'", uuid);
398 DataRow[] itemRows = items.Select(sql);
399
400 foreach (DataRow itemRow in itemRows)
401 {
402 itemRow.Delete();
403 }
404 }
405
406 /// <summary>
407 /// Load persisted objects from region storage.
408 /// </summary>
409 /// <param name="regionUUID">The region UUID</param>
410 /// <returns>List of loaded groups</returns>
411 public List<SceneObjectGroup> LoadObjects(UUID regionUUID)
412 {
413 Dictionary<UUID, SceneObjectGroup> createdObjects = new Dictionary<UUID, SceneObjectGroup>();
414
415 List<SceneObjectGroup> retvals = new List<SceneObjectGroup>();
416
417 DataTable prims = ds.Tables["prims"];
418 DataTable shapes = ds.Tables["primshapes"];
419
420 string byRegion = "RegionUUID = '" + regionUUID + "'";
421
422 lock (ds)
423 {
424 DataRow[] primsForRegion = prims.Select(byRegion);
425 m_log.Info("[REGION DB]: Loaded " + primsForRegion.Length + " prims for region: " + regionUUID);
426
427 // First, create all groups
428 foreach (DataRow primRow in primsForRegion)
429 {
430 try
431 {
432 SceneObjectPart prim = null;
433
434 string uuid = (string) primRow["UUID"];
435 string objID = (string) primRow["SceneGroupID"];
436
437 if (uuid == objID) //is new SceneObjectGroup ?
438 {
439 prim = buildPrim(primRow);
440 DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString());
441 if (shapeRow != null)
442 {
443 prim.Shape = buildShape(shapeRow);
444 }
445 else
446 {
447 m_log.Info(
448 "[REGION DB]: No shape found for prim in storage, so setting default box shape");
449 prim.Shape = PrimitiveBaseShape.Default;
450 }
451
452 SceneObjectGroup group = new SceneObjectGroup(prim);
453 createdObjects.Add(group.UUID, group);
454 retvals.Add(group);
455 LoadItems(prim);
456 }
457 }
458 catch (Exception e)
459 {
460 m_log.Error("[REGION DB]: Failed create prim object in new group, exception and data follows");
461 m_log.Info("[REGION DB]: " + e.ToString());
462 foreach (DataColumn col in prims.Columns)
463 {
464 m_log.Info("[REGION DB]: Col: " + col.ColumnName + " => " + primRow[col]);
465 }
466 }
467 }
468
469 // Now fill the groups with part data
470 foreach (DataRow primRow in primsForRegion)
471 {
472 try
473 {
474 SceneObjectPart prim = null;
475
476 string uuid = (string) primRow["UUID"];
477 string objID = (string) primRow["SceneGroupID"];
478 if (uuid != objID) //is new SceneObjectGroup ?
479 {
480 prim = buildPrim(primRow);
481 DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString());
482 if (shapeRow != null)
483 {
484 prim.Shape = buildShape(shapeRow);
485 }
486 else
487 {
488 m_log.Warn(
489 "[REGION DB]: No shape found for prim in storage, so setting default box shape");
490 prim.Shape = PrimitiveBaseShape.Default;
491 }
492
493 createdObjects[new UUID(objID)].AddPart(prim);
494 LoadItems(prim);
495 }
496 }
497 catch (Exception e)
498 {
499 m_log.Error("[REGION DB]: Failed create prim object in group, exception and data follows");
500 m_log.Info("[REGION DB]: " + e.ToString());
501 foreach (DataColumn col in prims.Columns)
502 {
503 m_log.Info("[REGION DB]: Col: " + col.ColumnName + " => " + primRow[col]);
504 }
505 }
506 }
507 }
508 return retvals;
509 }
510
511 /// <summary>
512 /// Load in a prim's persisted inventory.
513 /// </summary>
514 /// <param name="prim">the prim</param>
515 private void LoadItems(SceneObjectPart prim)
516 {
517 //m_log.DebugFormat("[DATASTORE]: Loading inventory for {0}, {1}", prim.Name, prim.UUID);
518
519 DataTable dbItems = ds.Tables["primitems"];
520 String sql = String.Format("primID = '{0}'", prim.UUID.ToString());
521 DataRow[] dbItemRows = dbItems.Select(sql);
522 IList<TaskInventoryItem> inventory = new List<TaskInventoryItem>();
523
524 foreach (DataRow row in dbItemRows)
525 {
526 TaskInventoryItem item = buildItem(row);
527 inventory.Add(item);
528
529 //m_log.DebugFormat("[DATASTORE]: Restored item {0}, {1}", item.Name, item.ItemID);
530 }
531
532 prim.Inventory.RestoreInventoryItems(inventory);
533 }
534
535 /// <summary>
536 /// Store a terrain revision in region storage
537 /// </summary>
538 /// <param name="ter">terrain heightfield</param>
539 /// <param name="regionID">region UUID</param>
540 public void StoreTerrain(double[,] ter, UUID regionID)
541 {
542 lock (ds)
543 {
544 int revision = Util.UnixTimeSinceEpoch();
545
546 // This is added to get rid of the infinitely growing
547 // terrain databases which negatively impact on SQLite
548 // over time. Before reenabling this feature there
549 // needs to be a limitter put on the number of
550 // revisions in the database, as this old
551 // implementation is a DOS attack waiting to happen.
552
553 using (
554 SqliteCommand cmd =
555 new SqliteCommand("delete from terrain where RegionUUID=:RegionUUID and Revision <= :Revision",
556 m_conn))
557 {
558 cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
559 cmd.Parameters.Add(new SqliteParameter(":Revision", revision));
560 cmd.ExecuteNonQuery();
561 }
562
563 // the following is an work around for .NET. The perf
564 // issues associated with it aren't as bad as you think.
565 m_log.Info("[REGION DB]: Storing terrain revision r" + revision.ToString());
566 String sql = "insert into terrain(RegionUUID, Revision, Heightfield)" +
567 " values(:RegionUUID, :Revision, :Heightfield)";
568
569 using (SqliteCommand cmd = new SqliteCommand(sql, m_conn))
570 {
571 cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
572 cmd.Parameters.Add(new SqliteParameter(":Revision", revision));
573 cmd.Parameters.Add(new SqliteParameter(":Heightfield", serializeTerrain(ter)));
574 cmd.ExecuteNonQuery();
575 }
576 }
577 }
578
579 /// <summary>
580 /// Load the latest terrain revision from region storage
581 /// </summary>
582 /// <param name="regionID">the region UUID</param>
583 /// <returns>Heightfield data</returns>
584 public double[,] LoadTerrain(UUID regionID)
585 {
586 lock (ds)
587 {
588 double[,] terret = new double[(int)Constants.RegionSize, (int)Constants.RegionSize];
589 terret.Initialize();
590
591 String sql = "select RegionUUID, Revision, Heightfield from terrain" +
592 " where RegionUUID=:RegionUUID order by Revision desc";
593
594 using (SqliteCommand cmd = new SqliteCommand(sql, m_conn))
595 {
596 cmd.Parameters.Add(new SqliteParameter(":RegionUUID", regionID.ToString()));
597
598 using (IDataReader row = cmd.ExecuteReader())
599 {
600 int rev = 0;
601 if (row.Read())
602 {
603 // TODO: put this into a function
604 using (MemoryStream str = new MemoryStream((byte[])row["Heightfield"]))
605 {
606 using (BinaryReader br = new BinaryReader(str))
607 {
608 for (int x = 0; x < (int)Constants.RegionSize; x++)
609 {
610 for (int y = 0; y < (int)Constants.RegionSize; y++)
611 {
612 terret[x, y] = br.ReadDouble();
613 }
614 }
615 }
616 }
617 rev = (int) row["Revision"];
618 }
619 else
620 {
621 m_log.Info("[REGION DB]: No terrain found for region");
622 return null;
623 }
624
625 m_log.Info("[REGION DB]: Loaded terrain revision r" + rev.ToString());
626 }
627 }
628 return terret;
629 }
630 }
631
632 /// <summary>
633 ///
634 /// </summary>
635 /// <param name="globalID"></param>
636 public void RemoveLandObject(UUID globalID)
637 {
638 lock (ds)
639 {
640 // Can't use blanket SQL statements when using SqlAdapters unless you re-read the data into the adapter
641 // after you're done.
642 // replaced below code with the SqliteAdapter version.
643 //using (SqliteCommand cmd = new SqliteCommand("delete from land where UUID=:UUID", m_conn))
644 //{
645 // cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
646 // cmd.ExecuteNonQuery();
647 //}
648
649 //using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:UUID", m_conn))
650 //{
651 // cmd.Parameters.Add(new SqliteParameter(":UUID", globalID.ToString()));
652 // cmd.ExecuteNonQuery();
653 //}
654
655 DataTable land = ds.Tables["land"];
656 DataTable landaccesslist = ds.Tables["landaccesslist"];
657 DataRow landRow = land.Rows.Find(globalID.ToString());
658 if (landRow != null)
659 {
660 landRow.Delete();
661 land.Rows.Remove(landRow);
662 }
663 List<DataRow> rowsToDelete = new List<DataRow>();
664 foreach (DataRow rowToCheck in landaccesslist.Rows)
665 {
666 if (rowToCheck["LandUUID"].ToString() == globalID.ToString())
667 rowsToDelete.Add(rowToCheck);
668 }
669 for (int iter = 0; iter < rowsToDelete.Count; iter++)
670 {
671 rowsToDelete[iter].Delete();
672 landaccesslist.Rows.Remove(rowsToDelete[iter]);
673 }
674
675
676 }
677 Commit();
678 }
679
680 /// <summary>
681 ///
682 /// </summary>
683 /// <param name="parcel"></param>
684 public void StoreLandObject(ILandObject parcel)
685 {
686 lock (ds)
687 {
688 DataTable land = ds.Tables["land"];
689 DataTable landaccesslist = ds.Tables["landaccesslist"];
690
691 DataRow landRow = land.Rows.Find(parcel.LandData.GlobalID.ToString());
692 if (landRow == null)
693 {
694 landRow = land.NewRow();
695 fillLandRow(landRow, parcel.LandData, parcel.RegionUUID);
696 land.Rows.Add(landRow);
697 }
698 else
699 {
700 fillLandRow(landRow, parcel.LandData, parcel.RegionUUID);
701 }
702
703 // I know this caused someone issues before, but OpenSim is unusable if we leave this stuff around
704 //using (SqliteCommand cmd = new SqliteCommand("delete from landaccesslist where LandUUID=:LandUUID", m_conn))
705 //{
706 // cmd.Parameters.Add(new SqliteParameter(":LandUUID", parcel.LandData.GlobalID.ToString()));
707 // cmd.ExecuteNonQuery();
708
709// }
710
711 // This is the slower.. but more appropriate thing to do
712
713 // We can't modify the table with direct queries before calling Commit() and re-filling them.
714 List<DataRow> rowsToDelete = new List<DataRow>();
715 foreach (DataRow rowToCheck in landaccesslist.Rows)
716 {
717 if (rowToCheck["LandUUID"].ToString() == parcel.LandData.GlobalID.ToString())
718 rowsToDelete.Add(rowToCheck);
719 }
720 for (int iter = 0; iter < rowsToDelete.Count; iter++)
721 {
722 rowsToDelete[iter].Delete();
723 landaccesslist.Rows.Remove(rowsToDelete[iter]);
724 }
725 rowsToDelete.Clear();
726 foreach (ParcelManager.ParcelAccessEntry entry in parcel.LandData.ParcelAccessList)
727 {
728 DataRow newAccessRow = landaccesslist.NewRow();
729 fillLandAccessRow(newAccessRow, entry, parcel.LandData.GlobalID);
730 landaccesslist.Rows.Add(newAccessRow);
731 }
732 }
733
734 Commit();
735 }
736
737 /// <summary>
738 ///
739 /// </summary>
740 /// <param name="regionUUID"></param>
741 /// <returns></returns>
742 public List<LandData> LoadLandObjects(UUID regionUUID)
743 {
744 List<LandData> landDataForRegion = new List<LandData>();
745 lock (ds)
746 {
747 DataTable land = ds.Tables["land"];
748 DataTable landaccesslist = ds.Tables["landaccesslist"];
749 string searchExp = "RegionUUID = '" + regionUUID + "'";
750 DataRow[] rawDataForRegion = land.Select(searchExp);
751 foreach (DataRow rawDataLand in rawDataForRegion)
752 {
753 LandData newLand = buildLandData(rawDataLand);
754 string accessListSearchExp = "LandUUID = '" + newLand.GlobalID + "'";
755 DataRow[] rawDataForLandAccessList = landaccesslist.Select(accessListSearchExp);
756 foreach (DataRow rawDataLandAccess in rawDataForLandAccessList)
757 {
758 newLand.ParcelAccessList.Add(buildLandAccessData(rawDataLandAccess));
759 }
760
761 landDataForRegion.Add(newLand);
762 }
763 }
764 return landDataForRegion;
765 }
766
767 /// <summary>
768 ///
769 /// </summary>
770 public void Commit()
771 {
772 lock (ds)
773 {
774 primDa.Update(ds, "prims");
775 shapeDa.Update(ds, "primshapes");
776
777 itemsDa.Update(ds, "primitems");
778
779 terrainDa.Update(ds, "terrain");
780 landDa.Update(ds, "land");
781 landAccessListDa.Update(ds, "landaccesslist");
782 try
783 {
784 regionSettingsDa.Update(ds, "regionsettings");
785 }
786 catch (SqliteExecutionException SqlEx)
787 {
788 if (SqlEx.Message.Contains("logic error"))
789 {
790 throw new Exception(
791 "There was a SQL error or connection string configuration error when saving the region settings. This could be a bug, it could also happen if ConnectionString is defined in the [DatabaseService] section of StandaloneCommon.ini in the config_include folder. This could also happen if the config_include folder doesn't exist or if the OpenSim.ini [Architecture] section isn't set. If this is your first time running OpenSimulator, please restart the simulator and bug a developer to fix this!",
792 SqlEx);
793 }
794 else
795 {
796 throw SqlEx;
797 }
798 }
799 ds.AcceptChanges();
800 }
801 }
802
803 /// <summary>
804 /// See <see cref="Commit"/>
805 /// </summary>
806 public void Shutdown()
807 {
808 Commit();
809 }
810
811 /***********************************************************************
812 *
813 * Database Definition Functions
814 *
815 * This should be db agnostic as we define them in ADO.NET terms
816 *
817 **********************************************************************/
818
819 /// <summary>
820 ///
821 /// </summary>
822 /// <param name="dt"></param>
823 /// <param name="name"></param>
824 /// <param name="type"></param>
825 private static void createCol(DataTable dt, string name, Type type)
826 {
827 DataColumn col = new DataColumn(name, type);
828 dt.Columns.Add(col);
829 }
830
831 /// <summary>
832 /// Creates the "terrain" table
833 /// </summary>
834 /// <returns>terrain table DataTable</returns>
835 private static DataTable createTerrainTable()
836 {
837 DataTable terrain = new DataTable("terrain");
838
839 createCol(terrain, "RegionUUID", typeof (String));
840 createCol(terrain, "Revision", typeof (Int32));
841 createCol(terrain, "Heightfield", typeof (Byte[]));
842
843 return terrain;
844 }
845
846 /// <summary>
847 /// Creates the "prims" table
848 /// </summary>
849 /// <returns>prim table DataTable</returns>
850 private static DataTable createPrimTable()
851 {
852 DataTable prims = new DataTable("prims");
853
854 createCol(prims, "UUID", typeof (String));
855 createCol(prims, "RegionUUID", typeof (String));
856 createCol(prims, "CreationDate", typeof (Int32));
857 createCol(prims, "Name", typeof (String));
858 createCol(prims, "SceneGroupID", typeof (String));
859 // various text fields
860 createCol(prims, "Text", typeof (String));
861 createCol(prims, "ColorR", typeof (Int32));
862 createCol(prims, "ColorG", typeof (Int32));
863 createCol(prims, "ColorB", typeof (Int32));
864 createCol(prims, "ColorA", typeof (Int32));
865 createCol(prims, "Description", typeof (String));
866 createCol(prims, "SitName", typeof (String));
867 createCol(prims, "TouchName", typeof (String));
868 // permissions
869 createCol(prims, "ObjectFlags", typeof (Int32));
870 createCol(prims, "CreatorID", typeof (String));
871 createCol(prims, "OwnerID", typeof (String));
872 createCol(prims, "GroupID", typeof (String));
873 createCol(prims, "LastOwnerID", typeof (String));
874 createCol(prims, "OwnerMask", typeof (Int32));
875 createCol(prims, "NextOwnerMask", typeof (Int32));
876 createCol(prims, "GroupMask", typeof (Int32));
877 createCol(prims, "EveryoneMask", typeof (Int32));
878 createCol(prims, "BaseMask", typeof (Int32));
879 // vectors
880 createCol(prims, "PositionX", typeof (Double));
881 createCol(prims, "PositionY", typeof (Double));
882 createCol(prims, "PositionZ", typeof (Double));
883 createCol(prims, "GroupPositionX", typeof (Double));
884 createCol(prims, "GroupPositionY", typeof (Double));
885 createCol(prims, "GroupPositionZ", typeof (Double));
886 createCol(prims, "VelocityX", typeof (Double));
887 createCol(prims, "VelocityY", typeof (Double));
888 createCol(prims, "VelocityZ", typeof (Double));
889 createCol(prims, "AngularVelocityX", typeof (Double));
890 createCol(prims, "AngularVelocityY", typeof (Double));
891 createCol(prims, "AngularVelocityZ", typeof (Double));
892 createCol(prims, "AccelerationX", typeof (Double));
893 createCol(prims, "AccelerationY", typeof (Double));
894 createCol(prims, "AccelerationZ", typeof (Double));
895 // quaternions
896 createCol(prims, "RotationX", typeof (Double));
897 createCol(prims, "RotationY", typeof (Double));
898 createCol(prims, "RotationZ", typeof (Double));
899 createCol(prims, "RotationW", typeof (Double));
900
901 // sit target
902 createCol(prims, "SitTargetOffsetX", typeof (Double));
903 createCol(prims, "SitTargetOffsetY", typeof (Double));
904 createCol(prims, "SitTargetOffsetZ", typeof (Double));
905
906 createCol(prims, "SitTargetOrientW", typeof (Double));
907 createCol(prims, "SitTargetOrientX", typeof (Double));
908 createCol(prims, "SitTargetOrientY", typeof (Double));
909 createCol(prims, "SitTargetOrientZ", typeof (Double));
910
911 createCol(prims, "PayPrice", typeof(Int32));
912 createCol(prims, "PayButton1", typeof(Int32));
913 createCol(prims, "PayButton2", typeof(Int32));
914 createCol(prims, "PayButton3", typeof(Int32));
915 createCol(prims, "PayButton4", typeof(Int32));
916
917 createCol(prims, "LoopedSound", typeof(String));
918 createCol(prims, "LoopedSoundGain", typeof(Double));
919 createCol(prims, "TextureAnimation", typeof(String));
920 createCol(prims, "ParticleSystem", typeof(String));
921
922 createCol(prims, "OmegaX", typeof(Double));
923 createCol(prims, "OmegaY", typeof(Double));
924 createCol(prims, "OmegaZ", typeof(Double));
925
926 createCol(prims, "CameraEyeOffsetX", typeof(Double));
927 createCol(prims, "CameraEyeOffsetY", typeof(Double));
928 createCol(prims, "CameraEyeOffsetZ", typeof(Double));
929
930 createCol(prims, "CameraAtOffsetX", typeof(Double));
931 createCol(prims, "CameraAtOffsetY", typeof(Double));
932 createCol(prims, "CameraAtOffsetZ", typeof(Double));
933
934 createCol(prims, "ForceMouselook", typeof(Int16));
935
936 createCol(prims, "ScriptAccessPin", typeof(Int32));
937
938 createCol(prims, "AllowedDrop", typeof(Int16));
939 createCol(prims, "DieAtEdge", typeof(Int16));
940
941 createCol(prims, "SalePrice", typeof(Int32));
942 createCol(prims, "SaleType", typeof(Int16));
943
944 // click action
945 createCol(prims, "ClickAction", typeof (Byte));
946
947 createCol(prims, "Material", typeof(Byte));
948
949 createCol(prims, "CollisionSound", typeof(String));
950 createCol(prims, "CollisionSoundVolume", typeof(Double));
951
952 createCol(prims, "VolumeDetect", typeof(Int16));
953
954 // Add in contraints
955 prims.PrimaryKey = new DataColumn[] {prims.Columns["UUID"]};
956
957 return prims;
958 }
959
960 /// <summary>
961 /// Creates "primshapes" table
962 /// </summary>
963 /// <returns>shape table DataTable</returns>
964 private static DataTable createShapeTable()
965 {
966 DataTable shapes = new DataTable("primshapes");
967 createCol(shapes, "UUID", typeof (String));
968 // shape is an enum
969 createCol(shapes, "Shape", typeof (Int32));
970 // vectors
971 createCol(shapes, "ScaleX", typeof (Double));
972 createCol(shapes, "ScaleY", typeof (Double));
973 createCol(shapes, "ScaleZ", typeof (Double));
974 // paths
975 createCol(shapes, "PCode", typeof (Int32));
976 createCol(shapes, "PathBegin", typeof (Int32));
977 createCol(shapes, "PathEnd", typeof (Int32));
978 createCol(shapes, "PathScaleX", typeof (Int32));
979 createCol(shapes, "PathScaleY", typeof (Int32));
980 createCol(shapes, "PathShearX", typeof (Int32));
981 createCol(shapes, "PathShearY", typeof (Int32));
982 createCol(shapes, "PathSkew", typeof (Int32));
983 createCol(shapes, "PathCurve", typeof (Int32));
984 createCol(shapes, "PathRadiusOffset", typeof (Int32));
985 createCol(shapes, "PathRevolutions", typeof (Int32));
986 createCol(shapes, "PathTaperX", typeof (Int32));
987 createCol(shapes, "PathTaperY", typeof (Int32));
988 createCol(shapes, "PathTwist", typeof (Int32));
989 createCol(shapes, "PathTwistBegin", typeof (Int32));
990 // profile
991 createCol(shapes, "ProfileBegin", typeof (Int32));
992 createCol(shapes, "ProfileEnd", typeof (Int32));
993 createCol(shapes, "ProfileCurve", typeof (Int32));
994 createCol(shapes, "ProfileHollow", typeof (Int32));
995 createCol(shapes, "State", typeof(Int32));
996 // text TODO: this isn't right, but I'm not sure the right
997 // way to specify this as a blob atm
998 createCol(shapes, "Texture", typeof (Byte[]));
999 createCol(shapes, "ExtraParams", typeof (Byte[]));
1000
1001 shapes.PrimaryKey = new DataColumn[] {shapes.Columns["UUID"]};
1002
1003 return shapes;
1004 }
1005
1006 /// <summary>
1007 /// creates "primitems" table
1008 /// </summary>
1009 /// <returns>item table DataTable</returns>
1010 private static DataTable createItemsTable()
1011 {
1012 DataTable items = new DataTable("primitems");
1013
1014 createCol(items, "itemID", typeof (String));
1015 createCol(items, "primID", typeof (String));
1016 createCol(items, "assetID", typeof (String));
1017 createCol(items, "parentFolderID", typeof (String));
1018
1019 createCol(items, "invType", typeof (Int32));
1020 createCol(items, "assetType", typeof (Int32));
1021
1022 createCol(items, "name", typeof (String));
1023 createCol(items, "description", typeof (String));
1024
1025 createCol(items, "creationDate", typeof (Int64));
1026 createCol(items, "creatorID", typeof (String));
1027 createCol(items, "ownerID", typeof (String));
1028 createCol(items, "lastOwnerID", typeof (String));
1029 createCol(items, "groupID", typeof (String));
1030
1031 createCol(items, "nextPermissions", typeof (UInt32));
1032 createCol(items, "currentPermissions", typeof (UInt32));
1033 createCol(items, "basePermissions", typeof (UInt32));
1034 createCol(items, "everyonePermissions", typeof (UInt32));
1035 createCol(items, "groupPermissions", typeof (UInt32));
1036 createCol(items, "flags", typeof (UInt32));
1037
1038 items.PrimaryKey = new DataColumn[] { items.Columns["itemID"] };
1039
1040 return items;
1041 }
1042
1043 /// <summary>
1044 /// Creates "land" table
1045 /// </summary>
1046 /// <returns>land table DataTable</returns>
1047 private static DataTable createLandTable()
1048 {
1049 DataTable land = new DataTable("land");
1050 createCol(land, "UUID", typeof (String));
1051 createCol(land, "RegionUUID", typeof (String));
1052 createCol(land, "LocalLandID", typeof (UInt32));
1053
1054 // Bitmap is a byte[512]
1055 createCol(land, "Bitmap", typeof (Byte[]));
1056
1057 createCol(land, "Name", typeof (String));
1058 createCol(land, "Desc", typeof (String));
1059 createCol(land, "OwnerUUID", typeof (String));
1060 createCol(land, "IsGroupOwned", typeof (Boolean));
1061 createCol(land, "Area", typeof (Int32));
1062 createCol(land, "AuctionID", typeof (Int32)); //Unemplemented
1063 createCol(land, "Category", typeof (Int32)); //Enum OpenMetaverse.Parcel.ParcelCategory
1064 createCol(land, "ClaimDate", typeof (Int32));
1065 createCol(land, "ClaimPrice", typeof (Int32));
1066 createCol(land, "GroupUUID", typeof (string));
1067 createCol(land, "SalePrice", typeof (Int32));
1068 createCol(land, "LandStatus", typeof (Int32)); //Enum. OpenMetaverse.Parcel.ParcelStatus
1069 createCol(land, "LandFlags", typeof (UInt32));
1070 createCol(land, "LandingType", typeof (Byte));
1071 createCol(land, "MediaAutoScale", typeof (Byte));
1072 createCol(land, "MediaTextureUUID", typeof (String));
1073 createCol(land, "MediaURL", typeof (String));
1074 createCol(land, "MusicURL", typeof (String));
1075 createCol(land, "PassHours", typeof (Double));
1076 createCol(land, "PassPrice", typeof (UInt32));
1077 createCol(land, "SnapshotUUID", typeof (String));
1078 createCol(land, "UserLocationX", typeof (Double));
1079 createCol(land, "UserLocationY", typeof (Double));
1080 createCol(land, "UserLocationZ", typeof (Double));
1081 createCol(land, "UserLookAtX", typeof (Double));
1082 createCol(land, "UserLookAtY", typeof (Double));
1083 createCol(land, "UserLookAtZ", typeof (Double));
1084 createCol(land, "AuthbuyerID", typeof(String));
1085 createCol(land, "OtherCleanTime", typeof(Int32));
1086
1087 land.PrimaryKey = new DataColumn[] {land.Columns["UUID"]};
1088
1089 return land;
1090 }
1091
1092 /// <summary>
1093 /// create "landaccesslist" table
1094 /// </summary>
1095 /// <returns>Landacceslist DataTable</returns>
1096 private static DataTable createLandAccessListTable()
1097 {
1098 DataTable landaccess = new DataTable("landaccesslist");
1099 createCol(landaccess, "LandUUID", typeof (String));
1100 createCol(landaccess, "AccessUUID", typeof (String));
1101 createCol(landaccess, "Flags", typeof (UInt32));
1102
1103 return landaccess;
1104 }
1105
1106 private static DataTable createRegionSettingsTable()
1107 {
1108 DataTable regionsettings = new DataTable("regionsettings");
1109 createCol(regionsettings, "regionUUID", typeof(String));
1110 createCol(regionsettings, "block_terraform", typeof (Int32));
1111 createCol(regionsettings, "block_fly", typeof (Int32));
1112 createCol(regionsettings, "allow_damage", typeof (Int32));
1113 createCol(regionsettings, "restrict_pushing", typeof (Int32));
1114 createCol(regionsettings, "allow_land_resell", typeof (Int32));
1115 createCol(regionsettings, "allow_land_join_divide", typeof (Int32));
1116 createCol(regionsettings, "block_show_in_search", typeof (Int32));
1117 createCol(regionsettings, "agent_limit", typeof (Int32));
1118 createCol(regionsettings, "object_bonus", typeof (Double));
1119 createCol(regionsettings, "maturity", typeof (Int32));
1120 createCol(regionsettings, "disable_scripts", typeof (Int32));
1121 createCol(regionsettings, "disable_collisions", typeof (Int32));
1122 createCol(regionsettings, "disable_physics", typeof (Int32));
1123 createCol(regionsettings, "terrain_texture_1", typeof(String));
1124 createCol(regionsettings, "terrain_texture_2", typeof(String));
1125 createCol(regionsettings, "terrain_texture_3", typeof(String));
1126 createCol(regionsettings, "terrain_texture_4", typeof(String));
1127 createCol(regionsettings, "elevation_1_nw", typeof (Double));
1128 createCol(regionsettings, "elevation_2_nw", typeof (Double));
1129 createCol(regionsettings, "elevation_1_ne", typeof (Double));
1130 createCol(regionsettings, "elevation_2_ne", typeof (Double));
1131 createCol(regionsettings, "elevation_1_se", typeof (Double));
1132 createCol(regionsettings, "elevation_2_se", typeof (Double));
1133 createCol(regionsettings, "elevation_1_sw", typeof (Double));
1134 createCol(regionsettings, "elevation_2_sw", typeof (Double));
1135 createCol(regionsettings, "water_height", typeof (Double));
1136 createCol(regionsettings, "terrain_raise_limit", typeof (Double));
1137 createCol(regionsettings, "terrain_lower_limit", typeof (Double));
1138 createCol(regionsettings, "use_estate_sun", typeof (Int32));
1139 createCol(regionsettings, "sandbox", typeof (Int32));
1140 createCol(regionsettings, "sunvectorx",typeof (Double));
1141 createCol(regionsettings, "sunvectory",typeof (Double));
1142 createCol(regionsettings, "sunvectorz",typeof (Double));
1143 createCol(regionsettings, "fixed_sun", typeof (Int32));
1144 createCol(regionsettings, "sun_position", typeof (Double));
1145 createCol(regionsettings, "covenant", typeof(String));
1146 regionsettings.PrimaryKey = new DataColumn[] { regionsettings.Columns["regionUUID"] };
1147 return regionsettings;
1148 }
1149
1150 /***********************************************************************
1151 *
1152 * Convert between ADO.NET <=> OpenSim Objects
1153 *
1154 * These should be database independant
1155 *
1156 **********************************************************************/
1157
1158 /// <summary>
1159 ///
1160 /// </summary>
1161 /// <param name="row"></param>
1162 /// <returns></returns>
1163 private SceneObjectPart buildPrim(DataRow row)
1164 {
1165 // Code commented. Uncomment to test the unit test inline.
1166
1167 // The unit test mentions this commented code for the purposes
1168 // of debugging a unit test failure
1169
1170 // SceneObjectGroup sog = new SceneObjectGroup();
1171 // SceneObjectPart sop = new SceneObjectPart();
1172 // sop.LocalId = 1;
1173 // sop.Name = "object1";
1174 // sop.Description = "object1";
1175 // sop.Text = "";
1176 // sop.SitName = "";
1177 // sop.TouchName = "";
1178 // sop.UUID = UUID.Random();
1179 // sop.Shape = PrimitiveBaseShape.Default;
1180 // sog.SetRootPart(sop);
1181 // Add breakpoint in above line. Check sop fields.
1182
1183 // TODO: this doesn't work yet because something more
1184 // interesting has to be done to actually get these values
1185 // back out. Not enough time to figure it out yet.
1186
1187 SceneObjectPart prim = new SceneObjectPart();
1188 prim.UUID = new UUID((String) row["UUID"]);
1189 // explicit conversion of integers is required, which sort
1190 // of sucks. No idea if there is a shortcut here or not.
1191 prim.CreationDate = Convert.ToInt32(row["CreationDate"]);
1192 prim.Name = row["Name"] == DBNull.Value ? string.Empty : (string)row["Name"];
1193 // various text fields
1194 prim.Text = (String) row["Text"];
1195 prim.Color = Color.FromArgb(Convert.ToInt32(row["ColorA"]),
1196 Convert.ToInt32(row["ColorR"]),
1197 Convert.ToInt32(row["ColorG"]),
1198 Convert.ToInt32(row["ColorB"]));
1199 prim.Description = (String) row["Description"];
1200 prim.SitName = (String) row["SitName"];
1201 prim.TouchName = (String) row["TouchName"];
1202 // permissions
1203 prim.Flags = (PrimFlags)Convert.ToUInt32(row["ObjectFlags"]);
1204 prim.CreatorIdentification = (String) row["CreatorID"];
1205 prim.OwnerID = new UUID((String) row["OwnerID"]);
1206 prim.GroupID = new UUID((String) row["GroupID"]);
1207 prim.LastOwnerID = new UUID((String) row["LastOwnerID"]);
1208 prim.OwnerMask = Convert.ToUInt32(row["OwnerMask"]);
1209 prim.NextOwnerMask = Convert.ToUInt32(row["NextOwnerMask"]);
1210 prim.GroupMask = Convert.ToUInt32(row["GroupMask"]);
1211 prim.EveryoneMask = Convert.ToUInt32(row["EveryoneMask"]);
1212 prim.BaseMask = Convert.ToUInt32(row["BaseMask"]);
1213 // vectors
1214 prim.OffsetPosition = new Vector3(
1215 Convert.ToSingle(row["PositionX"]),
1216 Convert.ToSingle(row["PositionY"]),
1217 Convert.ToSingle(row["PositionZ"])
1218 );
1219 prim.GroupPosition = new Vector3(
1220 Convert.ToSingle(row["GroupPositionX"]),
1221 Convert.ToSingle(row["GroupPositionY"]),
1222 Convert.ToSingle(row["GroupPositionZ"])
1223 );
1224 prim.Velocity = new Vector3(
1225 Convert.ToSingle(row["VelocityX"]),
1226 Convert.ToSingle(row["VelocityY"]),
1227 Convert.ToSingle(row["VelocityZ"])
1228 );
1229 prim.AngularVelocity = new Vector3(
1230 Convert.ToSingle(row["AngularVelocityX"]),
1231 Convert.ToSingle(row["AngularVelocityY"]),
1232 Convert.ToSingle(row["AngularVelocityZ"])
1233 );
1234 prim.Acceleration = new Vector3(
1235 Convert.ToSingle(row["AccelerationX"]),
1236 Convert.ToSingle(row["AccelerationY"]),
1237 Convert.ToSingle(row["AccelerationZ"])
1238 );
1239 // quaternions
1240 prim.RotationOffset = new Quaternion(
1241 Convert.ToSingle(row["RotationX"]),
1242 Convert.ToSingle(row["RotationY"]),
1243 Convert.ToSingle(row["RotationZ"]),
1244 Convert.ToSingle(row["RotationW"])
1245 );
1246
1247 prim.SitTargetPositionLL = new Vector3(
1248 Convert.ToSingle(row["SitTargetOffsetX"]),
1249 Convert.ToSingle(row["SitTargetOffsetY"]),
1250 Convert.ToSingle(row["SitTargetOffsetZ"]));
1251 prim.SitTargetOrientationLL = new Quaternion(
1252 Convert.ToSingle(
1253 row["SitTargetOrientX"]),
1254 Convert.ToSingle(
1255 row["SitTargetOrientY"]),
1256 Convert.ToSingle(
1257 row["SitTargetOrientZ"]),
1258 Convert.ToSingle(
1259 row["SitTargetOrientW"]));
1260
1261 prim.ClickAction = Convert.ToByte(row["ClickAction"]);
1262 prim.PayPrice[0] = Convert.ToInt32(row["PayPrice"]);
1263 prim.PayPrice[1] = Convert.ToInt32(row["PayButton1"]);
1264 prim.PayPrice[2] = Convert.ToInt32(row["PayButton2"]);
1265 prim.PayPrice[3] = Convert.ToInt32(row["PayButton3"]);
1266 prim.PayPrice[4] = Convert.ToInt32(row["PayButton4"]);
1267
1268 prim.Sound = new UUID(row["LoopedSound"].ToString());
1269 prim.SoundGain = Convert.ToSingle(row["LoopedSoundGain"]);
1270 prim.SoundFlags = 1; // If it's persisted at all, it's looped
1271
1272 if (!row.IsNull("TextureAnimation"))
1273 prim.TextureAnimation = Convert.FromBase64String(row["TextureAnimation"].ToString());
1274 if (!row.IsNull("ParticleSystem"))
1275 prim.ParticleSystem = Convert.FromBase64String(row["ParticleSystem"].ToString());
1276
1277 prim.AngularVelocity = new Vector3(
1278 Convert.ToSingle(row["OmegaX"]),
1279 Convert.ToSingle(row["OmegaY"]),
1280 Convert.ToSingle(row["OmegaZ"])
1281 );
1282
1283 prim.SetCameraEyeOffset(new Vector3(
1284 Convert.ToSingle(row["CameraEyeOffsetX"]),
1285 Convert.ToSingle(row["CameraEyeOffsetY"]),
1286 Convert.ToSingle(row["CameraEyeOffsetZ"])
1287 ));
1288
1289 prim.SetCameraAtOffset(new Vector3(
1290 Convert.ToSingle(row["CameraAtOffsetX"]),
1291 Convert.ToSingle(row["CameraAtOffsetY"]),
1292 Convert.ToSingle(row["CameraAtOffsetZ"])
1293 ));
1294
1295 if (Convert.ToInt16(row["ForceMouselook"]) != 0)
1296 prim.SetForceMouselook(true);
1297
1298 prim.ScriptAccessPin = Convert.ToInt32(row["ScriptAccessPin"]);
1299
1300 if (Convert.ToInt16(row["AllowedDrop"]) != 0)
1301 prim.AllowedDrop = true;
1302
1303 if (Convert.ToInt16(row["DieAtEdge"]) != 0)
1304 prim.DIE_AT_EDGE = true;
1305
1306 prim.SalePrice = Convert.ToInt32(row["SalePrice"]);
1307 prim.ObjectSaleType = Convert.ToByte(row["SaleType"]);
1308
1309 prim.Material = Convert.ToByte(row["Material"]);
1310
1311 prim.CollisionSound = new UUID(row["CollisionSound"].ToString());
1312 prim.CollisionSoundVolume = Convert.ToSingle(row["CollisionSoundVolume"]);
1313
1314 if (Convert.ToInt16(row["VolumeDetect"]) != 0)
1315 prim.VolumeDetectActive = true;
1316
1317 return prim;
1318 }
1319
1320 /// <summary>
1321 /// Build a prim inventory item from the persisted data.
1322 /// </summary>
1323 /// <param name="row"></param>
1324 /// <returns></returns>
1325 private static TaskInventoryItem buildItem(DataRow row)
1326 {
1327 TaskInventoryItem taskItem = new TaskInventoryItem();
1328
1329 taskItem.ItemID = new UUID((String)row["itemID"]);
1330 taskItem.ParentPartID = new UUID((String)row["primID"]);
1331 taskItem.AssetID = new UUID((String)row["assetID"]);
1332 taskItem.ParentID = new UUID((String)row["parentFolderID"]);
1333
1334 taskItem.InvType = Convert.ToInt32(row["invType"]);
1335 taskItem.Type = Convert.ToInt32(row["assetType"]);
1336
1337 taskItem.Name = (String)row["name"];
1338 taskItem.Description = (String)row["description"];
1339 taskItem.CreationDate = Convert.ToUInt32(row["creationDate"]);
1340 taskItem.CreatorIdentification = (String)row["creatorID"];
1341 taskItem.OwnerID = new UUID((String)row["ownerID"]);
1342 taskItem.LastOwnerID = new UUID((String)row["lastOwnerID"]);
1343 taskItem.GroupID = new UUID((String)row["groupID"]);
1344
1345 taskItem.NextPermissions = Convert.ToUInt32(row["nextPermissions"]);
1346 taskItem.CurrentPermissions = Convert.ToUInt32(row["currentPermissions"]);
1347 taskItem.BasePermissions = Convert.ToUInt32(row["basePermissions"]);
1348 taskItem.EveryonePermissions = Convert.ToUInt32(row["everyonePermissions"]);
1349 taskItem.GroupPermissions = Convert.ToUInt32(row["groupPermissions"]);
1350 taskItem.Flags = Convert.ToUInt32(row["flags"]);
1351
1352 return taskItem;
1353 }
1354
1355 /// <summary>
1356 /// Build a Land Data from the persisted data.
1357 /// </summary>
1358 /// <param name="row"></param>
1359 /// <returns></returns>
1360 private LandData buildLandData(DataRow row)
1361 {
1362 LandData newData = new LandData();
1363
1364 newData.GlobalID = new UUID((String) row["UUID"]);
1365 newData.LocalID = Convert.ToInt32(row["LocalLandID"]);
1366
1367 // Bitmap is a byte[512]
1368 newData.Bitmap = (Byte[]) row["Bitmap"];
1369
1370 newData.Name = (String) row["Name"];
1371 newData.Description = (String) row["Desc"];
1372 newData.OwnerID = (UUID)(String) row["OwnerUUID"];
1373 newData.IsGroupOwned = (Boolean) row["IsGroupOwned"];
1374 newData.Area = Convert.ToInt32(row["Area"]);
1375 newData.AuctionID = Convert.ToUInt32(row["AuctionID"]); //Unemplemented
1376 newData.Category = (ParcelCategory) Convert.ToInt32(row["Category"]);
1377 //Enum OpenMetaverse.Parcel.ParcelCategory
1378 newData.ClaimDate = Convert.ToInt32(row["ClaimDate"]);
1379 newData.ClaimPrice = Convert.ToInt32(row["ClaimPrice"]);
1380 newData.GroupID = new UUID((String) row["GroupUUID"]);
1381 newData.SalePrice = Convert.ToInt32(row["SalePrice"]);
1382 newData.Status = (ParcelStatus) Convert.ToInt32(row["LandStatus"]);
1383 //Enum. OpenMetaverse.Parcel.ParcelStatus
1384 newData.Flags = Convert.ToUInt32(row["LandFlags"]);
1385 newData.LandingType = (Byte) row["LandingType"];
1386 newData.MediaAutoScale = (Byte) row["MediaAutoScale"];
1387 newData.MediaID = new UUID((String) row["MediaTextureUUID"]);
1388 newData.MediaURL = (String) row["MediaURL"];
1389 newData.MusicURL = (String) row["MusicURL"];
1390 newData.PassHours = Convert.ToSingle(row["PassHours"]);
1391 newData.PassPrice = Convert.ToInt32(row["PassPrice"]);
1392 newData.SnapshotID = (UUID)(String) row["SnapshotUUID"];
1393 try
1394 {
1395
1396 newData.UserLocation =
1397 new Vector3(Convert.ToSingle(row["UserLocationX"]), Convert.ToSingle(row["UserLocationY"]),
1398 Convert.ToSingle(row["UserLocationZ"]));
1399 newData.UserLookAt =
1400 new Vector3(Convert.ToSingle(row["UserLookAtX"]), Convert.ToSingle(row["UserLookAtY"]),
1401 Convert.ToSingle(row["UserLookAtZ"]));
1402
1403 }
1404 catch (InvalidCastException)
1405 {
1406 m_log.ErrorFormat("[PARCEL]: unable to get parcel telehub settings for {1}", newData.Name);
1407 newData.UserLocation = Vector3.Zero;
1408 newData.UserLookAt = Vector3.Zero;
1409 }
1410 newData.ParcelAccessList = new List<ParcelManager.ParcelAccessEntry>();
1411 UUID authBuyerID = UUID.Zero;
1412
1413 UUID.TryParse((string)row["AuthbuyerID"], out authBuyerID);
1414
1415 newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
1416
1417 return newData;
1418 }
1419
1420 private RegionSettings buildRegionSettings(DataRow row)
1421 {
1422 RegionSettings newSettings = new RegionSettings();
1423
1424 newSettings.RegionUUID = new UUID((string) row["regionUUID"]);
1425 newSettings.BlockTerraform = Convert.ToBoolean(row["block_terraform"]);
1426 newSettings.AllowDamage = Convert.ToBoolean(row["allow_damage"]);
1427 newSettings.BlockFly = Convert.ToBoolean(row["block_fly"]);
1428 newSettings.RestrictPushing = Convert.ToBoolean(row["restrict_pushing"]);
1429 newSettings.AllowLandResell = Convert.ToBoolean(row["allow_land_resell"]);
1430 newSettings.AllowLandJoinDivide = Convert.ToBoolean(row["allow_land_join_divide"]);
1431 newSettings.BlockShowInSearch = Convert.ToBoolean(row["block_show_in_search"]);
1432 newSettings.AgentLimit = Convert.ToInt32(row["agent_limit"]);
1433 newSettings.ObjectBonus = Convert.ToDouble(row["object_bonus"]);
1434 newSettings.Maturity = Convert.ToInt32(row["maturity"]);
1435 newSettings.DisableScripts = Convert.ToBoolean(row["disable_scripts"]);
1436 newSettings.DisableCollisions = Convert.ToBoolean(row["disable_collisions"]);
1437 newSettings.DisablePhysics = Convert.ToBoolean(row["disable_physics"]);
1438 newSettings.TerrainTexture1 = new UUID((String) row["terrain_texture_1"]);
1439 newSettings.TerrainTexture2 = new UUID((String) row["terrain_texture_2"]);
1440 newSettings.TerrainTexture3 = new UUID((String) row["terrain_texture_3"]);
1441 newSettings.TerrainTexture4 = new UUID((String) row["terrain_texture_4"]);
1442 newSettings.Elevation1NW = Convert.ToDouble(row["elevation_1_nw"]);
1443 newSettings.Elevation2NW = Convert.ToDouble(row["elevation_2_nw"]);
1444 newSettings.Elevation1NE = Convert.ToDouble(row["elevation_1_ne"]);
1445 newSettings.Elevation2NE = Convert.ToDouble(row["elevation_2_ne"]);
1446 newSettings.Elevation1SE = Convert.ToDouble(row["elevation_1_se"]);
1447 newSettings.Elevation2SE = Convert.ToDouble(row["elevation_2_se"]);
1448 newSettings.Elevation1SW = Convert.ToDouble(row["elevation_1_sw"]);
1449 newSettings.Elevation2SW = Convert.ToDouble(row["elevation_2_sw"]);
1450 newSettings.WaterHeight = Convert.ToDouble(row["water_height"]);
1451 newSettings.TerrainRaiseLimit = Convert.ToDouble(row["terrain_raise_limit"]);
1452 newSettings.TerrainLowerLimit = Convert.ToDouble(row["terrain_lower_limit"]);
1453 newSettings.UseEstateSun = Convert.ToBoolean(row["use_estate_sun"]);
1454 newSettings.Sandbox = Convert.ToBoolean(row["sandbox"]);
1455 newSettings.SunVector = new Vector3 (
1456 Convert.ToSingle(row["sunvectorx"]),
1457 Convert.ToSingle(row["sunvectory"]),
1458 Convert.ToSingle(row["sunvectorz"])
1459 );
1460 newSettings.FixedSun = Convert.ToBoolean(row["fixed_sun"]);
1461 newSettings.SunPosition = Convert.ToDouble(row["sun_position"]);
1462 newSettings.Covenant = new UUID((String) row["covenant"]);
1463
1464 return newSettings;
1465 }
1466
1467 /// <summary>
1468 /// Build a land access entry from the persisted data.
1469 /// </summary>
1470 /// <param name="row"></param>
1471 /// <returns></returns>
1472 private static ParcelManager.ParcelAccessEntry buildLandAccessData(DataRow row)
1473 {
1474 ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
1475 entry.AgentID = new UUID((string) row["AccessUUID"]);
1476 entry.Flags = (AccessList) row["Flags"];
1477 entry.Time = new DateTime();
1478 return entry;
1479 }
1480
1481 /// <summary>
1482 ///
1483 /// </summary>
1484 /// <param name="val"></param>
1485 /// <returns></returns>
1486 private static Array serializeTerrain(double[,] val)
1487 {
1488 MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
1489 BinaryWriter bw = new BinaryWriter(str);
1490
1491 // TODO: COMPATIBILITY - Add byte-order conversions
1492 for (int x = 0; x < (int)Constants.RegionSize; x++)
1493 for (int y = 0; y < (int)Constants.RegionSize; y++)
1494 bw.Write(val[x, y]);
1495
1496 return str.ToArray();
1497 }
1498
1499// private void fillTerrainRow(DataRow row, UUID regionUUID, int rev, double[,] val)
1500// {
1501// row["RegionUUID"] = regionUUID;
1502// row["Revision"] = rev;
1503
1504 // MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize)*sizeof (double));
1505// BinaryWriter bw = new BinaryWriter(str);
1506
1507// // TODO: COMPATIBILITY - Add byte-order conversions
1508 // for (int x = 0; x < (int)Constants.RegionSize; x++)
1509 // for (int y = 0; y < (int)Constants.RegionSize; y++)
1510// bw.Write(val[x, y]);
1511
1512// row["Heightfield"] = str.ToArray();
1513// }
1514
1515 /// <summary>
1516 ///
1517 /// </summary>
1518 /// <param name="row"></param>
1519 /// <param name="prim"></param>
1520 /// <param name="sceneGroupID"></param>
1521 /// <param name="regionUUID"></param>
1522 private static void fillPrimRow(DataRow row, SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1523 {
1524 row["UUID"] = prim.UUID.ToString();
1525 row["RegionUUID"] = regionUUID.ToString();
1526 row["CreationDate"] = prim.CreationDate;
1527 row["Name"] = prim.Name;
1528 row["SceneGroupID"] = sceneGroupID.ToString();
1529 // the UUID of the root part for this SceneObjectGroup
1530 // various text fields
1531 row["Text"] = prim.Text;
1532 row["Description"] = prim.Description;
1533 row["SitName"] = prim.SitName;
1534 row["TouchName"] = prim.TouchName;
1535 // permissions
1536 row["ObjectFlags"] = (uint)prim.Flags;
1537 row["CreatorID"] = prim.CreatorIdentification.ToString();
1538 row["OwnerID"] = prim.OwnerID.ToString();
1539 row["GroupID"] = prim.GroupID.ToString();
1540 row["LastOwnerID"] = prim.LastOwnerID.ToString();
1541 row["OwnerMask"] = prim.OwnerMask;
1542 row["NextOwnerMask"] = prim.NextOwnerMask;
1543 row["GroupMask"] = prim.GroupMask;
1544 row["EveryoneMask"] = prim.EveryoneMask;
1545 row["BaseMask"] = prim.BaseMask;
1546 // vectors
1547 row["PositionX"] = prim.OffsetPosition.X;
1548 row["PositionY"] = prim.OffsetPosition.Y;
1549 row["PositionZ"] = prim.OffsetPosition.Z;
1550 row["GroupPositionX"] = prim.GroupPosition.X;
1551 row["GroupPositionY"] = prim.GroupPosition.Y;
1552 row["GroupPositionZ"] = prim.GroupPosition.Z;
1553 row["VelocityX"] = prim.Velocity.X;
1554 row["VelocityY"] = prim.Velocity.Y;
1555 row["VelocityZ"] = prim.Velocity.Z;
1556 row["AngularVelocityX"] = prim.AngularVelocity.X;
1557 row["AngularVelocityY"] = prim.AngularVelocity.Y;
1558 row["AngularVelocityZ"] = prim.AngularVelocity.Z;
1559 row["AccelerationX"] = prim.Acceleration.X;
1560 row["AccelerationY"] = prim.Acceleration.Y;
1561 row["AccelerationZ"] = prim.Acceleration.Z;
1562 // quaternions
1563 row["RotationX"] = prim.RotationOffset.X;
1564 row["RotationY"] = prim.RotationOffset.Y;
1565 row["RotationZ"] = prim.RotationOffset.Z;
1566 row["RotationW"] = prim.RotationOffset.W;
1567
1568 // Sit target
1569 Vector3 sitTargetPos = prim.SitTargetPositionLL;
1570 row["SitTargetOffsetX"] = sitTargetPos.X;
1571 row["SitTargetOffsetY"] = sitTargetPos.Y;
1572 row["SitTargetOffsetZ"] = sitTargetPos.Z;
1573
1574 Quaternion sitTargetOrient = prim.SitTargetOrientationLL;
1575 row["SitTargetOrientW"] = sitTargetOrient.W;
1576 row["SitTargetOrientX"] = sitTargetOrient.X;
1577 row["SitTargetOrientY"] = sitTargetOrient.Y;
1578 row["SitTargetOrientZ"] = sitTargetOrient.Z;
1579 row["ColorR"] = Convert.ToInt32(prim.Color.R);
1580 row["ColorG"] = Convert.ToInt32(prim.Color.G);
1581 row["ColorB"] = Convert.ToInt32(prim.Color.B);
1582 row["ColorA"] = Convert.ToInt32(prim.Color.A);
1583 row["PayPrice"] = prim.PayPrice[0];
1584 row["PayButton1"] = prim.PayPrice[1];
1585 row["PayButton2"] = prim.PayPrice[2];
1586 row["PayButton3"] = prim.PayPrice[3];
1587 row["PayButton4"] = prim.PayPrice[4];
1588
1589
1590 row["TextureAnimation"] = Convert.ToBase64String(prim.TextureAnimation);
1591 row["ParticleSystem"] = Convert.ToBase64String(prim.ParticleSystem);
1592
1593 row["OmegaX"] = prim.AngularVelocity.X;
1594 row["OmegaY"] = prim.AngularVelocity.Y;
1595 row["OmegaZ"] = prim.AngularVelocity.Z;
1596
1597 row["CameraEyeOffsetX"] = prim.GetCameraEyeOffset().X;
1598 row["CameraEyeOffsetY"] = prim.GetCameraEyeOffset().Y;
1599 row["CameraEyeOffsetZ"] = prim.GetCameraEyeOffset().Z;
1600
1601 row["CameraAtOffsetX"] = prim.GetCameraAtOffset().X;
1602 row["CameraAtOffsetY"] = prim.GetCameraAtOffset().Y;
1603 row["CameraAtOffsetZ"] = prim.GetCameraAtOffset().Z;
1604
1605
1606 if ((prim.SoundFlags & 1) != 0) // Looped
1607 {
1608 row["LoopedSound"] = prim.Sound.ToString();
1609 row["LoopedSoundGain"] = prim.SoundGain;
1610 }
1611 else
1612 {
1613 row["LoopedSound"] = UUID.Zero.ToString();
1614 row["LoopedSoundGain"] = 0.0f;
1615 }
1616
1617 if (prim.GetForceMouselook())
1618 row["ForceMouselook"] = 1;
1619 else
1620 row["ForceMouselook"] = 0;
1621
1622 row["ScriptAccessPin"] = prim.ScriptAccessPin;
1623
1624 if (prim.AllowedDrop)
1625 row["AllowedDrop"] = 1;
1626 else
1627 row["AllowedDrop"] = 0;
1628
1629 if (prim.DIE_AT_EDGE)
1630 row["DieAtEdge"] = 1;
1631 else
1632 row["DieAtEdge"] = 0;
1633
1634 row["SalePrice"] = prim.SalePrice;
1635 row["SaleType"] = Convert.ToInt16(prim.ObjectSaleType);
1636
1637 // click action
1638 row["ClickAction"] = prim.ClickAction;
1639
1640 row["SalePrice"] = prim.SalePrice;
1641 row["Material"] = prim.Material;
1642
1643 row["CollisionSound"] = prim.CollisionSound.ToString();
1644 row["CollisionSoundVolume"] = prim.CollisionSoundVolume;
1645 if (prim.VolumeDetectActive)
1646 row["VolumeDetect"] = 1;
1647 else
1648 row["VolumeDetect"] = 0;
1649
1650 }
1651
1652 /// <summary>
1653 ///
1654 /// </summary>
1655 /// <param name="row"></param>
1656 /// <param name="taskItem"></param>
1657 private static void fillItemRow(DataRow row, TaskInventoryItem taskItem)
1658 {
1659 row["itemID"] = taskItem.ItemID.ToString();
1660 row["primID"] = taskItem.ParentPartID.ToString();
1661 row["assetID"] = taskItem.AssetID.ToString();
1662 row["parentFolderID"] = taskItem.ParentID.ToString();
1663
1664 row["invType"] = taskItem.InvType;
1665 row["assetType"] = taskItem.Type;
1666
1667 row["name"] = taskItem.Name;
1668 row["description"] = taskItem.Description;
1669 row["creationDate"] = taskItem.CreationDate;
1670 row["creatorID"] = taskItem.CreatorIdentification.ToString();
1671 row["ownerID"] = taskItem.OwnerID.ToString();
1672 row["lastOwnerID"] = taskItem.LastOwnerID.ToString();
1673 row["groupID"] = taskItem.GroupID.ToString();
1674 row["nextPermissions"] = taskItem.NextPermissions;
1675 row["currentPermissions"] = taskItem.CurrentPermissions;
1676 row["basePermissions"] = taskItem.BasePermissions;
1677 row["everyonePermissions"] = taskItem.EveryonePermissions;
1678 row["groupPermissions"] = taskItem.GroupPermissions;
1679 row["flags"] = taskItem.Flags;
1680 }
1681
1682 /// <summary>
1683 ///
1684 /// </summary>
1685 /// <param name="row"></param>
1686 /// <param name="land"></param>
1687 /// <param name="regionUUID"></param>
1688 private static void fillLandRow(DataRow row, LandData land, UUID regionUUID)
1689 {
1690 row["UUID"] = land.GlobalID.ToString();
1691 row["RegionUUID"] = regionUUID.ToString();
1692 row["LocalLandID"] = land.LocalID;
1693
1694 // Bitmap is a byte[512]
1695 row["Bitmap"] = land.Bitmap;
1696
1697 row["Name"] = land.Name;
1698 row["Desc"] = land.Description;
1699 row["OwnerUUID"] = land.OwnerID.ToString();
1700 row["IsGroupOwned"] = land.IsGroupOwned;
1701 row["Area"] = land.Area;
1702 row["AuctionID"] = land.AuctionID; //Unemplemented
1703 row["Category"] = land.Category; //Enum OpenMetaverse.Parcel.ParcelCategory
1704 row["ClaimDate"] = land.ClaimDate;
1705 row["ClaimPrice"] = land.ClaimPrice;
1706 row["GroupUUID"] = land.GroupID.ToString();
1707 row["SalePrice"] = land.SalePrice;
1708 row["LandStatus"] = land.Status; //Enum. OpenMetaverse.Parcel.ParcelStatus
1709 row["LandFlags"] = land.Flags;
1710 row["LandingType"] = land.LandingType;
1711 row["MediaAutoScale"] = land.MediaAutoScale;
1712 row["MediaTextureUUID"] = land.MediaID.ToString();
1713 row["MediaURL"] = land.MediaURL;
1714 row["MusicURL"] = land.MusicURL;
1715 row["PassHours"] = land.PassHours;
1716 row["PassPrice"] = land.PassPrice;
1717 row["SnapshotUUID"] = land.SnapshotID.ToString();
1718 row["UserLocationX"] = land.UserLocation.X;
1719 row["UserLocationY"] = land.UserLocation.Y;
1720 row["UserLocationZ"] = land.UserLocation.Z;
1721 row["UserLookAtX"] = land.UserLookAt.X;
1722 row["UserLookAtY"] = land.UserLookAt.Y;
1723 row["UserLookAtZ"] = land.UserLookAt.Z;
1724 row["AuthbuyerID"] = land.AuthBuyerID.ToString();
1725 row["OtherCleanTime"] = land.OtherCleanTime;
1726 }
1727
1728 /// <summary>
1729 ///
1730 /// </summary>
1731 /// <param name="row"></param>
1732 /// <param name="entry"></param>
1733 /// <param name="parcelID"></param>
1734 private static void fillLandAccessRow(DataRow row, ParcelManager.ParcelAccessEntry entry, UUID parcelID)
1735 {
1736 row["LandUUID"] = parcelID.ToString();
1737 row["AccessUUID"] = entry.AgentID.ToString();
1738 row["Flags"] = entry.Flags;
1739 }
1740
1741 private static void fillRegionSettingsRow(DataRow row, RegionSettings settings)
1742 {
1743 row["regionUUID"] = settings.RegionUUID.ToString();
1744 row["block_terraform"] = settings.BlockTerraform;
1745 row["block_fly"] = settings.BlockFly;
1746 row["allow_damage"] = settings.AllowDamage;
1747 row["restrict_pushing"] = settings.RestrictPushing;
1748 row["allow_land_resell"] = settings.AllowLandResell;
1749 row["allow_land_join_divide"] = settings.AllowLandJoinDivide;
1750 row["block_show_in_search"] = settings.BlockShowInSearch;
1751 row["agent_limit"] = settings.AgentLimit;
1752 row["object_bonus"] = settings.ObjectBonus;
1753 row["maturity"] = settings.Maturity;
1754 row["disable_scripts"] = settings.DisableScripts;
1755 row["disable_collisions"] = settings.DisableCollisions;
1756 row["disable_physics"] = settings.DisablePhysics;
1757 row["terrain_texture_1"] = settings.TerrainTexture1.ToString();
1758 row["terrain_texture_2"] = settings.TerrainTexture2.ToString();
1759 row["terrain_texture_3"] = settings.TerrainTexture3.ToString();
1760 row["terrain_texture_4"] = settings.TerrainTexture4.ToString();
1761 row["elevation_1_nw"] = settings.Elevation1NW;
1762 row["elevation_2_nw"] = settings.Elevation2NW;
1763 row["elevation_1_ne"] = settings.Elevation1NE;
1764 row["elevation_2_ne"] = settings.Elevation2NE;
1765 row["elevation_1_se"] = settings.Elevation1SE;
1766 row["elevation_2_se"] = settings.Elevation2SE;
1767 row["elevation_1_sw"] = settings.Elevation1SW;
1768 row["elevation_2_sw"] = settings.Elevation2SW;
1769 row["water_height"] = settings.WaterHeight;
1770 row["terrain_raise_limit"] = settings.TerrainRaiseLimit;
1771 row["terrain_lower_limit"] = settings.TerrainLowerLimit;
1772 row["use_estate_sun"] = settings.UseEstateSun;
1773 row["Sandbox"] = settings.Sandbox; // database uses upper case S for sandbox
1774 row["sunvectorx"] = settings.SunVector.X;
1775 row["sunvectory"] = settings.SunVector.Y;
1776 row["sunvectorz"] = settings.SunVector.Z;
1777 row["fixed_sun"] = settings.FixedSun;
1778 row["sun_position"] = settings.SunPosition;
1779 row["covenant"] = settings.Covenant.ToString();
1780 }
1781
1782 /// <summary>
1783 ///
1784 /// </summary>
1785 /// <param name="row"></param>
1786 /// <returns></returns>
1787 private PrimitiveBaseShape buildShape(DataRow row)
1788 {
1789 PrimitiveBaseShape s = new PrimitiveBaseShape();
1790 s.Scale = new Vector3(
1791 Convert.ToSingle(row["ScaleX"]),
1792 Convert.ToSingle(row["ScaleY"]),
1793 Convert.ToSingle(row["ScaleZ"])
1794 );
1795 // paths
1796 s.PCode = Convert.ToByte(row["PCode"]);
1797 s.PathBegin = Convert.ToUInt16(row["PathBegin"]);
1798 s.PathEnd = Convert.ToUInt16(row["PathEnd"]);
1799 s.PathScaleX = Convert.ToByte(row["PathScaleX"]);
1800 s.PathScaleY = Convert.ToByte(row["PathScaleY"]);
1801 s.PathShearX = Convert.ToByte(row["PathShearX"]);
1802 s.PathShearY = Convert.ToByte(row["PathShearY"]);
1803 s.PathSkew = Convert.ToSByte(row["PathSkew"]);
1804 s.PathCurve = Convert.ToByte(row["PathCurve"]);
1805 s.PathRadiusOffset = Convert.ToSByte(row["PathRadiusOffset"]);
1806 s.PathRevolutions = Convert.ToByte(row["PathRevolutions"]);
1807 s.PathTaperX = Convert.ToSByte(row["PathTaperX"]);
1808 s.PathTaperY = Convert.ToSByte(row["PathTaperY"]);
1809 s.PathTwist = Convert.ToSByte(row["PathTwist"]);
1810 s.PathTwistBegin = Convert.ToSByte(row["PathTwistBegin"]);
1811 // profile
1812 s.ProfileBegin = Convert.ToUInt16(row["ProfileBegin"]);
1813 s.ProfileEnd = Convert.ToUInt16(row["ProfileEnd"]);
1814 s.ProfileCurve = Convert.ToByte(row["ProfileCurve"]);
1815 s.ProfileHollow = Convert.ToUInt16(row["ProfileHollow"]);
1816 s.State = Convert.ToByte(row["State"]);
1817
1818 byte[] textureEntry = (byte[])row["Texture"];
1819 s.TextureEntry = textureEntry;
1820
1821 s.ExtraParams = (byte[]) row["ExtraParams"];
1822 return s;
1823 }
1824
1825 /// <summary>
1826 ///
1827 /// </summary>
1828 /// <param name="row"></param>
1829 /// <param name="prim"></param>
1830 private static void fillShapeRow(DataRow row, SceneObjectPart prim)
1831 {
1832 PrimitiveBaseShape s = prim.Shape;
1833 row["UUID"] = prim.UUID.ToString();
1834 // shape is an enum
1835 row["Shape"] = 0;
1836 // vectors
1837 row["ScaleX"] = s.Scale.X;
1838 row["ScaleY"] = s.Scale.Y;
1839 row["ScaleZ"] = s.Scale.Z;
1840 // paths
1841 row["PCode"] = s.PCode;
1842 row["PathBegin"] = s.PathBegin;
1843 row["PathEnd"] = s.PathEnd;
1844 row["PathScaleX"] = s.PathScaleX;
1845 row["PathScaleY"] = s.PathScaleY;
1846 row["PathShearX"] = s.PathShearX;
1847 row["PathShearY"] = s.PathShearY;
1848 row["PathSkew"] = s.PathSkew;
1849 row["PathCurve"] = s.PathCurve;
1850 row["PathRadiusOffset"] = s.PathRadiusOffset;
1851 row["PathRevolutions"] = s.PathRevolutions;
1852 row["PathTaperX"] = s.PathTaperX;
1853 row["PathTaperY"] = s.PathTaperY;
1854 row["PathTwist"] = s.PathTwist;
1855 row["PathTwistBegin"] = s.PathTwistBegin;
1856 // profile
1857 row["ProfileBegin"] = s.ProfileBegin;
1858 row["ProfileEnd"] = s.ProfileEnd;
1859 row["ProfileCurve"] = s.ProfileCurve;
1860 row["ProfileHollow"] = s.ProfileHollow;
1861 row["State"] = s.State;
1862
1863 row["Texture"] = s.TextureEntry;
1864 row["ExtraParams"] = s.ExtraParams;
1865 }
1866
1867 /// <summary>
1868 ///
1869 /// </summary>
1870 /// <param name="prim"></param>
1871 /// <param name="sceneGroupID"></param>
1872 /// <param name="regionUUID"></param>
1873 private void addPrim(SceneObjectPart prim, UUID sceneGroupID, UUID regionUUID)
1874 {
1875
1876 DataTable prims = ds.Tables["prims"];
1877 DataTable shapes = ds.Tables["primshapes"];
1878
1879 DataRow primRow = prims.Rows.Find(prim.UUID.ToString());
1880 if (primRow == null)
1881 {
1882 primRow = prims.NewRow();
1883 fillPrimRow(primRow, prim, sceneGroupID, regionUUID);
1884 prims.Rows.Add(primRow);
1885 }
1886 else
1887 {
1888 fillPrimRow(primRow, prim, sceneGroupID, regionUUID);
1889 }
1890
1891 DataRow shapeRow = shapes.Rows.Find(prim.UUID.ToString());
1892 if (shapeRow == null)
1893 {
1894 shapeRow = shapes.NewRow();
1895 fillShapeRow(shapeRow, prim);
1896 shapes.Rows.Add(shapeRow);
1897 }
1898 else
1899 {
1900 fillShapeRow(shapeRow, prim);
1901 }
1902 }
1903
1904 /// <summary>
1905 /// </summary>
1906 /// <param name="primID"></param>
1907 /// <param name="items"></param>
1908 public void StorePrimInventory(UUID primID, ICollection<TaskInventoryItem> items)
1909 {
1910 m_log.InfoFormat("[REGION DB]: Entered StorePrimInventory with prim ID {0}", primID);
1911
1912 DataTable dbItems = ds.Tables["primitems"];
1913
1914 // For now, we're just going to crudely remove all the previous inventory items
1915 // no matter whether they have changed or not, and replace them with the current set.
1916 lock (ds)
1917 {
1918 RemoveItems(primID);
1919
1920 // repalce with current inventory details
1921 foreach (TaskInventoryItem newItem in items)
1922 {
1923// m_log.InfoFormat(
1924// "[DATASTORE]: ",
1925// "Adding item {0}, {1} to prim ID {2}",
1926// newItem.Name, newItem.ItemID, newItem.ParentPartID);
1927
1928 DataRow newItemRow = dbItems.NewRow();
1929 fillItemRow(newItemRow, newItem);
1930 dbItems.Rows.Add(newItemRow);
1931 }
1932 }
1933
1934 Commit();
1935 }
1936
1937 /***********************************************************************
1938 *
1939 * SQL Statement Creation Functions
1940 *
1941 * These functions create SQL statements for update, insert, and create.
1942 * They can probably be factored later to have a db independant
1943 * portion and a db specific portion
1944 *
1945 **********************************************************************/
1946
1947 /// <summary>
1948 /// Create an insert command
1949 /// </summary>
1950 /// <param name="table">table name</param>
1951 /// <param name="dt">data table</param>
1952 /// <returns>the created command</returns>
1953 /// <remarks>
1954 /// This is subtle enough to deserve some commentary.
1955 /// Instead of doing *lots* and *lots of hardcoded strings
1956 /// for database definitions we'll use the fact that
1957 /// realistically all insert statements look like "insert
1958 /// into A(b, c) values(:b, :c) on the parameterized query
1959 /// front. If we just have a list of b, c, etc... we can
1960 /// generate these strings instead of typing them out.
1961 /// </remarks>
1962 private static SqliteCommand createInsertCommand(string table, DataTable dt)
1963 {
1964 string[] cols = new string[dt.Columns.Count];
1965 for (int i = 0; i < dt.Columns.Count; i++)
1966 {
1967 DataColumn col = dt.Columns[i];
1968 cols[i] = col.ColumnName;
1969 }
1970
1971 string sql = "insert into " + table + "(";
1972 sql += String.Join(", ", cols);
1973 // important, the first ':' needs to be here, the rest get added in the join
1974 sql += ") values (:";
1975 sql += String.Join(", :", cols);
1976 sql += ")";
1977 SqliteCommand cmd = new SqliteCommand(sql);
1978
1979 // this provides the binding for all our parameters, so
1980 // much less code than it used to be
1981 foreach (DataColumn col in dt.Columns)
1982 {
1983 cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
1984 }
1985 return cmd;
1986 }
1987
1988
1989 /// <summary>
1990 /// create an update command
1991 /// </summary>
1992 /// <param name="table">table name</param>
1993 /// <param name="pk"></param>
1994 /// <param name="dt"></param>
1995 /// <returns>the created command</returns>
1996 private static SqliteCommand createUpdateCommand(string table, string pk, DataTable dt)
1997 {
1998 string sql = "update " + table + " set ";
1999 string subsql = String.Empty;
2000 foreach (DataColumn col in dt.Columns)
2001 {
2002 if (subsql.Length > 0)
2003 {
2004 // a map function would rock so much here
2005 subsql += ", ";
2006 }
2007 subsql += col.ColumnName + "= :" + col.ColumnName;
2008 }
2009 sql += subsql;
2010 sql += " where " + pk;
2011 SqliteCommand cmd = new SqliteCommand(sql);
2012
2013 // this provides the binding for all our parameters, so
2014 // much less code than it used to be
2015
2016 foreach (DataColumn col in dt.Columns)
2017 {
2018 cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
2019 }
2020 return cmd;
2021 }
2022
2023 /// <summary>
2024 /// create an update command
2025 /// </summary>
2026 /// <param name="table">table name</param>
2027 /// <param name="pk"></param>
2028 /// <param name="dt"></param>
2029 /// <returns>the created command</returns>
2030 private static SqliteCommand createUpdateCommand(string table, string pk1, string pk2, DataTable dt)
2031 {
2032 string sql = "update " + table + " set ";
2033 string subsql = String.Empty;
2034 foreach (DataColumn col in dt.Columns)
2035 {
2036 if (subsql.Length > 0)
2037 {
2038 // a map function would rock so much here
2039 subsql += ", ";
2040 }
2041 subsql += col.ColumnName + "= :" + col.ColumnName;
2042 }
2043 sql += subsql;
2044 sql += " where " + pk1 + " and " + pk2;
2045 SqliteCommand cmd = new SqliteCommand(sql);
2046
2047 // this provides the binding for all our parameters, so
2048 // much less code than it used to be
2049
2050 foreach (DataColumn col in dt.Columns)
2051 {
2052 cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
2053 }
2054 return cmd;
2055 }
2056
2057 /// <summary>
2058 ///
2059 /// </summary>
2060 /// <param name="dt">Data Table</param>
2061 /// <returns></returns>
2062 // private static string defineTable(DataTable dt)
2063 // {
2064 // string sql = "create table " + dt.TableName + "(";
2065 // string subsql = String.Empty;
2066 // foreach (DataColumn col in dt.Columns)
2067 // {
2068 // if (subsql.Length > 0)
2069 // {
2070 // // a map function would rock so much here
2071 // subsql += ",\n";
2072 // }
2073 // subsql += col.ColumnName + " " + sqliteType(col.DataType);
2074 // if (dt.PrimaryKey.Length > 0 && col == dt.PrimaryKey[0])
2075 // {
2076 // subsql += " primary key";
2077 // }
2078 // }
2079 // sql += subsql;
2080 // sql += ")";
2081 // return sql;
2082 // }
2083
2084 /***********************************************************************
2085 *
2086 * Database Binding functions
2087 *
2088 * These will be db specific due to typing, and minor differences
2089 * in databases.
2090 *
2091 **********************************************************************/
2092
2093 ///<summary>
2094 /// This is a convenience function that collapses 5 repetitive
2095 /// lines for defining SqliteParameters to 2 parameters:
2096 /// column name and database type.
2097 ///
2098 /// It assumes certain conventions like :param as the param
2099 /// name to replace in parametrized queries, and that source
2100 /// version is always current version, both of which are fine
2101 /// for us.
2102 ///</summary>
2103 ///<returns>a built sqlite parameter</returns>
2104 private static SqliteParameter createSqliteParameter(string name, Type type)
2105 {
2106 SqliteParameter param = new SqliteParameter();
2107 param.ParameterName = ":" + name;
2108 param.DbType = dbtypeFromType(type);
2109 param.SourceColumn = name;
2110 param.SourceVersion = DataRowVersion.Current;
2111 return param;
2112 }
2113
2114 /// <summary>
2115 ///
2116 /// </summary>
2117 /// <param name="da"></param>
2118 /// <param name="conn"></param>
2119 private void setupPrimCommands(SqliteDataAdapter da, SqliteConnection conn)
2120 {
2121 da.InsertCommand = createInsertCommand("prims", ds.Tables["prims"]);
2122 da.InsertCommand.Connection = conn;
2123
2124 da.UpdateCommand = createUpdateCommand("prims", "UUID=:UUID", ds.Tables["prims"]);
2125 da.UpdateCommand.Connection = conn;
2126
2127 SqliteCommand delete = new SqliteCommand("delete from prims where UUID = :UUID");
2128 delete.Parameters.Add(createSqliteParameter("UUID", typeof (String)));
2129 delete.Connection = conn;
2130 da.DeleteCommand = delete;
2131 }
2132
2133 /// <summary>
2134 ///
2135 /// </summary>
2136 /// <param name="da"></param>
2137 /// <param name="conn"></param>
2138 private void setupItemsCommands(SqliteDataAdapter da, SqliteConnection conn)
2139 {
2140 da.InsertCommand = createInsertCommand("primitems", ds.Tables["primitems"]);
2141 da.InsertCommand.Connection = conn;
2142
2143 da.UpdateCommand = createUpdateCommand("primitems", "itemID = :itemID", ds.Tables["primitems"]);
2144 da.UpdateCommand.Connection = conn;
2145
2146 SqliteCommand delete = new SqliteCommand("delete from primitems where itemID = :itemID");
2147 delete.Parameters.Add(createSqliteParameter("itemID", typeof (String)));
2148 delete.Connection = conn;
2149 da.DeleteCommand = delete;
2150 }
2151
2152 /// <summary>
2153 ///
2154 /// </summary>
2155 /// <param name="da"></param>
2156 /// <param name="conn"></param>
2157 private void setupTerrainCommands(SqliteDataAdapter da, SqliteConnection conn)
2158 {
2159 da.InsertCommand = createInsertCommand("terrain", ds.Tables["terrain"]);
2160 da.InsertCommand.Connection = conn;
2161 }
2162
2163 /// <summary>
2164 ///
2165 /// </summary>
2166 /// <param name="da"></param>
2167 /// <param name="conn"></param>
2168 private void setupLandCommands(SqliteDataAdapter da, SqliteConnection conn)
2169 {
2170 da.InsertCommand = createInsertCommand("land", ds.Tables["land"]);
2171 da.InsertCommand.Connection = conn;
2172
2173 da.UpdateCommand = createUpdateCommand("land", "UUID=:UUID", ds.Tables["land"]);
2174 da.UpdateCommand.Connection = conn;
2175
2176 SqliteCommand delete = new SqliteCommand("delete from land where UUID=:UUID");
2177 delete.Parameters.Add(createSqliteParameter("UUID", typeof(String)));
2178 da.DeleteCommand = delete;
2179 da.DeleteCommand.Connection = conn;
2180 }
2181
2182 /// <summary>
2183 ///
2184 /// </summary>
2185 /// <param name="da"></param>
2186 /// <param name="conn"></param>
2187 private void setupLandAccessCommands(SqliteDataAdapter da, SqliteConnection conn)
2188 {
2189 da.InsertCommand = createInsertCommand("landaccesslist", ds.Tables["landaccesslist"]);
2190 da.InsertCommand.Connection = conn;
2191
2192 da.UpdateCommand = createUpdateCommand("landaccesslist", "LandUUID=:landUUID", "AccessUUID=:AccessUUID", ds.Tables["landaccesslist"]);
2193 da.UpdateCommand.Connection = conn;
2194
2195 SqliteCommand delete = new SqliteCommand("delete from landaccesslist where LandUUID= :LandUUID and AccessUUID= :AccessUUID");
2196 delete.Parameters.Add(createSqliteParameter("LandUUID", typeof(String)));
2197 delete.Parameters.Add(createSqliteParameter("AccessUUID", typeof(String)));
2198 da.DeleteCommand = delete;
2199 da.DeleteCommand.Connection = conn;
2200
2201 }
2202
2203 private void setupRegionSettingsCommands(SqliteDataAdapter da, SqliteConnection conn)
2204 {
2205 da.InsertCommand = createInsertCommand("regionsettings", ds.Tables["regionsettings"]);
2206 da.InsertCommand.Connection = conn;
2207 da.UpdateCommand = createUpdateCommand("regionsettings", "regionUUID=:regionUUID", ds.Tables["regionsettings"]);
2208 da.UpdateCommand.Connection = conn;
2209 }
2210
2211 /// <summary>
2212 ///
2213 /// </summary>
2214 /// <param name="da"></param>
2215 /// <param name="conn"></param>
2216 private void setupShapeCommands(SqliteDataAdapter da, SqliteConnection conn)
2217 {
2218 da.InsertCommand = createInsertCommand("primshapes", ds.Tables["primshapes"]);
2219 da.InsertCommand.Connection = conn;
2220
2221 da.UpdateCommand = createUpdateCommand("primshapes", "UUID=:UUID", ds.Tables["primshapes"]);
2222 da.UpdateCommand.Connection = conn;
2223
2224 SqliteCommand delete = new SqliteCommand("delete from primshapes where UUID = :UUID");
2225 delete.Parameters.Add(createSqliteParameter("UUID", typeof (String)));
2226 delete.Connection = conn;
2227 da.DeleteCommand = delete;
2228 }
2229
2230 /***********************************************************************
2231 *
2232 * Type conversion functions
2233 *
2234 **********************************************************************/
2235
2236 /// <summary>
2237 /// Type conversion function
2238 /// </summary>
2239 /// <param name="type"></param>
2240 /// <returns></returns>
2241 private static DbType dbtypeFromType(Type type)
2242 {
2243 if (type == typeof (String))
2244 {
2245 return DbType.String;
2246 }
2247 else if (type == typeof (Int32))
2248 {
2249 return DbType.Int32;
2250 }
2251 else if (type == typeof (Double))
2252 {
2253 return DbType.Double;
2254 }
2255 else if (type == typeof (Byte))
2256 {
2257 return DbType.Byte;
2258 }
2259 else if (type == typeof (Double))
2260 {
2261 return DbType.Double;
2262 }
2263 else if (type == typeof (Byte[]))
2264 {
2265 return DbType.Binary;
2266 }
2267 else
2268 {
2269 return DbType.String;
2270 }
2271 }
2272
2273 }
2274}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteUserAccountData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteUserAccountData.cs
deleted file mode 100644
index 41a0177..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteUserAccountData.cs
+++ /dev/null
@@ -1,86 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Collections;
30using System.Collections.Generic;
31using System.Data;
32using OpenMetaverse;
33using OpenSim.Framework;
34using Mono.Data.SqliteClient;
35
36namespace OpenSim.Data.SQLiteLegacy
37{
38 public class SQLiteUserAccountData : SQLiteGenericTableHandler<UserAccountData>, IUserAccountData
39 {
40 public SQLiteUserAccountData(string connectionString, string realm)
41 : base(connectionString, realm, "UserAccount")
42 {
43 }
44
45 public UserAccountData[] GetUsers(UUID scopeID, string query)
46 {
47 string[] words = query.Split(new char[] {' '});
48
49 for (int i = 0 ; i < words.Length ; i++)
50 {
51 if (words[i].Length < 3)
52 {
53 if (i != words.Length - 1)
54 Array.Copy(words, i + 1, words, i, words.Length - i - 1);
55 Array.Resize(ref words, words.Length - 1);
56 }
57 }
58
59 if (words.Length == 0)
60 return new UserAccountData[0];
61
62 if (words.Length > 2)
63 return new UserAccountData[0];
64
65 SqliteCommand cmd = new SqliteCommand();
66
67 if (words.Length == 1)
68 {
69 cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{2}%')",
70 m_Realm, scopeID.ToString(), words[0]);
71 }
72 else
73 {
74 cmd.CommandText = String.Format("select * from {0} where (ScopeID='{1}' or ScopeID='00000000-0000-0000-0000-000000000000') and (FirstName like '{2}%' or LastName like '{3}%')",
75 m_Realm, scopeID.ToString(), words[0], words[1]);
76 }
77
78 return DoQuery(cmd);
79 }
80
81 public UserAccountData[] GetUsersWhere(UUID scopeID, string where)
82 {
83 return null;
84 }
85 }
86}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteUtils.cs b/OpenSim/Data/SQLiteLegacy/SQLiteUtils.cs
deleted file mode 100644
index 095a262..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteUtils.cs
+++ /dev/null
@@ -1,307 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Data;
30using Mono.Data.SqliteClient;
31
32namespace OpenSim.Data.SQLiteLegacy
33{
34 /// <summary>
35 /// A base class for methods needed by all SQLite database classes
36 /// </summary>
37 public class SQLiteUtil
38 {
39 /***********************************************************************
40 *
41 * Database Definition Helper Functions
42 *
43 * This should be db agnostic as we define them in ADO.NET terms
44 *
45 **********************************************************************/
46
47 /// <summary>
48 ///
49 /// </summary>
50 /// <param name="dt"></param>
51 /// <param name="name"></param>
52 /// <param name="type"></param>
53 public static void createCol(DataTable dt, string name, Type type)
54 {
55 DataColumn col = new DataColumn(name, type);
56 dt.Columns.Add(col);
57 }
58
59 /***********************************************************************
60 *
61 * SQL Statement Creation Functions
62 *
63 * These functions create SQL statements for update, insert, and create.
64 * They can probably be factored later to have a db independant
65 * portion and a db specific portion
66 *
67 **********************************************************************/
68
69 /// <summary>
70 /// Create an insert command
71 /// </summary>
72 /// <param name="table">table name</param>
73 /// <param name="dt">data table</param>
74 /// <returns>the created command</returns>
75 /// <remarks>
76 /// This is subtle enough to deserve some commentary.
77 /// Instead of doing *lots* and *lots of hardcoded strings
78 /// for database definitions we'll use the fact that
79 /// realistically all insert statements look like "insert
80 /// into A(b, c) values(:b, :c) on the parameterized query
81 /// front. If we just have a list of b, c, etc... we can
82 /// generate these strings instead of typing them out.
83 /// </remarks>
84 public static SqliteCommand createInsertCommand(string table, DataTable dt)
85 {
86
87 string[] cols = new string[dt.Columns.Count];
88 for (int i = 0; i < dt.Columns.Count; i++)
89 {
90 DataColumn col = dt.Columns[i];
91 cols[i] = col.ColumnName;
92 }
93
94 string sql = "insert into " + table + "(";
95 sql += String.Join(", ", cols);
96 // important, the first ':' needs to be here, the rest get added in the join
97 sql += ") values (:";
98 sql += String.Join(", :", cols);
99 sql += ")";
100 SqliteCommand cmd = new SqliteCommand(sql);
101
102 // this provides the binding for all our parameters, so
103 // much less code than it used to be
104 foreach (DataColumn col in dt.Columns)
105 {
106 cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
107 }
108 return cmd;
109 }
110
111 /// <summary>
112 /// create an update command
113 /// </summary>
114 /// <param name="table">table name</param>
115 /// <param name="pk"></param>
116 /// <param name="dt"></param>
117 /// <returns>the created command</returns>
118 public static SqliteCommand createUpdateCommand(string table, string pk, DataTable dt)
119 {
120 string sql = "update " + table + " set ";
121 string subsql = String.Empty;
122 foreach (DataColumn col in dt.Columns)
123 {
124 if (subsql.Length > 0)
125 {
126 // a map function would rock so much here
127 subsql += ", ";
128 }
129 subsql += col.ColumnName + "= :" + col.ColumnName;
130 }
131 sql += subsql;
132 sql += " where " + pk;
133 SqliteCommand cmd = new SqliteCommand(sql);
134
135 // this provides the binding for all our parameters, so
136 // much less code than it used to be
137
138 foreach (DataColumn col in dt.Columns)
139 {
140 cmd.Parameters.Add(createSqliteParameter(col.ColumnName, col.DataType));
141 }
142 return cmd;
143 }
144
145 /// <summary>
146 ///
147 /// </summary>
148 /// <param name="dt">Data Table</param>
149 /// <returns></returns>
150 public static string defineTable(DataTable dt)
151 {
152 string sql = "create table " + dt.TableName + "(";
153 string subsql = String.Empty;
154 foreach (DataColumn col in dt.Columns)
155 {
156 if (subsql.Length > 0)
157 {
158 // a map function would rock so much here
159 subsql += ",\n";
160 }
161 subsql += col.ColumnName + " " + sqliteType(col.DataType);
162 if (dt.PrimaryKey.Length > 0)
163 {
164 if (col == dt.PrimaryKey[0])
165 {
166 subsql += " primary key";
167 }
168 }
169 }
170 sql += subsql;
171 sql += ")";
172 return sql;
173 }
174
175 /***********************************************************************
176 *
177 * Database Binding functions
178 *
179 * These will be db specific due to typing, and minor differences
180 * in databases.
181 *
182 **********************************************************************/
183
184 ///<summary>
185 /// <para>
186 /// This is a convenience function that collapses 5 repetitive
187 /// lines for defining SqliteParameters to 2 parameters:
188 /// column name and database type.
189 /// </para>
190 ///
191 /// <para>
192 /// It assumes certain conventions like :param as the param
193 /// name to replace in parametrized queries, and that source
194 /// version is always current version, both of which are fine
195 /// for us.
196 /// </para>
197 ///</summary>
198 /// <param name="name"></param>
199 /// <param name="type"></param>
200 ///<returns>a built sqlite parameter</returns>
201 public static SqliteParameter createSqliteParameter(string name, Type type)
202 {
203 SqliteParameter param = new SqliteParameter();
204 param.ParameterName = ":" + name;
205 param.DbType = dbtypeFromType(type);
206 param.SourceColumn = name;
207 param.SourceVersion = DataRowVersion.Current;
208 return param;
209 }
210
211 /***********************************************************************
212 *
213 * Type conversion functions
214 *
215 **********************************************************************/
216
217 /// <summary>
218 /// Type conversion function
219 /// </summary>
220 /// <param name="type">a type</param>
221 /// <returns>a DbType</returns>
222 public static DbType dbtypeFromType(Type type)
223 {
224 if (type == typeof (String))
225 {
226 return DbType.String;
227 }
228 else if (type == typeof (Int32))
229 {
230 return DbType.Int32;
231 }
232 else if (type == typeof (UInt32))
233 {
234 return DbType.UInt32;
235 }
236 else if (type == typeof (Int64))
237 {
238 return DbType.Int64;
239 }
240 else if (type == typeof (UInt64))
241 {
242 return DbType.UInt64;
243 }
244 else if (type == typeof (Double))
245 {
246 return DbType.Double;
247 }
248 else if (type == typeof (Boolean))
249 {
250 return DbType.Boolean;
251 }
252 else if (type == typeof (Byte[]))
253 {
254 return DbType.Binary;
255 }
256 else
257 {
258 return DbType.String;
259 }
260 }
261
262 /// <summary>
263 /// </summary>
264 /// <param name="type">a Type</param>
265 /// <returns>a string</returns>
266 /// <remarks>this is something we'll need to implement for each db slightly differently.</remarks>
267 public static string sqliteType(Type type)
268 {
269 if (type == typeof (String))
270 {
271 return "varchar(255)";
272 }
273 else if (type == typeof (Int32))
274 {
275 return "integer";
276 }
277 else if (type == typeof (UInt32))
278 {
279 return "integer";
280 }
281 else if (type == typeof (Int64))
282 {
283 return "varchar(255)";
284 }
285 else if (type == typeof (UInt64))
286 {
287 return "varchar(255)";
288 }
289 else if (type == typeof (Double))
290 {
291 return "float";
292 }
293 else if (type == typeof (Boolean))
294 {
295 return "integer";
296 }
297 else if (type == typeof (Byte[]))
298 {
299 return "blob";
300 }
301 else
302 {
303 return "string";
304 }
305 }
306 }
307}
diff --git a/OpenSim/Data/SQLiteLegacy/SQLiteXInventoryData.cs b/OpenSim/Data/SQLiteLegacy/SQLiteXInventoryData.cs
deleted file mode 100644
index 5422cbf..0000000
--- a/OpenSim/Data/SQLiteLegacy/SQLiteXInventoryData.cs
+++ /dev/null
@@ -1,155 +0,0 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator Project nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28using System;
29using System.Data;
30using System.Reflection;
31using System.Collections.Generic;
32using Mono.Data.SqliteClient;
33using log4net;
34using OpenMetaverse;
35using OpenSim.Framework;
36
37namespace OpenSim.Data.SQLiteLegacy
38{
39 /// <summary>
40 /// A MySQL Interface for the Asset Server
41 /// </summary>
42 public class SQLiteXInventoryData : IXInventoryData
43 {
44// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
45
46 private SQLiteGenericTableHandler<XInventoryFolder> m_Folders;
47 private SqliteItemHandler m_Items;
48
49 public SQLiteXInventoryData(string conn, string realm)
50 {
51 m_Folders = new SQLiteGenericTableHandler<XInventoryFolder>(
52 conn, "inventoryfolders", "InventoryStore");
53 m_Items = new SqliteItemHandler(
54 conn, "inventoryitems", String.Empty);
55 }
56
57 public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
58 {
59 return m_Folders.Get(fields, vals);
60 }
61
62 public XInventoryItem[] GetItems(string[] fields, string[] vals)
63 {
64 return m_Items.Get(fields, vals);
65 }
66
67 public bool StoreFolder(XInventoryFolder folder)
68 {
69 return m_Folders.Store(folder);
70 }
71
72 public bool StoreItem(XInventoryItem item)
73 {
74 return m_Items.Store(item);
75 }
76
77 public bool DeleteFolders(string field, string val)
78 {
79 return m_Folders.Delete(field, val);
80 }
81
82 public bool DeleteItems(string field, string val)
83 {
84 return m_Items.Delete(field, val);
85 }
86
87 public bool MoveItem(string id, string newParent)
88 {
89 return m_Items.MoveItem(id, newParent);
90 }
91
92 public XInventoryItem[] GetActiveGestures(UUID principalID)
93 {
94 return m_Items.GetActiveGestures(principalID);
95 }
96
97 public int GetAssetPermissions(UUID principalID, UUID assetID)
98 {
99 return m_Items.GetAssetPermissions(principalID, assetID);
100 }
101 }
102
103 public class SqliteItemHandler : SQLiteGenericTableHandler<XInventoryItem>
104 {
105 public SqliteItemHandler(string c, string t, string m) :
106 base(c, t, m)
107 {
108 }
109
110 public bool MoveItem(string id, string newParent)
111 {
112 SqliteCommand cmd = new SqliteCommand();
113
114 cmd.CommandText = String.Format("update {0} set parentFolderID = :ParentFolderID where inventoryID = :InventoryID", m_Realm);
115 cmd.Parameters.Add(new SqliteParameter(":ParentFolderID", newParent));
116 cmd.Parameters.Add(new SqliteParameter(":InventoryID", id));
117
118 return ExecuteNonQuery(cmd, m_Connection) == 0 ? false : true;
119 }
120
121 public XInventoryItem[] GetActiveGestures(UUID principalID)
122 {
123 SqliteCommand cmd = new SqliteCommand();
124 cmd.CommandText = String.Format("select * from inventoryitems where avatarId = :uuid and assetType = :type and flags = 1", m_Realm);
125
126 cmd.Parameters.Add(new SqliteParameter(":uuid", principalID.ToString()));
127 cmd.Parameters.Add(new SqliteParameter(":type", (int)AssetType.Gesture));
128
129 return DoQuery(cmd);
130 }
131
132 public int GetAssetPermissions(UUID principalID, UUID assetID)
133 {
134 SqliteCommand cmd = new SqliteCommand();
135
136 cmd.CommandText = String.Format("select inventoryCurrentPermissions from inventoryitems where avatarID = :PrincipalID and assetID = :AssetID", m_Realm);
137 cmd.Parameters.Add(new SqliteParameter(":PrincipalID", principalID.ToString()));
138 cmd.Parameters.Add(new SqliteParameter(":AssetID", assetID.ToString()));
139
140 IDataReader reader = ExecuteReader(cmd, m_Connection);
141
142 int perms = 0;
143
144 while (reader.Read())
145 {
146 perms |= Convert.ToInt32(reader["inventoryCurrentPermissions"]);
147 }
148
149 reader.Close();
150 CloseCommand(cmd);
151
152 return perms;
153 }
154 }
155}
diff --git a/OpenSim/Framework/ILandObject.cs b/OpenSim/Framework/ILandObject.cs
index 98ea01e..5a55b02 100644
--- a/OpenSim/Framework/ILandObject.cs
+++ b/OpenSim/Framework/ILandObject.cs
@@ -82,8 +82,30 @@ namespace OpenSim.Framework
82 void ForceUpdateLandInfo(); 82 void ForceUpdateLandInfo();
83 void SetLandBitmap(bool[,] bitmap); 83 void SetLandBitmap(bool[,] bitmap);
84 84
85 /// <summary>
86 /// Get a land bitmap that would cover an entire region.
87 /// </summary>
88 /// <returns>The bitmap created.</returns>
85 bool[,] BasicFullRegionLandBitmap(); 89 bool[,] BasicFullRegionLandBitmap();
90
91 /// <summary>
92 /// Create a square land bitmap.
93 /// </summary>
94 /// <remarks>
95 /// Land co-ordinates are zero indexed. The inputs are treated as points. So if you want to create a bitmap
96 /// that covers an entire 256 x 256m region apart from a strip of land on the east, then you would need to
97 /// specify start_x = 0, start_y = 0, end_x = 252 (or anything up to 255), end_y = 256.
98 ///
99 /// At the moment, the smallest parcel of land is 4m x 4m, so if the
100 /// region is 256 x 256m (the SL size), the bitmap returned will start at (0,0) and end at (63,63).
101 /// </remarks>
102 /// <param name="start_x"></param>
103 /// <param name="start_y"></param>
104 /// <param name="end_x"></param>
105 /// <param name="end_y"></param>
106 /// <returns>The bitmap created.</returns>
86 bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y); 107 bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y);
108
87 bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value); 109 bool[,] ModifyLandBitmapSquare(bool[,] land_bitmap, int start_x, int start_y, int end_x, int end_y, bool set_value);
88 bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add); 110 bool[,] MergeLandBitmaps(bool[,] bitmap_base, bool[,] bitmap_add);
89 void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client); 111 void SendForceObjectSelect(int local_id, int request_type, List<UUID> returnIDs, IClientAPI remote_client);
diff --git a/OpenSim/Region/Application/Application.cs b/OpenSim/Region/Application/Application.cs
index d120f03..7e320e6 100644
--- a/OpenSim/Region/Application/Application.cs
+++ b/OpenSim/Region/Application/Application.cs
@@ -250,9 +250,7 @@ namespace OpenSim
250 m_saveCrashDumps = configSource.Configs["Startup"].GetBoolean("save_crashes", false); 250 m_saveCrashDumps = configSource.Configs["Startup"].GetBoolean("save_crashes", false);
251 251
252 // load Crash directory config 252 // load Crash directory config
253 m_crashDir = configSource.Configs["Startup"].GetString("crash_dir", m_crashDir); 253 m_crashDir = configSource.Configs["Startup"].GetString("crash_dir", m_crashDir);
254
255
256 254
257 if (background) 255 if (background)
258 { 256 {
@@ -260,15 +258,9 @@ namespace OpenSim
260 m_sim.Startup(); 258 m_sim.Startup();
261 } 259 }
262 else 260 else
263 { 261 {
264
265
266
267
268 m_sim = new OpenSim(configSource); 262 m_sim = new OpenSim(configSource);
269 263
270
271
272 m_sim.Startup(); 264 m_sim.Startup();
273 265
274 while (true) 266 while (true)
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index 9905a53..f28faed 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -529,6 +529,10 @@ namespace OpenSim.Region.CoreModules.World.Land
529 { 529 {
530 if (landBitmap[x, y]) 530 if (landBitmap[x, y])
531 { 531 {
532// m_log.DebugFormat(
533// "[LAND MANAGEMENT MODULE]: Registering parcel {0} for land co-ord ({1}, {2}) on {3}",
534// new_land.LandData.Name, x, y, m_scene.RegionInfo.RegionName);
535
532 m_landIDList[x, y] = newLandLocalID; 536 m_landIDList[x, y] = newLandLocalID;
533 } 537 }
534 } 538 }
@@ -658,8 +662,16 @@ namespace OpenSim.Region.CoreModules.World.Land
658 // Corner case. If an autoreturn happens during sim startup 662 // Corner case. If an autoreturn happens during sim startup
659 // we will come here with the list uninitialized 663 // we will come here with the list uninitialized
660 // 664 //
665 int landId = m_landIDList[x, y];
666
667// if (landId == 0)
668// m_log.DebugFormat(
669// "[LAND MANAGEMENT MODULE]: No land object found at ({0}, {1}) on {2}",
670// x, y, m_scene.RegionInfo.RegionName);
671
661 if (m_landList.ContainsKey(m_landIDList[x, y])) 672 if (m_landList.ContainsKey(m_landIDList[x, y]))
662 return m_landList[m_landIDList[x, y]]; 673 return m_landList[m_landIDList[x, y]];
674
663 return null; 675 return null;
664 } 676 }
665 } 677 }
diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
index 57c7fc6..fe6b83a 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs
@@ -736,23 +736,11 @@ namespace OpenSim.Region.CoreModules.World.Land
736 return LandBitmap; 736 return LandBitmap;
737 } 737 }
738 738
739 /// <summary>
740 /// Full sim land object creation
741 /// </summary>
742 /// <returns></returns>
743 public bool[,] BasicFullRegionLandBitmap() 739 public bool[,] BasicFullRegionLandBitmap()
744 { 740 {
745 return GetSquareLandBitmap(0, 0, (int) Constants.RegionSize, (int) Constants.RegionSize); 741 return GetSquareLandBitmap(0, 0, (int) Constants.RegionSize, (int) Constants.RegionSize);
746 } 742 }
747 743
748 /// <summary>
749 /// Used to modify the bitmap between the x and y points. Points use 64 scale
750 /// </summary>
751 /// <param name="start_x"></param>
752 /// <param name="start_y"></param>
753 /// <param name="end_x"></param>
754 /// <param name="end_y"></param>
755 /// <returns></returns>
756 public bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y) 744 public bool[,] GetSquareLandBitmap(int start_x, int start_y, int end_x, int end_y)
757 { 745 {
758 bool[,] tempBitmap = new bool[64,64]; 746 bool[,] tempBitmap = new bool[64,64];
diff --git a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
index 9e931a6..f466194 100644
--- a/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/PrimCountModule.cs
@@ -173,19 +173,32 @@ namespace OpenSim.Region.CoreModules.World.Land
173 173
174 // NOTE: Call under Taint Lock 174 // NOTE: Call under Taint Lock
175 private void AddObject(SceneObjectGroup obj) 175 private void AddObject(SceneObjectGroup obj)
176 { 176 {
177// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding object {0} {1} to prim count", obj.Name, obj.UUID);
178
179 if (obj.IsAttachment) 177 if (obj.IsAttachment)
180 return; 178 return;
181 if (((obj.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0)) 179 if (((obj.RootPart.Flags & PrimFlags.TemporaryOnRez) != 0))
182 return; 180 return;
183 181
184 Vector3 pos = obj.AbsolutePosition; 182 Vector3 pos = obj.AbsolutePosition;
185 ILandObject landObject = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y); 183 ILandObject landObject = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y);
184
185 // If for some reason there is no land object (perhaps the object is out of bounds) then we can't count it
186 if (landObject == null)
187 {
188// m_log.WarnFormat(
189// "[PRIM COUNT MODULE]: Found no land object for {0} at position ({1}, {2}) on {3}",
190// obj.Name, pos.X, pos.Y, m_Scene.RegionInfo.RegionName);
191
192 return;
193 }
194
186 LandData landData = landObject.LandData; 195 LandData landData = landObject.LandData;
187 196
188// m_log.DebugFormat( 197// m_log.DebugFormat(
198// "[PRIM COUNT MODULE]: Adding object {0} with {1} parts to prim count for parcel {2} on {3}",
199// obj.Name, obj.Parts.Length, landData.Name, m_Scene.RegionInfo.RegionName);
200
201// m_log.DebugFormat(
189// "[PRIM COUNT MODULE]: Object {0} is owned by {1} over land owned by {2}", 202// "[PRIM COUNT MODULE]: Object {0} is owned by {1} over land owned by {2}",
190// obj.Name, obj.OwnerID, landData.OwnerID); 203// obj.Name, obj.OwnerID, landData.OwnerID);
191 204
@@ -468,7 +481,9 @@ namespace OpenSim.Region.CoreModules.World.Land
468 481
469 m_OwnerMap[landData.GlobalID] = landData.OwnerID; 482 m_OwnerMap[landData.GlobalID] = landData.OwnerID;
470 m_SimwideCounts[landData.OwnerID] = 0; 483 m_SimwideCounts[landData.OwnerID] = 0;
471// m_log.DebugFormat("[PRIM COUNT MODULE]: Adding parcel count for {0}", landData.GlobalID); 484// m_log.DebugFormat(
485// "[PRIM COUNT MODULE]: Initializing parcel count for {0} on {1}",
486// landData.Name, m_Scene.RegionInfo.RegionName);
472 m_ParcelCounts[landData.GlobalID] = new ParcelCounts(); 487 m_ParcelCounts[landData.GlobalID] = new ParcelCounts();
473 } 488 }
474 489
diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
index f006db2..67b00ac 100644
--- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
@@ -49,7 +49,16 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
49 protected UUID m_otherUserId = new UUID("99999999-9999-9999-9999-999999999999"); 49 protected UUID m_otherUserId = new UUID("99999999-9999-9999-9999-999999999999");
50 protected TestScene m_scene; 50 protected TestScene m_scene;
51 protected PrimCountModule m_pcm; 51 protected PrimCountModule m_pcm;
52
53 /// <summary>
54 /// A parcel that covers the entire sim except for a 1 unit wide strip on the eastern side.
55 /// </summary>
52 protected ILandObject m_lo; 56 protected ILandObject m_lo;
57
58 /// <summary>
59 /// A parcel that covers just the eastern strip of the sim.
60 /// </summary>
61 protected ILandObject m_lo2;
53 62
54 [SetUp] 63 [SetUp]
55 public void SetUp() 64 public void SetUp()
@@ -59,10 +68,19 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
59 m_scene = SceneSetupHelpers.SetupScene(); 68 m_scene = SceneSetupHelpers.SetupScene();
60 SceneSetupHelpers.SetupSceneModules(m_scene, lmm, m_pcm); 69 SceneSetupHelpers.SetupSceneModules(m_scene, lmm, m_pcm);
61 70
71 int xParcelDivider = (int)Constants.RegionSize - 1;
72
62 ILandObject lo = new LandObject(m_userId, false, m_scene); 73 ILandObject lo = new LandObject(m_userId, false, m_scene);
63 lo.SetLandBitmap(lo.GetSquareLandBitmap(0, 0, (int)Constants.RegionSize, (int)Constants.RegionSize)); 74 lo.LandData.Name = "m_lo";
64 m_lo = lmm.AddLandObject(lo); 75 lo.SetLandBitmap(
65 //scene.loadAllLandObjectsFromStorage(scene.RegionInfo.originRegionID); 76 lo.GetSquareLandBitmap(0, 0, xParcelDivider, (int)Constants.RegionSize));
77 m_lo = lmm.AddLandObject(lo);
78
79 ILandObject lo2 = new LandObject(m_userId, false, m_scene);
80 lo2.SetLandBitmap(
81 lo2.GetSquareLandBitmap(xParcelDivider, 0, (int)Constants.RegionSize, (int)Constants.RegionSize));
82 lo2.LandData.Name = "m_lo2";
83 m_lo2 = lmm.AddLandObject(lo2);
66 } 84 }
67 85
68 /// <summary> 86 /// <summary>
@@ -94,7 +112,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
94 112
95 IPrimCounts pc = m_lo.PrimCounts; 113 IPrimCounts pc = m_lo.PrimCounts;
96 114
97 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01); 115 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, "a", 0x01);
98 m_scene.AddNewSceneObject(sog, false); 116 m_scene.AddNewSceneObject(sog, false);
99 117
100 Assert.That(pc.Owner, Is.EqualTo(3)); 118 Assert.That(pc.Owner, Is.EqualTo(3));
@@ -107,7 +125,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
107 Assert.That(pc.Simulator, Is.EqualTo(3)); 125 Assert.That(pc.Simulator, Is.EqualTo(3));
108 126
109 // Add a second object and retest 127 // Add a second object and retest
110 SceneObjectGroup sog2 = SceneSetupHelpers.CreateSceneObject(2, m_userId, 0x10); 128 SceneObjectGroup sog2 = SceneSetupHelpers.CreateSceneObject(2, m_userId, "b", 0x10);
111 m_scene.AddNewSceneObject(sog2, false); 129 m_scene.AddNewSceneObject(sog2, false);
112 130
113 Assert.That(pc.Owner, Is.EqualTo(5)); 131 Assert.That(pc.Owner, Is.EqualTo(5));
@@ -124,14 +142,14 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
124 /// Test count after a parcel owner owned copied object is added. 142 /// Test count after a parcel owner owned copied object is added.
125 /// </summary> 143 /// </summary>
126 [Test] 144 [Test]
127 public void TestCopiedOwnerObject() 145 public void TestCopyOwnerObject()
128 { 146 {
129 TestHelper.InMethod(); 147 TestHelper.InMethod();
130// log4net.Config.XmlConfigurator.Configure(); 148// log4net.Config.XmlConfigurator.Configure();
131 149
132 IPrimCounts pc = m_lo.PrimCounts; 150 IPrimCounts pc = m_lo.PrimCounts;
133 151
134 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01); 152 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, "a", 0x01);
135 m_scene.AddNewSceneObject(sog, false); 153 m_scene.AddNewSceneObject(sog, false);
136 m_scene.SceneGraph.DuplicateObject(sog.LocalId, Vector3.Zero, 0, m_userId, UUID.Zero, Quaternion.Identity); 154 m_scene.SceneGraph.DuplicateObject(sog.LocalId, Vector3.Zero, 0, m_userId, UUID.Zero, Quaternion.Identity);
137 155
@@ -143,7 +161,69 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
143 Assert.That(pc.Users[m_userId], Is.EqualTo(6)); 161 Assert.That(pc.Users[m_userId], Is.EqualTo(6));
144 Assert.That(pc.Users[m_otherUserId], Is.EqualTo(0)); 162 Assert.That(pc.Users[m_otherUserId], Is.EqualTo(0));
145 Assert.That(pc.Simulator, Is.EqualTo(6)); 163 Assert.That(pc.Simulator, Is.EqualTo(6));
146 } 164 }
165
166 /// <summary>
167 /// Test that parcel counts update correctly when an object is moved between parcels, where that movement
168 /// is not done directly by the user/
169 /// </summary>
170 [Test]
171 public void TestMoveOwnerObject()
172 {
173 TestHelper.InMethod();
174// log4net.Config.XmlConfigurator.Configure();
175
176 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, "a", 0x01);
177 m_scene.AddNewSceneObject(sog, false);
178 SceneObjectGroup sog2 = SceneSetupHelpers.CreateSceneObject(2, m_userId, "b", 0x10);
179 m_scene.AddNewSceneObject(sog2, false);
180
181 // Move the first scene object to the eastern strip parcel
182 sog.AbsolutePosition = new Vector3(254, 2, 2);
183
184 IPrimCounts pclo1 = m_lo.PrimCounts;
185
186 Assert.That(pclo1.Owner, Is.EqualTo(2));
187 Assert.That(pclo1.Group, Is.EqualTo(0));
188 Assert.That(pclo1.Others, Is.EqualTo(0));
189 Assert.That(pclo1.Total, Is.EqualTo(2));
190 Assert.That(pclo1.Selected, Is.EqualTo(0));
191 Assert.That(pclo1.Users[m_userId], Is.EqualTo(2));
192 Assert.That(pclo1.Users[m_otherUserId], Is.EqualTo(0));
193 Assert.That(pclo1.Simulator, Is.EqualTo(5));
194
195 IPrimCounts pclo2 = m_lo2.PrimCounts;
196
197 Assert.That(pclo2.Owner, Is.EqualTo(3));
198 Assert.That(pclo2.Group, Is.EqualTo(0));
199 Assert.That(pclo2.Others, Is.EqualTo(0));
200 Assert.That(pclo2.Total, Is.EqualTo(3));
201 Assert.That(pclo2.Selected, Is.EqualTo(0));
202 Assert.That(pclo2.Users[m_userId], Is.EqualTo(3));
203 Assert.That(pclo2.Users[m_otherUserId], Is.EqualTo(0));
204 Assert.That(pclo2.Simulator, Is.EqualTo(5));
205
206 // Now move it back again
207 sog.AbsolutePosition = new Vector3(2, 2, 2);
208
209 Assert.That(pclo1.Owner, Is.EqualTo(5));
210 Assert.That(pclo1.Group, Is.EqualTo(0));
211 Assert.That(pclo1.Others, Is.EqualTo(0));
212 Assert.That(pclo1.Total, Is.EqualTo(5));
213 Assert.That(pclo1.Selected, Is.EqualTo(0));
214 Assert.That(pclo1.Users[m_userId], Is.EqualTo(5));
215 Assert.That(pclo1.Users[m_otherUserId], Is.EqualTo(0));
216 Assert.That(pclo1.Simulator, Is.EqualTo(5));
217
218 Assert.That(pclo2.Owner, Is.EqualTo(0));
219 Assert.That(pclo2.Group, Is.EqualTo(0));
220 Assert.That(pclo2.Others, Is.EqualTo(0));
221 Assert.That(pclo2.Total, Is.EqualTo(0));
222 Assert.That(pclo2.Selected, Is.EqualTo(0));
223 Assert.That(pclo2.Users[m_userId], Is.EqualTo(0));
224 Assert.That(pclo2.Users[m_otherUserId], Is.EqualTo(0));
225 Assert.That(pclo2.Simulator, Is.EqualTo(5));
226 }
147 227
148 /// <summary> 228 /// <summary>
149 /// Test count after a parcel owner owned object is removed. 229 /// Test count after a parcel owner owned object is removed.
@@ -156,8 +236,8 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
156 236
157 IPrimCounts pc = m_lo.PrimCounts; 237 IPrimCounts pc = m_lo.PrimCounts;
158 238
159 m_scene.AddNewSceneObject(SceneSetupHelpers.CreateSceneObject(1, m_userId, 0x1), false); 239 m_scene.AddNewSceneObject(SceneSetupHelpers.CreateSceneObject(1, m_userId, "a", 0x1), false);
160 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x10); 240 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_userId, "b", 0x10);
161 m_scene.AddNewSceneObject(sogToDelete, false); 241 m_scene.AddNewSceneObject(sogToDelete, false);
162 m_scene.DeleteSceneObject(sogToDelete, false); 242 m_scene.DeleteSceneObject(sogToDelete, false);
163 243
@@ -181,7 +261,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
181 261
182 IPrimCounts pc = m_lo.PrimCounts; 262 IPrimCounts pc = m_lo.PrimCounts;
183 263
184 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, 0x01); 264 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, "a", 0x01);
185 sog.GroupID = m_groupId; 265 sog.GroupID = m_groupId;
186 m_scene.AddNewSceneObject(sog, false); 266 m_scene.AddNewSceneObject(sog, false);
187 267
@@ -212,11 +292,11 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
212 292
213 IPrimCounts pc = m_lo.PrimCounts; 293 IPrimCounts pc = m_lo.PrimCounts;
214 294
215 SceneObjectGroup sogToKeep = SceneSetupHelpers.CreateSceneObject(1, m_userId, 0x1); 295 SceneObjectGroup sogToKeep = SceneSetupHelpers.CreateSceneObject(1, m_userId, "a", 0x1);
216 sogToKeep.GroupID = m_groupId; 296 sogToKeep.GroupID = m_groupId;
217 m_scene.AddNewSceneObject(sogToKeep, false); 297 m_scene.AddNewSceneObject(sogToKeep, false);
218 298
219 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x10); 299 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_userId, "b", 0x10);
220 m_scene.AddNewSceneObject(sogToDelete, false); 300 m_scene.AddNewSceneObject(sogToDelete, false);
221 m_scene.DeleteSceneObject(sogToDelete, false); 301 m_scene.DeleteSceneObject(sogToDelete, false);
222 302
@@ -239,7 +319,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
239 319
240 IPrimCounts pc = m_lo.PrimCounts; 320 IPrimCounts pc = m_lo.PrimCounts;
241 321
242 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, 0x01); 322 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, "a", 0x01);
243 m_scene.AddNewSceneObject(sog, false); 323 m_scene.AddNewSceneObject(sog, false);
244 324
245 Assert.That(pc.Owner, Is.EqualTo(0)); 325 Assert.That(pc.Owner, Is.EqualTo(0));
@@ -260,8 +340,8 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
260 340
261 IPrimCounts pc = m_lo.PrimCounts; 341 IPrimCounts pc = m_lo.PrimCounts;
262 342
263 m_scene.AddNewSceneObject(SceneSetupHelpers.CreateSceneObject(1, m_otherUserId, 0x1), false); 343 m_scene.AddNewSceneObject(SceneSetupHelpers.CreateSceneObject(1, m_otherUserId, "a", 0x1), false);
264 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, 0x10); 344 SceneObjectGroup sogToDelete = SceneSetupHelpers.CreateSceneObject(3, m_otherUserId, "b", 0x10);
265 m_scene.AddNewSceneObject(sogToDelete, false); 345 m_scene.AddNewSceneObject(sogToDelete, false);
266 m_scene.DeleteSceneObject(sogToDelete, false); 346 m_scene.DeleteSceneObject(sogToDelete, false);
267 347
@@ -284,7 +364,7 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
284 TestHelper.InMethod(); 364 TestHelper.InMethod();
285 IPrimCounts pc = m_lo.PrimCounts; 365 IPrimCounts pc = m_lo.PrimCounts;
286 366
287 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01); 367 SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, "a", 0x01);
288 m_scene.AddNewSceneObject(sog, false); 368 m_scene.AddNewSceneObject(sog, false);
289 369
290 m_pcm.TaintPrimCount(); 370 m_pcm.TaintPrimCount();
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 62e7d36..6773e08 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1957,7 +1957,7 @@ namespace OpenSim.Region.Framework.Scenes
1957 { 1957 {
1958 SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; 1958 SceneObjectGroupsByLocalPartID[copy.LocalId] = copy;
1959 foreach (SceneObjectPart part in children) 1959 foreach (SceneObjectPart part in children)
1960 SceneObjectGroupsByLocalPartID[copy.LocalId] = copy; 1960 SceneObjectGroupsByLocalPartID[part.LocalId] = copy;
1961 } 1961 }
1962 // PROBABLE END OF FIXME 1962 // PROBABLE END OF FIXME
1963 1963
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 86f06ca..759fc23 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -419,6 +419,8 @@ namespace OpenSim.Region.Framework.Scenes
419 //m_rootPart.GroupPosition.Z); 419 //m_rootPart.GroupPosition.Z);
420 //m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); 420 //m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor);
421 //} 421 //}
422
423 m_scene.EventManager.TriggerParcelPrimCountTainted();
422 } 424 }
423 } 425 }
424 426
diff --git a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
index 57850c1..709dd78 100644
--- a/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
+++ b/OpenSim/Tests/Common/Setup/SceneSetupHelpers.cs
@@ -489,32 +489,38 @@ namespace OpenSim.Tests.Common.Setup
489 /// <returns></returns> 489 /// <returns></returns>
490 public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId) 490 public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId)
491 { 491 {
492 return CreateSceneObject(parts, ownerId, 0x1); 492 return CreateSceneObject(parts, ownerId, "", 0x1);
493 } 493 }
494 494
495 /// <summary> 495 /// <summary>
496 /// Create a scene object but do not add it to the scene. 496 /// Create a scene object but do not add it to the scene.
497 /// </summary> 497 /// </summary>
498 /// <param name="parts">The number of parts that should be in the scene object</param> 498 /// <param name="parts">
499 /// The number of parts that should be in the scene object
500 /// </param>
499 /// <param name="ownerId"></param> 501 /// <param name="ownerId"></param>
502 /// <param name="partNamePrefix">
503 /// The prefix to be given to part names. This will be suffixed with "Part<part no>"
504 /// (e.g. mynamePart0 for the root part)
505 /// </param>
500 /// <param name="uuidTail"> 506 /// <param name="uuidTail">
501 /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}" 507 /// The hexadecimal last part of the UUID for parts created. A UUID of the form "00000000-0000-0000-0000-{0:XD12}"
502 /// will be given to the root part, and incremented for each part thereafter. 508 /// will be given to the root part, and incremented for each part thereafter.
503 /// </param> 509 /// </param>
504 /// <returns></returns> 510 /// <returns></returns>
505 public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId, int uuidTail) 511 public static SceneObjectGroup CreateSceneObject(int parts, UUID ownerId, string partNamePrefix, int uuidTail)
506 { 512 {
507 string rawSogId = string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail); 513 string rawSogId = string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail);
508 514
509 SceneObjectGroup sog 515 SceneObjectGroup sog
510 = new SceneObjectGroup( 516 = new SceneObjectGroup(
511 CreateSceneObjectPart("part0", new UUID(rawSogId), ownerId)); 517 CreateSceneObjectPart(string.Format("{0}Part0", partNamePrefix), new UUID(rawSogId), ownerId));
512 518
513 if (parts > 1) 519 if (parts > 1)
514 for (int i = 1; i < parts; i++) 520 for (int i = 1; i < parts; i++)
515 sog.AddPart( 521 sog.AddPart(
516 CreateSceneObjectPart( 522 CreateSceneObjectPart(
517 string.Format("obj{0}", i), 523 string.Format("{0}Part{1}", partNamePrefix, i),
518 new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)), 524 new UUID(string.Format("00000000-0000-0000-0000-{0:X12}", uuidTail + i)),
519 ownerId)); 525 ownerId));
520 526