Compare commits

...

1085 Commits

Author SHA1 Message Date
Justin Clark-Casey (justincc)
d62acc7e37 Update information in OpenSimDefaults to reflect the fact that ScriptStopStrategy in [XEngine] can now be changed without manually deleting old compiled scripts. 2014-07-14 20:53:06 +01:00
Justin Clark-Casey (justincc)
0c8f3dddd8 Use thread-safe version of .NET Random as the SDK class is not thread-safe.
As per http://msdn.microsoft.com/en-us/library/system.random%28v=vs.100%29.aspx, the .NET Random class is not thread-safe.
If called by multiple threads at once, methods may return 0.
Except for llRand(), other OpenSimulator code did not lock before calling a shared Random instance.
This commit adds a ThreadSafeRandom class that extends Random but does internal locking so that it is thread-safe.
This change is invisible to existing callers and the explicit locking in the llFrand() implementation is now redundant.
2014-07-14 20:08:11 +01:00
Justin Clark-Casey (justincc)
e008d54cd4 minor: Remove compiler warning in GridService 2014-07-14 19:28:43 +01:00
Dev Random
4e92b55231 Call RemoveScriptInstance when removing from inventory 2014-07-14 18:06:24 +01:00
Justin Clark-Casey (justincc)
2766bf3fef minor: Move debug xengine script console command to Debug help section where other debug commands live. 2014-07-11 00:18:39 +01:00
Justin Clark-Casey (justincc)
15b38f0036 minor: further cleanup of old vb and yield prolog script engine references that were removed some time ago 2014-07-11 00:15:47 +01:00
Justin Clark-Casey (justincc)
d7b9260496 If [XEngine] ScriptStopStrategy is changed between abort and co-op, for the existing session use the previous strategy for that script rather than not starting the script at all.
We have to do this since we can't unload existing DLLs if they're all in the same AppDomain.
But we can still update the underlying DLL which will be used in the next simulator session.
2014-07-11 00:03:02 +01:00
Justin Clark-Casey (justincc)
6d3b409af2 refactor: use existing Compiler.CreateScriptsDirectory() (renamed to CheckOrCreateScriptsDirectory()) when checking that scripts directory exists on compile.
Code was identical apart from error logging, but if there are failures creating these directories then you'll be
seeing lots of errors anyway, and these will be more informative
2014-07-10 19:40:44 +01:00
Justin Clark-Casey (justincc)
fea18a909f Fix bug in "show modules" comamnd that was showing shared modules as non-shared and non-shared as shared 2014-07-09 23:24:12 +01:00
Justin Clark-Casey (justincc)
a8860d79d8 Turn RestClient.Request() logging down the debug and comment out for now. 2014-07-09 23:12:14 +01:00
Justin Clark-Casey (justincc)
8ae5ab809f Fix issue with running "stats record start|stop" console command
In commit e6080a38 (Wed Mar 19 00:29:36 2014) I renamed this from "debug stats record start|stop"
Unfortunately, I didn't do this fully so before this commit "stats record start|stop" will report a usage failure with the old debug text.
Unfortunately this is in the 0.8 release.  The workaround is to repeat the last command twice (e.g. "stats record start start")
2014-07-08 18:49:57 +01:00
Diva Canto
ba233008cd Changed GetUserInfo so that the exposure of user account details is ruled by a configuration variable. It's on by default. 2014-07-06 16:02:04 -07:00
Diva Canto
108978be1e Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-07-06 15:17:27 -07:00
Blake Bourque
63b5c11b9c Lookup username given key(uuid) XML-RPC 2014-07-06 15:14:55 -07:00
Justin Clark-Casey (justincc)
219d273418 Add experimental "show grid size" robust console command.
This will show an approximate grid size that doesn't count regions that are hyperlinks
Not particularly trustworthy since it will still count regions that are not active but were not deregistered (deliberately or due to simulator crash or similar)
2014-07-05 00:50:33 +01:00
Diva Canto
bb9071e5f0 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-07-04 16:28:58 -07:00
Diva Canto
869191a51d Small change to my previous commit: not so aggressive on the trigger, please. 2014-07-04 16:28:37 -07:00
Justin Clark-Casey (justincc)
b019fd5a95 Show region size column in simulator version of "show regions" console command 2014-07-05 00:20:39 +01:00
Justin Clark-Casey (justincc)
82a5d00bc8 Adjust "show regions" and "show region" robust service console output to show size
"show regions" drops the owner id column but is till present in "show region"
"show regions" name column expanded to allow for longer hg regions (probably still too short, may eventually have to truncate rather than taking up huge screen space)
2014-07-05 00:15:35 +01:00
Diva Canto
dac8703949 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-07-04 15:56:32 -07:00
Diva Canto
78c155cd12 Instrument the UDP path of creating assets so that it triggers an asset post for users with different asset servers 2014-07-04 15:56:09 -07:00
Justin Clark-Casey (justincc)
4b73268cbd minor: put standard 'category' in brackets at front of log messages from previous commit 3d70db4a 2014-07-04 23:48:37 +01:00
Latif Khalifa
3d70db4a58 When uploading mesh objects with textures also create inventory items for uploaded textures.
This implements:
http://opensimulator.org/mantis/view.php?id=7250
2014-07-04 23:40:09 +01:00
AliciaRaven
6e0e35cd66 Include option to remove auto backup files older than given number of days. New property created to specify how many days to keep files for. Off by default, also made sure only oar files will be removed. 2014-07-04 23:32:13 +01:00
Justin Clark-Casey (justincc)
20b47fce07 Still log (but this time with warning rather than an exception) if we regenerate a new child caps seed for a region where we already have one.
I think it's still useful to know this to show up any errors early, but it's reasonable to still carry on rather than throw an exception.
Follow on from Diva's commit 9643792
2014-07-04 22:59:10 +01:00
Diva Canto
82b875317b On logout, delay the removal of AgentCircuitData until the very end, because that data structure contains important information about the agent that may be needed by modules. 2014-07-04 14:36:11 -07:00
Diva Canto
60ad72357e This fixes the bug related to rebooting neighboring varregions while avatars are logged in; the avies would not see the region anymore until they relogged. Same problem as before: inconsistent calculation of scope. 2014-07-04 11:45:30 -07:00
Diva Canto
d99c8e68a7 It turns out that child agent management has had a bug for a while: there was an inconsistency in the scope between opening and closing child agents in neighboring regions. For opening (in EnableChildAgents), the region's DrawDistance was being used; for closing (in IsOUtsideView) , the viewer's (SP) DrawDistance was being used. This fixes this inconsistency, therefore eliminating bugs observed in TPs between, at least, neighboring varregions. 2014-07-04 10:13:53 -07:00
Diva Canto
d0782c2bc0 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-07-03 20:09:38 -07:00
Diva Canto
9643792b34 Avoid an exception in creating child agents some times. 2014-07-03 20:09:16 -07:00
Justin Clark-Casey (justincc)
4ba396b81c Temporarily disable new regression test TestLifecycle() until I have a chance to fix it
This was working for me locally because it was still picking up all my *.ini config files, which jenkins won't have in its test env
2014-07-03 00:30:42 +01:00
Justin Clark-Casey (justincc)
c3923a1aa6 Re-enabled TestLifecycle regression test logging so I can get some idea of why it's failing on jenkins but not locally 2014-07-03 00:01:47 +01:00
Justin Clark-Casey (justincc)
889194db63 Actually call Close() for shared region modules when the simulator is being shutdown.
Adds regression test for this case.
2014-07-02 23:49:25 +01:00
Justin Clark-Casey (justincc)
fe6dab7f13 minor: Change default max phys prim size in code to match OpenSimDefaults.ini 2014-06-28 00:20:09 +01:00
Justin Clark-Casey (justincc)
cd031d129a minor: change allow script crossings default in code to true in order to match OpenSimDefaults.ini 2014-06-28 00:18:00 +01:00
dahlia
9d2789aff8 add LSL constant PRIM_ALPHA_MODE 2014-06-27 16:06:03 -07:00
Vegaslon
abf85b7f19 Bulletsim: Create AvatarTerminalVelocity to BulletSim like what ODE and SL has. Before this falling from really high caused the avatar to fall faster then the veiwer can handle and cause camera issues. 2014-06-27 23:34:34 +01:00
dahlia
a93799d03b add LSL constants PRIM_SPECULAR and PRIM_NORMAL 2014-06-23 20:06:22 -07:00
Diva Canto
ca2379ee83 Bug fix in map teleports in varregions. The cherry was missing from the ice-cream Sunday: the packet itself was hardcoding the size of the region... 2014-06-21 15:38:38 -07:00
Robert Adams
481b7c71c3 BulletSim: add some locking for collision lists to prevent collsions
from locking up when running BulletSim on a separate thread.
2014-06-20 21:42:08 -07:00
Aleric Inglewood
c90b986d8b Improved line map heuristics.
If the C# column can't be found in the positionMap (but the line can),
use the map immediately after it while correcting for the offset,
unless that results in an LSL position before the previous LSL position
in the positionMap.

The idea behind this heuristic is that in most, if not all cases C#
consumes more characters than LSL (for example LSL_Types.LSLInteger
instead of just 'integer').

Thus if the distance between the columns of two markers differ in
the C# and LSL file, the distance in the C# file will be larger.
Moreover, we can assume that every time this happens we will have
a marker at the beginning of the longer 'keyword', because those
keywords were generated by us in the first place.

For example:

C#:     LSL_Types.LSLInteger f2(LSL_Types.LSLString s)
        ^                       ^
        1                       2

will always have markers at the beginning of the long keywords
'LSL_Types.LSLInteger' and 'LSL_Types.LSLString'.
If an error is generated in between (for example at the beginning
of the function name 'f2') then the correct position is found
by using an offset relative to 2 rather than 1.

Note that a case where this isn't working correctly is
when the user adds extra spaces. For example:

LSL:   integer f2(    string s)

would still use the start of 'string' as reference and
then go backwards 3 characters only because the corresponding
C# still looks like

C#:     LSL_Types.LSLInteger f2(LSL_Types.LSLString s)
                             ^  ^
			     only 3 chars difference

and the reported error at 'f2' would be here:

LSL:   integer f2(    string s)
                   ^

This can only be fixed by generating a mapping for 'f2' itself, or
generating a mapping whenever the amount of spaces is changed.
2014-06-19 23:52:51 +01:00
Aleric Inglewood
3fe9c7c49d Fix looking up line number and colum when there is no exact match.
When a compile error reports a colum/error that is not an exact
match in the positionMap dictionary, the last position in the
map with a line number and position before the reported error
should be returned.

The old code had the following problems:
1) It returns l,c - which are line and column of the C# file, not LSL.
2) It doesn't set l to 'line' when the map has an entry with 'line'.
3) It sorts the map without taking columns into account, which may
   result in a random order of the columns. With my mono implementation
   the columns were reversed in order.

For example, if the map contains the following lines:

99,5,49,10
100,30,50,10
100,40,1,0
101,5,51,10

and a translation of 100,35 was requested,
then the old code would compare '100' with the keys in
the first column - setting l to that key while it is
smaller. Hence, l is set to 99.
Then it finds the key 100 and doesn't update l.
Because of the reversed sort order, it first compares
the column 35 with 40, finding that it is smaller
and therefore it stops; returning 99,1 instead of finding
the correct 100,30 entry and returning 50,10.

This patch causes 50,10 to be returned.

The remaining problems after this patch are:
1) The sorting might not be necessary at all.
2) The is code duplication (I fixed both instances,
   but really there should be no code duplication
   imho).
2014-06-19 23:52:51 +01:00
Robert Adams
4651cd1f50 BulletSim: stop processing linkset child when it is discovered that the
child doesn't have a physical shape. Another attempt at fixing Mantis 7191.
2014-06-18 23:01:39 -07:00
Robert Adams
f348928590 BulletSim: more tweeks to AliciaRaven's flying mods. Added parameters
AvatarFlyingGroundMargin and AvatarFlyingGroundUpForce set to 5.0 and
2.0 respectively which seems to give about the same action as in SL.
Also moved force addition to before the velocity to force computation
so the upward velocity is properly applied to the avatar mass.
2014-06-18 22:39:28 -07:00
Justin Clark-Casey (justincc)
3cbdf3bfe0 refactor: Simplify compilation result tests by factoring out common code. 2014-06-18 23:04:31 +01:00
Justin Clark-Casey (justincc)
7b2f125fb6 In compiler regression tests, setup and teardown structures for each test to avoid any possibility of inter-test inter-ference 2014-06-18 22:46:54 +01:00
Justin Clark-Casey (justincc)
a0d6705fe6 Fix issue with LSL jumps screwing up the C# compiler error -> LSL code position map and leading to invalid error line numbers/columns
This is because jump statement generation was mistakenly inserting its own line without updating the csharp positions in CSCodeGenerator.
This is Aleric Inglewood's patch in http://opensimulator.org/mantis/view.php?id=7195 but applied to opensim itself rather than the defunct code generation in opensim-libs.  Thanks!
This patch also adds a regression test for this case from myself.
2014-06-18 22:24:36 +01:00
AliciaRaven
db0c41501c Fix previous commit to ignore water height and allow flying underwater (swimming)
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-06-17 23:06:49 -04:00
AliciaRaven
ff892b5bcf Add upward force to flight when close to the ground. Prevents current belly flop to the floor when flying with bullet physics and acts more like ODE and SL flight.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-06-17 21:47:36 -04:00
Justin Clark-Casey (justincc)
5450b1b024 Change assembly versions to 0.8.1 2014-06-17 18:37:15 +01:00
Justin Clark-Casey (justincc)
602587b8d5 Update dev version to 0.8.1 2014-06-17 18:32:26 +01:00
Justin Clark-Casey (justincc)
b59812b4e3 If MaterialsModule unexpected sees a part with DefaultTexture of null, log this with a warning. 2014-06-16 22:20:30 +01:00
Justin Clark-Casey (justincc)
4374ce9fbf If processing a queued request fails up to the top of the stack, log the exception and move to the next request rather than terminate the simulator. 2014-06-16 22:11:34 +01:00
Justin Clark-Casey (justincc)
696df33e5c In materials module, if a texture entry somehow has no default entry then don't try to extract materials data rather than throw an exception 2014-06-16 21:47:34 +01:00
Diva Canto
c5f7184d1b Behavior change: only local users can set home in any parcel of a grid. Setting it for foreign users does not make sense, since cntrl+shift+H always teleports them back to their original grid. 2014-06-15 16:29:25 -07:00
Diva Canto
dcd8e74584 Manual change as per patch in mantis #7212. (the patch failed to apply, but the fix was good) Thanks FreakyTech. 2014-06-15 07:26:27 -07:00
Robert Adams
7f0adfd203 Add [Startup]LogShowStatsSeconds=n parameter which controls the interval
that simulator statistics is output to the console. Setting to zero turns
stats logging off.
2014-06-13 21:27:07 -07:00
Justin Clark-Casey (justincc)
31096fb1fe Add rc3 flavour option 2014-06-10 20:19:19 +01:00
Diva Canto
807fb8339b Revert "Let HG users be gods too, if they have local permission to be so."
HG gods are not safe at this point. It's better to disallow this until
they can be made safe.

This reverts commit e86c765be3.
2014-06-09 22:00:10 -07:00
Diva Canto
e86c765be3 Let HG users be gods too, if they have local permission to be so. 2014-06-09 21:46:24 -07:00
Diva Canto
c915791824 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-06-08 12:18:49 -07:00
Diva Canto
7f45ac72e1 Don't try to package null invites. 2014-06-08 12:18:26 -07:00
Robert Adams
8956cdc55f Add [Terrain]SendTerrainUpdatesByViewDistance=false to OpenSimDefaults.ini
so people can find the setting.
2014-06-08 09:50:31 -07:00
Robert Adams
3552cfb1a5 BulletSim: fix exceptions while rebuilding linksets with mesh children.
This should get around the exception reported in Mantis 7191 and 7204
by checking for the unbuilt child and rebuilding the linkset the next tick.
A warning message is output when this rebuild happens and this message is
clamped to 10 times in case there is a problem with a loop.
2014-06-08 09:03:38 -07:00
Michael Cerquoni
0dc14b5f35 fix the comment section of max_distance setting to reflect default value 2014-06-06 22:29:04 -04:00
Diva Canto
74cda2ad78 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-06-06 14:51:05 -07:00
Diva Canto
2766b37d8b Missed this ini change in previous commit 2014-06-06 14:50:38 -07:00
Michael Cerquoni
b913f1c8ab bump default teleport limit to 65535 regions 2014-06-06 16:59:13 -04:00
Diva Canto
fe779128b0 Added simulation version compatibility check so that agents coming from 0.7.6 to a varregion running in 0.8 and above will be denied teleport, rather than be allowed and crash the viewer. 2014-06-06 11:04:53 -07:00
Diva Canto
90de9df3e8 Better comment regarding SizeX and SizeY 2014-06-05 20:31:31 -07:00
Diva Canto
733763c4e2 Amend to previous commit -- write down the problematic Profile server URL. 2014-06-05 20:06:01 -07:00
Diva Canto
5bb95a8a55 May fix mantis #7133 2014-06-05 18:59:30 -07:00
Diva Canto
30cde52634 Updated Regions.ini.example to include var regions configs. 2014-06-05 16:51:08 -07:00
Michael Cerquoni
278530bf04 add Alicia Raven to Contributors list, thanks for the patch! 2014-06-04 22:04:09 -04:00
AliciaRaven
c1bdd22274 Fix AutoBackupModule and include option to skip saving assets.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-06-04 22:01:55 -04:00
Diva Canto
f8fe4dee8f Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-06-02 08:46:00 -07:00
Diva Canto
77913eb679 Added a ResetLand method to RemoteAdmin, whereby all land is reset with the given parameters. 2014-06-02 08:45:39 -07:00
Robert Adams
0aa0dad478 Send multiple terrain patches per terrain update packet if terrain
draw distance optimization is enabled. Makes terrain editting a lot
snappier.
2014-06-01 19:23:49 -07:00
Diva Canto
3aa99b9a7f Fixes a permissions bug where a user with group powers to always rez was not being given permission to rez on group land. 2014-06-01 16:45:37 -07:00
Diva Canto
14a31c3e9b Correct minor bug regarding packing of estate bans 2014-06-01 12:01:49 -07:00
Diva Canto
94d0ae0d91 This may fix mantis #7200, but I am unable to test because I don't have any old viewers around anymore. 2014-06-01 10:18:53 -07:00
Diva Canto
0eaca7aafb Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-06-01 10:06:59 -07:00
Diva Canto
2ff9ea3f80 Fixed a few things pertaining to interfacing with the estate service. Specifically, StoreEstateSettings was not being used anywhere; instead EstatSetting.Save was being called, but that method is a trigger to the DB-layer code directly, which, besides being wrong, was making it impossible to replace the service with a remote connector.
Also added more packing/unpacking code.
2014-06-01 10:06:26 -07:00
Robert Adams
a2ea844494 Move the generation of the multi-resolution map tiles off the main
region creation thread. For varregions or simulators with many regions,
this will speed up simulator startup and elimiate some thread timeout
warnings.
2014-05-31 14:21:39 -07:00
Robert Adams
0300ec45eb Modifications to debugging printouts. No functional changes. 2014-05-31 12:19:51 -07:00
Robert Adams
22dade6463 varregion: More tweeking to only sending patches within avatar draw distance.
Still has problems with child avatars.
2014-05-31 12:19:50 -07:00
Robert Adams
db5a42ffac varregion: send terrain patches from where the avatar outward if the parameter
[Terrain]SendTerrainUpdatesByViewDistance=true.
This tracks which patches have been sent to each client and outputs the
patches as the avatar moves.
2014-05-31 12:19:49 -07:00
Diva Canto
eaf595c008 Fix a bug where estate not found would result in a dummy estate record with erroneous information.
Also, added conversion of EstateSettings from/to key-value pairs in preparation for robust net work connectors.
2014-05-31 11:40:54 -07:00
Diva Canto
d6f9f690e5 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-31 08:22:56 -07:00
Diva Canto
02a53665c9 Added missing reference 2014-05-31 08:22:36 -07:00
Justin Clark-Casey (justincc)
bf5320eb26 minor: rename velocidyDiff -> velocityDiff 2014-05-30 22:21:13 +01:00
Justin Clark-Casey (justincc)
3c992b028c minor: Add some commented out logging to ScenePresence.SendTerseUpdateToAllClients() which is extremely helpful when investigating presence update triggers. 2014-05-30 22:18:07 +01:00
Justin Clark-Casey (justincc)
a755c57b44 Fix issue with BulletSim avatar level flight jitter by commenting out RawVelocity update threshold for now in BSCharacter.UpdateProperties().
For some reason as yet unidentified (feedback?) a threshold above 0.4 here causes the RawVelocity to move between a lower and upper bound rather than remaining constant.
The RawVelocity increased until it triggered the threshold update, at which point it started to decrease until it again triggered the threshhold update.
This delta-v was enough to exceed the checks in ScenePresence.SendTerseUpdateToAllClients() and produce jittery avatar flight because of the fluctuating velocity.
With a threshold of 0.4 (or 0, as with ODE), the RawVelocity remains constant in BulletSim and so avatar flight becomes mostly smooth - remaining occasional glitches appear to be a result of errors in distance extraploation.
There are no obvious problems with commenting out the threshold.
Misterblue, if this is wrong or I've missed some subtlety here, please feel free to revert and/or correct.
The same considerations may or may not apply to object velocity updates.
2014-05-30 22:12:23 +01:00
dahlia
9ced61fbc2 Add a 0 parameter overload for RestClient.Request() for use when no auth is required. This preserves API compatibility for external modules using this function. 2014-05-30 13:47:19 -07:00
Diva Canto
0eede1467f Moved these two estate-related interfaces to the projects where they belong. 2014-05-30 13:11:46 -07:00
Justin Clark-Casey (justincc)
35c7fb2038 minor: Comment out log line in Groups V2 GroupsServicePostHandler for now which logs every request it receives. 2014-05-30 19:45:05 +01:00
Justin Clark-Casey (justincc)
8656b5e948 Fix bug where setting a parcel in a varregion for sale would make sale bitmap generation in WorldMapModule throw an exception on next startup.
This commit replaces the hardcoded region sizes in WorldMapModule.GenerateOverlay() with numbers pulled from m_scene.RegionInfo
2014-05-30 19:40:10 +01:00
BlueWall
1efaf0c85c Add some info about xbuild command line switches to clean and select between producing Debug or Release binaries 2014-05-30 11:56:05 -04:00
Justin Clark-Casey (justincc)
27597463da Change Assembly verson of OpenSim.Data.PGSQL.dll to 0.8.0.* to match all other assembly versions 2014-05-27 23:40:29 +01:00
Justin Clark-Casey (justincc)
c32ccfb520 minor: Comment out 2 error level debugging message in authentication code 2014-05-27 23:18:33 +01:00
Justin Clark-Casey (justincc)
9ca86664bb Make RegionReady login disabled during initialization message a console messages instead of a warning message.
Same justification as earlier commit 996a6c2.  These are not warnings but should still be visible to the user at any log level.
2014-05-27 23:15:50 +01:00
Justin Clark-Casey (justincc)
464d31b70b Stop appending redundant newline to console messages in Robust and pCampbot configs
This is to fix an issue since recent commit fbcb763 where these are no longer removed automatically.
OpenSim.*.config was already not appending these newlines
2014-05-27 20:44:00 +01:00
Justin Clark-Casey (justincc)
5622cf68aa In compiler tests, remove the ResolveEventHandlers after test exit 2014-05-27 18:47:42 +01:00
Justin Clark-Casey (justincc)
394ec508f6 Make CompilerTest add same AssemblyResolver as XEngine to see if this solves the issue with different AppDomain BaseDirectory in local and Jenkins test runs 2014-05-27 18:37:16 +01:00
Justin Clark-Casey (justincc)
bcaacb4e41 Temporarily print regression TestCastAndConcatString() script compile errors out to console to get a handle on what's going wrong.
Does not fail for me locally and I failed to notice this test was failing on Jenkins.
2014-05-27 18:19:08 +01:00
Justin Clark-Casey (justincc)
d131c57978 Update regression TestInventoryDescendentsFetch() to account for recent commit 1fa3a6f
This was hidden in continuous integration because of another regression test issue.
2014-05-27 18:14:36 +01:00
Diva Canto
987c56984d Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-27 10:13:43 -07:00
Diva Canto
e19c830a6c Fixes a bug where map search results pertaining to varregions would only send the SW-most corner of the varregions; the other areas, when clicked, would result a blue circle, meaning that the viewer didn't know about those areas. This is still not quite right, as all the areas appear to be in the same coordinates, but it's good enough for now. 2014-05-27 10:13:24 -07:00
Robert Adams
fab0389cb1 BulletSim: add locking of PhysObjects while processing simulation
step updates and collisions. This is an attempt to fix a crash reported
by Justin when doing high velocity teleports.
2014-05-26 20:29:45 -07:00
Diva Canto
d2877b9cd4 Don't report NPC presences. 2014-05-26 10:28:31 -07:00
Diva Canto
b778bd9423 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-26 08:14:34 -07:00
Diva Canto
449548d7a4 Adds an optional redirect URL to the asset server handler for when assets are not found locally. 2014-05-26 08:13:49 -07:00
Oren Hurvitz
33cc847c4a When saving an OAR in "Publish" mode, also discard Group information 2014-05-26 15:33:13 +01:00
Oren Hurvitz
5aeaa7fcdd Prevent login to a region if the Telehub or Landing Point are in a banned parcel 2014-05-25 15:37:28 +01:00
Oren Hurvitz
e68867c9b6 When taking an object into inventory, set the inventory item's "Next Owner" permissions according to the permissions of the items in the object 2014-05-25 15:35:00 +01:00
Oren Hurvitz
1fa3a6f1bd When creating a new user, create the folders "Current Outfit", "Favorites", and the standard subfolders of "Calling Cards".
(If we don't create them now then they'll be created later by the viewer, but why wait.)
2014-05-25 15:34:49 +01:00
Diva Canto
ff9da24465 Added HTTP Authentication also to Groups and offline IM. 2014-05-23 17:31:39 -07:00
Diva Canto
227685bea4 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-23 16:20:04 -07:00
Diva Canto
20f20895cf Adds optional HTTP Basic Authentication to Robust service connectors. 2014-05-23 16:19:43 -07:00
Justin Clark-Casey (justincc)
9bae636ff0 Fix issues where reported LSL compiler error line numbers do not match the script.
This is probably due to changes in the layout of the generated script preamble (using statements etc, ) in c8afc852 (Jan 17 2013).
Re-enabled existing regression test that exercises at least one case of this.
2014-05-24 00:12:23 +01:00
Justin Clark-Casey (justincc)
cf95b65c10 Get regression test TestUseUndeclaredVariable() functional again, though not yet enabled.
This reveals the position map problems and will make the fix (and subsequent continual checking) easier.
2014-05-23 22:29:47 +01:00
Justin Clark-Casey (justincc)
250ea09328 Reactivate regression test TestCastAndConcatString() in CompilerTests. 2014-05-23 22:12:49 +01:00
Justin Clark-Casey (justincc)
b3a496d6f2 Add mikemig to contributors 2014-05-23 21:13:37 +01:00
Justin Clark-Casey (justincc)
f55e153636 Compile the regex that extract categories for colourization just once rather than on every single log.
Compiling every time is unnecessary since Regex is thread-safe.
2014-05-23 21:09:48 +01:00
Justin Clark-Casey (justincc)
fbcb76383d Allow console output to be multiline by making colourization regex RegexOptions.SingleLine 2014-05-23 20:57:50 +01:00
Justin Clark-Casey (justincc)
72c67c5091 Fix possible infinite recursion in MessageTransferModule.SendGridInstantMessageViaXMLRPCAsync() whilst preserving retry lookup behaviour.
This is based on heavily mikemig's original patch in http://opensimulator.org/mantis/view.php?id=7149
but instead of exiting after the first IM delivery failure to presence information retrieved from the presence service
it will retry the lookup until the result matches the previous lookup.
This is to deal with the case where the agent is sent an IM whilst they are teleporting.
2014-05-23 20:14:49 +01:00
Justin Clark-Casey (justincc)
5015b0b485 If one is sitting on a child with an unset camera-eye and so using one set in a root prim, the focus should remain on the root prim.
Matches behaviour just tested on the Linden grid.
2014-05-23 01:55:05 +01:00
Justin Clark-Casey (justincc)
c78a8271c4 Add any camera at compensation for sat upon child prims to any existing camera-at value, rather than replace. 2014-05-23 01:38:05 +01:00
Justin Clark-Casey (justincc)
fbed245596 Compensate camera-at and camera-eye for child prim rotation when sitting on child prim with camera-eye set 2014-05-23 01:34:02 +01:00
Justin Clark-Casey (justincc)
174df94172 If a script calls llSetCameraAtOffset() or llSetCameraEyeOffset() on a child prim and the root prim has no corresponding value set, then also set the root prim.
This matches behaviour just tested on the Linden Lab grid.
2014-05-22 23:58:28 +01:00
Justin Clark-Casey (justincc)
3fbaef9275 If the root prim has a camera-at or camera-eye setting and a sat upon child prim does not, use the root prim offsets.
This matches behaviour just tested on the Linden Lab grid.
2014-05-22 23:52:28 +01:00
Justin Clark-Casey (justincc)
16bf38e1ab Fix issue where llSetCameraAtOffset() and llSetCameraEyeOffset() in non-root prims moved camera/focus to wrong position.
For non-root prim, eye offsets now need to be made relative to root prim if either camera-at or camera-eye are set.
Probably a regression since November 2013 when all sits were made relative to root prim to match viewer expections (and fix other bugs).
Addresses http://opensimulator.org/mantis/view.php?id=7176
2014-05-22 23:39:22 +01:00
Justin Clark-Casey (justincc)
f8b8241239 Add regression test for north-south chat across neighbour regions. 2014-05-22 20:28:26 +01:00
Justin Clark-Casey (justincc)
bffc9ad184 Extend regression TestInterRegionChatDistanceEastWest() to test out of range chat 2014-05-22 20:04:32 +01:00
Justin Clark-Casey (justincc)
15b50ae737 Extend regression TestInterRegionChatDistanceEastWest() to test in range chat both ways. 2014-05-22 19:55:34 +01:00
Justin Clark-Casey (justincc)
65a135f4d3 Simplify regression TestInterRegionChatDistanceEastWest() by making the child presence connection directly rather than routing through TestClient.
This code isn't relevant to this test and is already exercised by other tests.
2014-05-22 19:47:33 +01:00
Justin Clark-Casey (justincc)
1b156b7fe8 Add regression test for in-range chat between neighbouring regions from east to west. 2014-05-22 19:18:24 +01:00
Diva Canto
b7c7293c7a Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-22 10:16:19 -07:00
Diva Canto
f7b2aa0f49 Fixed a problem with detaching attachments in situations where the user's asset server is not the same as the simulator's asset server. Unfortunately this still continues to be wasteful -- new assets are created every time an attachment is detached, but the process of storing the new asset goes through the InventoryAccess module, which does all sorts of checks regarding the users' inventory. 2014-05-22 10:16:01 -07:00
AliciaRaven
04aa13a086 Fix mantis 6973. Prevent BOM being prefixed to message XML which was causing an exception when the service tried to read the data later on.
Signed-off-by: Oren Hurvitz <orenh@kitely.com>
2014-05-22 13:16:14 +01:00
Oren Hurvitz
251b93d97e Store the Teleport Flags in the Circuit. This doesn't seem to be necessary, because everything has worked so far, but it's the right thing to do. 2014-05-22 13:16:06 +01:00
Oren Hurvitz
a1b291c889 Allow map searches for regions that contain the characters "!+|"
These characters are used as placeholders for other characters: ": /". But we should search first for the exact string the user entered, and only if that fails then replace the characters and search again.
2014-05-21 07:39:23 +01:00
Justin Clark-Casey (justincc)
5b433e101d minor: Comment out currently unused log setup in TerrainCompressor 2014-05-20 23:59:08 +01:00
Justin Clark-Casey (justincc)
d93275745b minor: Remove some unused fields in ScenePresence 2014-05-20 23:57:03 +01:00
Justin Clark-Casey (justincc)
32070fa5f4 minor: remove compiler warning in SceneObjectPartInventory 2014-05-20 23:54:49 +01:00
Justin Clark-Casey (justincc)
9479f64778 Fix issue where avatar and script chat could sometimes be heard from anywhere in neighbouring regions.
This was due to a silent uint overflow in ScenePresence.UpdateChildAgent() corrupting child agent positions
when the child agent was in a region with a greater x or y map co-ord than the root agent region
Probably introduced in beeec1c.
This still will not function properly with very high region map co-ords (in the millions) but other parts of the code don't handle this properly anyway.
Looks to address http://opensimulator.org/mantis/view.php?id=7163
2014-05-20 23:52:07 +01:00
Justin Clark-Casey (justincc)
5ec3429843 On verbose groups messaging logging, count all operations in reported time when sending group messages, not just those after get group members and get presence status, as applicable 2014-05-19 23:01:48 +01:00
Justin Clark-Casey (justincc)
77a331fce3 Add DebugMessagingEnabled = false to OpenSim.ini.example for consistency. Slightly simplify config comments. 2014-05-19 23:00:04 +01:00
Justin Clark-Casey (justincc)
b46be88db6 Split verbose groups messaging logging into its own setting separate from that of the groups module.
This is to allow us to get useful information on messaging without being overwhelmed by the rest of groups debug.
Enabled with [Groups] DebugMessagingEnabled = true in config (default false)
Or "debug groups messaging verbose true|false on the console" (similar to existing groups setting).
Done for both xmlrpc and V2 groups.
2014-05-19 22:45:17 +01:00
Justin Clark-Casey (justincc)
3a6f312484 Fix recent regression from 77e7bbc where an attachment on a received group notice with XmlRpcGroups messaging did not appear in the user's inventory.
This was because the "session ID" when the message template was copied was always replaced with the group ID, whereas a notice requires this to be the notice ID.
Instead just copy the "session ID" as is - other callers already have this set properly so replacing with group ID was redundant anyway.
Relates to http://opensimulator.org/mantis/view.php?id=7037
2014-05-19 22:06:41 +01:00
Oren Hurvitz
47b84875fd Tell QueryAccess explicitly whether the user is coming in via Teleport or Cross, because the permission checks are different.
Previously we used a heuristic of checking if the entry position is 0 to differentiate between Teleport and Cross, but that doesn't work anymore since we've started providing the precise entry position for cross, too. That's required in order to ensure that the user is allowed to enter the parcel that he's walking into.
2014-05-19 11:19:11 +01:00
Oren Hurvitz
78733b979f Log the user when an inventory operation is blocked because the item/folder isn't in the Suitcase 2014-05-19 11:12:53 +01:00
Oren Hurvitz
dd30a29ba0 Return more specific error messages if an attempt to enter a region fails due to permissions (in QueryAccess and IsAuthorizedForRegion) 2014-05-19 11:11:30 +01:00
Oren Hurvitz
882af7195c Better error-handling and logging in case User Profile requests fail 2014-05-19 11:11:06 +01:00
Oren Hurvitz
96e5836b50 When can't rez, show only one error message; not two. And show more specific error messages. 2014-05-19 10:54:27 +01:00
Diva Canto
ab1472e5b7 Don't trigger ItemUploaded when no item has been uploaded. 2014-05-18 23:01:55 -07:00
Diva Canto
922f76a3a7 Don't fetch assets from the server when doing simple inventory operations like copy-paste items in inventory. 2014-05-18 07:49:01 -07:00
Robert Adams
0be9e3b079 BulletSim: adjust avatar step up parameters to better walk up small
staircases. This change is required because of the change in the
avatar default shape from the capsule to the rectangle.
2014-05-17 20:11:22 -07:00
Justin Clark-Casey (justincc)
4a74c4533c minor: eliminate now unnecessary string.Format in postgresql RetrieveGroups method 2014-05-15 22:51:47 +01:00
Justin Clark-Casey (justincc)
d2c738fc09 Don't warn on not seeing [Groups] Robust section for core groups as this does not contain any mandatory parameters and won't be present on older installations. 2014-05-15 22:48:05 +01:00
Justin Clark-Casey (justincc)
6dc1b113d0 Escape find string in PgSQL core groups plugin 2014-05-15 22:45:01 +01:00
Justin Clark-Casey (justincc)
d32d25634d Escape find string in MySQL core groups plugin 2014-05-15 22:09:37 +01:00
Justin Clark-Casey (justincc)
7c12dfe185 On ScenePresence.MakeChildAgent(), reset the m_originRegionID as this is currently being used as a flag to orchestrate destination simulator threads on teleport.
If not reset, it's possible that teleports back and forth between simulators may not restart scripts in attachments.
2014-05-14 22:08:06 +01:00
Justin Clark-Casey (justincc)
2f7539a25b Remove a race where the client's SP.CompleteMovement() thread could attempt to restart attachment scripts before the source simulator's SP.UpdateAgent() thread had added them.
This commit changes the order of code so that attachments are re-added before the CompleteMovement() thread is released.
Relates to http://opensimulator.org/mantis/view.php?id=7148
2014-05-14 21:49:29 +01:00
Justin Clark-Casey (justincc)
0c0ee95bd8 minor: Clean up and make consistent some log file messages in EstateManagementModule relating to RAW file uploading. 2014-05-14 19:22:55 +01:00
Justin Clark-Casey (justincc)
c23d37a509 Fix recent asset request timeout issue by commenting out (for now) the m_maxAssetRequestConcurrency mistakenly passed in as a timeout to SynchronousRestObjectRequester.MakeRequest()
For a long time, possibly forever, the m_maxAssetRequestConcurrency was mistakenly passed in as a 30 ms timeout rather than as a concurrent connection limiter.
This didn't come to light until the timeout was actually used in recent commit faf9ba53
Since this hasn't been operational for a long time and in release candidate phase, commenting it out for now though will need to revisit this.
Relates to http://opensimulator.org/mantis/view.php?id=7165
2014-05-14 00:11:07 +01:00
Justin Clark-Casey (justincc)
4569c595bf Fix behaviour change in recent commit bbc1dc6 so that SynchronousRestObjectRequester.MakeRequest() calls with no timeout specified use the default HttpWebRequest timeout as previously.
I mistakenly thought that that default request timeout was inifite rather than 100 seconds, restoring previously behaviour.
As per http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest.timeout%28v=vs.100%29.aspx
Relates to http://opensimulator.org/mantis/view.php?id=7165
2014-05-13 22:21:20 +01:00
Justin Clark-Casey (justincc)
484aa72ff8 minor: Add some method doc to IMessageTransferModule 2014-05-12 23:49:37 +01:00
Justin Clark-Casey (justincc)
8ad29fc5c8 Make offline IM delivery to URL (pre recent Addons code) have a 10 second rather than infinite timeout.
This both signals a problem with the URL and eventually frees the thread, rather than hanging indefinitely with no information.
2014-05-12 23:42:47 +01:00
Justin Clark-Casey (justincc)
87e2668529 For XmlRpcGroups (Flotsam) module, when MessageOnlineUsersOnly = true, handle notices to offline users directly as known undeliverable messages rather than discarding or attempting delivery.
Offline notices can still be controlled with the [Messaging] ForwardOfflineGroupMessages setting.
Looks to address more of http://opensimulator.org/mantis/view.php?id=7037
Only for Flotsam now for testing, but if approach works should be possible with core offline notices as well.
2014-05-12 23:38:48 +01:00
Justin Clark-Casey (justincc)
515d373a8e Add send group notice regression test for when MessageOnlineUsersOnly=true 2014-05-12 22:54:54 +01:00
Justin Clark-Casey (justincc)
bbc1dc6bce Replace existing 0 timeout in internal overloaded SynchronousRestObjectRequester.MakeRequest() methods with proper Timeout.Infinite (-1) instead.
Triggered by recent faf9ba53 though this was wrong in the code before, it's just that we didn't actually try to set the timeout given.
2014-05-12 22:37:07 +01:00
Justin Clark-Casey (justincc)
8457044b2f Eliminate subsequently unused scene finding in UndeliveredMessage() method of xmlrpc and core offline IM modules 2014-05-12 22:23:24 +01:00
Justin Clark-Casey (justincc)
19d8f05584 minor: eliminate unused UUID in xmlrpc GroupsMessagingModule.ProcessMessageFromGroupSession() 2014-05-12 22:15:01 +01:00
Justin Clark-Casey (justincc)
7db4336f1c minor: Add method doc to SynchronousRestObjectRequester.MakeRequest() methods 2014-05-12 22:05:02 +01:00
Justin Clark-Casey (justincc)
faf9ba53fc In SynchronousRestObjectRequester.MakeRequest<TRequest, TResponse>(string verb, string requestUrl, TRequest obj, int pTimeout, int maxConnections) actually set timeout on WebRequest if given.
Previously, we were doing nothing with this parameter.
No effect on current code since none of the 6 callers attempt to use the timeout.
2014-05-12 19:20:00 +01:00
Oren Hurvitz
bf8f64e40e Fixed error if a user didn't have a "Current Outfit" folder in their suitcase.
This fixes http://opensimulator.org/mantis/view.php?id=7161
2014-05-12 08:54:31 +03:00
Diva Canto
73891c7fd3 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-09 11:06:33 -07:00
Diva Canto
667a272cce This little sucker had evaded my attention forever. As a consequence some assets associated with foreign users were being missed. 2014-05-09 11:06:03 -07:00
Justin Clark-Casey (justincc)
f41809e07d minor: Capitalize Hypergrid help category like others 2014-05-08 22:39:52 +01:00
Diva Canto
afb938e579 Fix test breakage 2014-05-08 11:30:45 -07:00
Diva Canto
a31393ba0b Make the URL for texture redirects match the path of the resource that we use in OpenSim. 2014-05-08 11:18:17 -07:00
Diva Canto
a845c1a893 Finished implementing redirects in GetTexture. 2014-05-07 19:38:33 -07:00
Diva Canto
093705efd1 Delete extraneous console message in the Configger. 2014-05-07 17:19:57 -07:00
Diva Canto
f4cba27105 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-07 17:00:12 -07:00
Diva Canto
3db9b847bf Allow Tools.Configger to take -inifile as argument 2014-05-07 16:59:11 -07:00
Justin Clark-Casey (justincc)
2b33677402 Add GridUserService service config to [UserAccountService] in Robust[.HG].ini.example so that home can be set for new users rather than always warning that it can't be set.
Code already exists to do this but forgot to put entry into config files a long time ago.
Thanks to AliciaRaven for the spot.
Relates to http://opensimulator.org/mantis/view.php?id=7155
2014-05-07 23:32:02 +01:00
Justin Clark-Casey (justincc)
812f5e124d Remove duplicate HypergridLinker entry from [GridService] in Robust.HG.ini.example 2014-05-07 18:39:56 +01:00
Justin Clark-Casey (justincc)
2fbafc7465 Add Matt Lehmann to contributors 2014-05-06 22:37:26 +01:00
Justin Clark-Casey (justincc)
e44450cce1 Revert "fix infinite recursion loop in SendGridInstantMessageViaXMLRPCAsync()"
There is a problem here with infinite recursion, but this patch loses the 'hunting' behaviour where the code will attempt multiple lookups if the avatar is teleporting rapidly around different simulators.
This patch only does a single lookup before giving up.

This reverts commit cecb446e0e.
2014-05-06 19:53:35 +01:00
Dev Random
78015bbbdc Console commands for Estate Mgmt 2014-05-06 18:55:42 +01:00
Matt Lehmann
9e83b43009 new version of patch to add default-user switch new version :qw :wq updated version of default user switch for load oar :q :q 2014-05-06 18:48:59 +01:00
Matt Lehmann
8b3c2f7d0c updated version of default user switch for load oar :q :q 2014-05-06 18:48:42 +01:00
Kunta Kinte
cecb446e0e fix infinite recursion loop in SendGridInstantMessageViaXMLRPCAsync() 2014-05-06 17:52:32 +01:00
Vegaslon
0faba7dc33 Fix avatars going to corner of region when they are sitting on a child prim and the prim is deleted. 2014-05-06 17:41:13 +01:00
Vegaslon
e245638f24 Change llUnSit to be able to unsit any avatar that is currently sat on the object, not just avatars sitting on the sittarget in the object containing the script. or when the object is owned by the parcel, land group or estate owner. 2014-05-06 17:35:34 +01:00
Talun
c9742c826d Mantis 7146 The lsl function llGetMassMKS is not implemented
This patch implements llGetMassMKS as it is described in the wiki
http://wiki.secondlife.com/wiki/LlGetMassMKS
2014-05-06 17:31:21 +01:00
Justin Clark-Casey (justincc)
539165e6bd minor: Change configuration text in config files to reflect the existing situation of BulletSim as the default physics engine. 2014-05-06 17:28:21 +01:00
Justin Clark-Casey (justincc)
95eeb4dde8 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-05-06 17:22:47 +01:00
Oren Hurvitz
ef262799ca Better error handling in AssetServerPostHandler. Invalid XML causes an InvalidOperationException, not an XmlException 2014-05-06 09:43:07 +03:00
Oren Hurvitz
614b9e14c4 When moving an item from a prim to a user's inventory, don't delete the item from the prim until it was successfully copied to the user 2014-05-06 07:28:46 +01:00
Oren Hurvitz
eb79c882ea Show more meaningful error messages when failed to move an item from a prim to a user's inventory.
Also, actually show the error to the user in more cases. (Previously, sometimes the operation failed without telling the user anything.)
2014-05-06 07:28:45 +01:00
Oren Hurvitz
1e5cff32fc Show more meaningful error messages when failed to give an item to another user 2014-05-06 07:28:44 +01:00
Oren Hurvitz
df49196e17 Log whenever an inventory operation is blocked because the item/folder isn't in the Suitcase 2014-05-06 07:28:43 +01:00
Oren Hurvitz
0fe08c8799 - When sending the "My Suitcase" folder to the client, always claim it has Folder Type 8. (Previously we had used Folder Type -1 in one place, and LLClientView didn't even bother changing Folder Type 100 to anything else.) 2014-05-06 07:16:37 +01:00
Oren Hurvitz
7862d1e20d Added range-checking for the parameters to PRIM_POINT_LIGHT (used in llSetLinkPrimitiveParamsFast() ) 2014-05-06 07:14:58 +01:00
Diva Canto
13b2ac1425 Makes it possible to support grids in which all the simulators share all central services of a Robust server EXCEPT assets. In other words, grids where the simulators' assets are kept in one DB and the users' inventory assets
are kept on another. When users rez items from inventory or take objects from world, an HG-like asset copy takes place between the 2 servers, the world asset server and the user's asset server. This makes the simulators independent of the central asset server.

Note that this an advanced configuration and requires some security strengthening coming up.
2014-05-04 20:54:42 -07:00
Diva Canto
7f570636f8 Please note: older simulators (0.7.6) still send the info about gzip in ContentType 2014-05-04 11:41:52 -07:00
Diva Canto
5a10da3ee8 Added a optional key between the group remote connectors, sim and service. This allows for more secure group services, to be used by collections of mutually-trusting grids. 2014-05-03 17:13:53 -07:00
Justin Clark-Casey (justincc)
53b72ab4b8 minor: Comment out Cacheitems debug log lines for now 2014-05-02 13:31:58 +01:00
Talun
3a2c099169 Mantis 7144 missing ATTACH_AVATAR_CENTER constant
This patch adds ATTACH_AVATAR_CENTER and ATTACH_NECK
2014-05-01 23:20:31 +01:00
Justin Clark-Casey (justincc)
c31d93cb6f Fix issue where only one of multiple attachments on the same attachpoint for NPCs would be seen by other viewers.
It appears that at least Singularity 1.8.5 (but probably others) rely on attachment FromItemIDs being different to display more than one.
This commit resolves this by generating random IDs instead of always using UUID.Zero for NPCs.
Resolves http://opensimulator.org/mantis/view.php?id=7110
2014-05-01 22:24:21 +01:00
Justin Clark-Casey (justincc)
f0411dc128 minor: Use Vector2.Zero constant and only set in condition branch where it was missing in TryParseConsole2DVector(). xbuild still compiles. 2014-04-30 21:50:18 +01:00
Melanie
7c121a2acc Change XEngine to call StateChange rather than RemoveScript on state changes 2014-04-30 20:56:49 +01:00
Melanie
f0eeb47262 Add the "StateChange" function to the async comand manager to differentiate
between state changes and script exit/reset.
2014-04-30 20:54:34 +01:00
BlueWall
44f533d95a Assign value to 'vector' to fix building under xbuild and Monodevelop 2014-04-30 15:45:00 -04:00
Justin Clark-Casey (justincc)
7bb673a854 minor: Correct mistake in terrain flip error message from previous commit 5d01a1f 2014-04-30 19:41:11 +01:00
Justin Clark-Casey (justincc)
5d01a1ff4d minor: Print output in response to terrain console commands on the console rather than in the log. 2014-04-30 19:24:17 +01:00
Justin Clark-Casey (justincc)
253110293a Add "terrain show" console command which outputs terrain height for a given region co-ordinate.
For debug purposes.
2014-04-30 18:04:47 +01:00
Justin Clark-Casey (justincc)
5fc61942e0 minor: convert back some tabs to spaces that got into ScenePresence via recent patch bc969a6b 2014-04-29 20:15:29 +01:00
Justin Clark-Casey (justincc)
d4eee213a9 Restore terrain height and flying adjustments that were eliminated from non-megaregion paths in ScenePresence.MoveToTarget() by recent patch bc969a6b 2014-04-29 20:05:08 +01:00
Justin Clark-Casey (justincc)
2dbc18054e Add regression test for NPC movement on a variable region.
Extends basic physics to allow av movement on a varregion (basic physics is only really useful for regression test purposes).
2014-04-29 19:29:16 +01:00
Oren Hurvitz
88f7a833dc Improved HTTP logging 2014-04-29 07:59:17 +01:00
Oren Hurvitz
06e4fcd260 Fixed the UpdateAgentInformation CAP: the viewer expects the simulator to echo back the maturity that it sent
Without this change, attempts to change the maturity rating in the viewer's Preferences don't work.
2014-04-29 07:59:10 +01:00
Robert Adams
df89e15290 BulletSim: non-functional changes to debugging statements and formatting. 2014-04-28 18:36:50 -07:00
Robert Adams
63aea3a5f2 BUlletSim: move safeynet ground plane to lower altitude. Define new BulletSim
parameter 'TerrainGroundPlane' which defaults to -500.

BulletSim had assumed altitudes never went negative but that is not true. The
ground plane is just a safety net so things wouldn't fall to infinity.
2014-04-28 11:08:47 -07:00
Oren Hurvitz
cb8c3ba023 Removed dependency on Linq in OpenProfileClient 2014-04-28 16:41:02 +01:00
Justin Clark-Casey (justincc)
2e216aa056 Add missing [Test] decorator to actually get the basic scene creation test from 2227f51b to run 2014-04-25 23:35:20 +01:00
Justin Clark-Casey (justincc)
9664273df6 Add basic regression test for creating a var region 2014-04-25 23:34:30 +01:00
Justin Clark-Casey (justincc)
2227f51b29 Add basic sanity regression test for creating a scene. 2014-04-25 23:16:07 +01:00
Justin Clark-Casey (justincc)
38acda9f29 Add regression test for terrain fill at two digit height and max ll height. 2014-04-25 23:01:24 +01:00
Justin Clark-Casey (justincc)
904baa6da6 Fix issue where terrain height values > 327 caused chaotic spiked terrain.
Per http://wiki.secondlife.com/wiki/Tips_for_Creating_Heightfields_and_Details_on_Terrain_RAW_Files#Notes_for_Creating_Height_Field_Maps_for_Second_Life
terrain heights up to 508 are possible on the LL grid (and were available on previous releases of OpenSimulator).
The obvious way to allow both this and equivalent -z values, is to rewiden the internal terrain height storage from short to int.
The memory tradeoff is most noticeable on the maximum 8192x8192 var region (equiv to 1024 normal regions), where it adds 128mb to resident use (128k on a normal region)
This is still better than the double used in previous releases.
This does not affect physics or data storage since they already use float and double respectively.
This may not be the final solution if we actually want to sacrifice -z, >327 or something else.
Relates to http://opensimulator.org/mantis/view.php?id=7076
2014-04-25 22:56:25 +01:00
Melanie
a108fcac95 Restore overload mode accidentally disabled in a prior commit. Add a new
config option, LogOverloads, to log when a thread pool overload occurs.
This option defaults to "True" because the logging data is useful for
diagnosing threading issues.
2014-04-25 21:34:29 +01:00
Melanie
2572ed9ed9 Adjust permissions to work hand in hand with what the viewer believes they are.
This fixes the issue of "Show in Search" seeming resetting at random.
2014-04-25 00:35:53 +01:00
Diva Canto
cf54df3ecf Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-04-24 14:12:04 -07:00
Diva Canto
1d9a9e6004 Fixes a long-standing bug related to god-mode change ownership of objects permissive, where the permissions of the children prims' inventory items were not changed. As a consequence, we couldn't control some of the objects imported via HG and OARs even in god mode. 2014-04-24 14:11:42 -07:00
Oren Hurvitz
0d898d8d8a Revert "When linking a Hypergrid region, set the region's flags on the in-memory GridRegion immediately."
This reverts commit 463d0b2f8f.
2014-04-24 19:08:50 +03:00
Oren Hurvitz
463d0b2f8f When linking a Hypergrid region, set the region's flags on the in-memory GridRegion immediately.
(When using llTeleportAgent() this *specific* object is used for the teleport, so it should have the correct flags.)
2014-04-24 16:58:16 +01:00
Oren Hurvitz
bc06db3df4 - Created a standard function to send XML-RPC requests, which logs them like we do for other types of HTTP activity.
- Changed OpenProfileClient to use the new XML-RPC sending function
- Improved logging in WebUtil
2014-04-24 15:58:43 +01:00
Oren Hurvitz
e8a2eff2e8 Changed how UserProfile performs a fallback call using the OpenProfile API, because now JsonRpcRequest() returns an error result instead of throwing an exception 2014-04-24 15:58:43 +01:00
Oren Hurvitz
d62f0bc35d Refactored: moved OpenProfileClient to a location where it can be used by both the Simulators and Robust 2014-04-24 15:58:42 +01:00
Oren Hurvitz
d15a3b10a3 When sending JSON-RPC calls (for UserProfile), use WebUtil instead of constructing the HTTP requests manually. This allows the calls to be logged when using "debug http all 6". 2014-04-24 15:58:41 +01:00
Oren Hurvitz
6efc203ce8 Fixed: hypergrid-linking stopped accepting the following format: "http://grid.example.com" (without a region name)
Fixes http://opensimulator.org/mantis/view.php?id=7128
2014-04-24 06:19:57 +01:00
Oren Hurvitz
d1865c526d Removed unused CsharpSqlite DLLs 2014-04-24 06:19:49 +01:00
Melanie
98c1940820 Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim 2014-04-24 01:48:05 +01:00
Melanie
5dc0298f83 Apply logging flag to a spammy message that may have been overlooked.
No one needs to see every thread launch.....
2014-04-24 01:44:11 +01:00
Dev Random
7180690a14 Show Group name when land is group-owned 2014-04-23 23:29:17 +01:00
Michael Cerquoni
0b743045ef Add Dev Random to CONTRIBUTORS.txt, thanks for the patches! 2014-04-23 17:51:26 -04:00
Justin Clark-Casey (justincc)
5092cbd77e minor: Remove unused System.Linq reference and use ParcelFlags.None instead of 0 from previous commit cb1f28 2014-04-23 19:55:51 +01:00
Dev Random
cb1f2886cd Prevent sending Land Properties for unprivileged users 2014-04-23 19:50:59 +01:00
Justin Clark-Casey (justincc)
7a5699224e Fix regression test break on previous commit 328bc3b 2014-04-23 19:46:58 +01:00
Justin Clark-Casey (justincc)
328bc3b76e Adjust avatar sit positioning on a target to pretty much exactly match that of the LL grid.
This uses an offset of 0.05 on the up vector of the sit orientation, after extensive analysis on
http://opensimulator.org/mantis/view.php?id=7096 and https://wiki.secondlife.com/wiki/Talk:LlSitTarget
This supersedes the previous adjustment in 5b73b9c4 which had been wrongly applied.
The maximum change is about 0.1 with a maximum height avatar.
This patch is all Aleric's work - I am applying manually in order to add these additional notes
2014-04-23 19:19:09 +01:00
Oren Hurvitz
b01e73cf27 Dynamic textures shouldn't be saved in the assets service (only in the simulator cache) 2014-04-23 14:42:40 +01:00
Oren Hurvitz
7eb12f96ec Hypergrid: don't send Local assets to other grids
This commit also contains other changes, but they're all just for clarity. The only actual behavior change is to avoid Posting local assets.
2014-04-23 16:42:23 +03:00
Oren Hurvitz
2506b3d89e Removed references to Community.CsharpSqlite*.dll. This eliminates some warnings, and SQLite still works. 2014-04-23 14:38:41 +01:00
Oren Hurvitz
018832522c Removed GetUserInventory(). It wasn't being used, and was creating warnings because it's Obsolete. 2014-04-23 14:38:33 +01:00
Oren Hurvitz
ca78c8326e Eliminated 'Obsolete' warning: don't call do-nothing function SetPreviousAppearance() 2014-04-23 14:38:04 +01:00
Oren Hurvitz
998d7009a6 Eliminated many warnings 2014-04-23 16:37:36 +03:00
Oren Hurvitz
617bc4710a Workaround for SRAS: if Store Asset returns 'null' then assume the asset already exists, and this isn't an error 2014-04-23 14:19:24 +01:00
Oren Hurvitz
2c9859314f Changed table 'im_offline' to use UTF8 characters. This fixes a problem with Offline IM V2 (only relevant to MySQL).
This fixes http://opensimulator.org/mantis/view.php?id=7123

Users that use MySQL should change their MySQL configuration to support UTF8. In the config file /etc/my.cnf (Linux) or my.ini (Windows), add these settings:

   [mysqld]
   character-set-server=utf8

   [client]
   default-character-set=utf8

And then restart MySQL (on Linux: "sudo service mysqld restart").
2014-04-23 16:18:28 +03:00
Melanie
eb5bfd14fa Reverting test change to cause another email 2014-04-23 12:49:28 +01:00
Melanie
85f4357ce6 Test commit to trigger a mailing list update 2014-04-23 12:44:43 +01:00
Oren Hurvitz
a893fd90cd Fixed KeyframeMotion to work with very slow movement.
Previously, if the movement speed was below 0.05/sec then it didn't work correctly.

Fixes http://opensimulator.org/mantis/view.php?id=7117
2014-04-22 10:19:11 +01:00
Oren Hurvitz
93a9ed2a6d Changed the maximum asset name and description lengths to constants. Also, pre-truncate the description of dynamic textures. 2014-04-22 12:18:54 +03:00
Oren Hurvitz
4cac87d9f4 Fixed: when a user logged-in, sometimes he didn't get notified of the Online status of friends, so they continued to appear Offline.
This happened because these notifications (the UDP packets) can only be sent to Root Agents. But the notifications were done in OnClientLogin(), at which point the client is still a Child Agent. Since a FireAndForget is used, it became a race condition as to whether the packets would be sent before or after the client became a Root Agent.

To fix this, we now only send the notifications once the client becomes a Root Agent for the first time.
2014-04-21 16:56:49 +01:00
Oren Hurvitz
538ff31b28 Better error handling when retrieving offline IMs 2014-04-21 16:56:26 +01:00
Oren Hurvitz
06db136fbc Removed an attempt to set a user's presence to "Region 0" when they HG teleport to another grid.
a) This shouldn't have been done because at that point the user is still logged-in to the current grid. b) It's not necessary because the user will soon be logged-out completely. c) And it didn't even work because the MySQL database layer prevents setting the region to 0.
2014-04-21 16:56:14 +01:00
Oren Hurvitz
acc2c42a79 Better logging in PresenceService, to help diagnose presence problems. 2014-04-21 18:55:53 +03:00
Robert Adams
b065c02661 Add 'lillith_xue' to list of CONTRIBUTORS.TXT
Removed references to 'Intel' as the contributors are no independent.
2014-04-21 06:00:55 -07:00
lillith_xue
bc969a6b46 Possible solution for #7120 and #7051
Signed-off-by: Robert Adams <misterblue@misterblue.com>
2014-04-21 05:58:29 -07:00
Oren Hurvitz
3f76f72137 Better error-handling when storing assets: recognize that 'null' is an error value 2014-04-20 06:23:38 +01:00
Oren Hurvitz
52f8669169 Stopped setting the Service URL "GatekeeperURI" on users' accounts. It isn't actually used. 2014-04-20 06:23:37 +01:00
Oren Hurvitz
853c0fccc8 Fixed: when any avatar changed his Active Group, it was set as the active group for *all* the avatars in the scene (not permanently) 2014-04-20 06:23:37 +01:00
Oren Hurvitz
090f9bcece Fixed: once a user has rezzed an object, they could then duplicate it as much as they wanted even if the parcel's permissions had since been changed to disallow rezzing 2014-04-20 06:23:36 +01:00
Oren Hurvitz
3185db7f94 Fixed: if a user belonged to the parcel's group then he was allowed to rez object in the parcel even if the flag "Create Objects by Group" was disabled 2014-04-20 06:23:36 +01:00
Oren Hurvitz
a780e01a54 Fixed: the parcel flag "Allow Scripts from Group" should only check if the parcel has a Group set; it doesn't have to be *deeded* to the group
Also some cleanup of the use of Group ID's (with no change to functionality).
2014-04-20 06:23:35 +01:00
BlueWall
63fd027494 Catch empty url error 2014-04-19 22:25:21 -04:00
Oren Hurvitz
b3ebec184f In teleports, when sending the Source region, set its ServerURI to the Gatekeeper URI (which is used with Regions); not the Home URI (which is used with Users) 2014-04-13 12:58:37 +03:00
Oren Hurvitz
e1dd228f18 Better error checking when creating hyperlinks: a) Reject invalid strings; b) Default port is 80, not 0
The change of default port may fix http://opensimulator.org/mantis/view.php?id=7108 , where a user was able to create a Hyperlink to OSGrid from inside OSGrid.
2014-04-13 09:54:56 +01:00
Robert Adams
c8914d22eb BulletSim: reduce the terrain collison margin to be the same as other
objects in the world.

This was originally changed in an attempt to make vehicles work better
but the effect was not that large and it causes avatars to float
above the terrain.
2014-04-12 17:37:57 -07:00
Melanie
574a11558d Refactor: Rename GetOtherSetting to GetSetting and make SetOtherSetting private 2014-04-12 17:32:16 +01:00
Melanie
5d964a6424 Remove the old XML format parsing. Now additional region params can just be
added as they are already exposed through an API when using Nini. That will
remove the need to always edit RegioInfo just to add a region based setting.
2014-04-12 16:58:07 +01:00
Dev Random
18b91fdbe9 Tweak to PrimLimits and add missing Regions.ini example
Signed-off-by: Melanie <melanie@t-data.com>
2014-04-12 14:40:34 +01:00
Dev Random
f0998a9222 Add per-user checking to PrimLimitsModule
Signed-off-by: Melanie <melanie@t-data.com>
2014-04-12 09:28:29 +01:00
Justin Clark-Casey (justincc)
7c148d9b2f minor: use constants instead of magic numbers in llRequestAgentData() where possible 2014-04-11 00:52:28 +01:00
Justin Clark-Casey (justincc)
de0ab04d00 Actually add the llRequestAgentData() test class for commit 530c86 2014-04-11 00:36:50 +01:00
Justin Clark-Casey (justincc)
530c86335d Fix the presence info caching used in llRequestAgentData(), which was completely inoperative.
This means the presence info may be out of date by up to 20 seconds, but this avoids scripts potentially triggering constants requests to user accout and presence info services.
Relates to http://opensimulator.org/mantis/view.php?id=7088 though I fixed in a different way.
Adds regression test for this case.
2014-04-11 00:29:06 +01:00
Robert Adams
562a3cb338 BulletSim: small tweek to avatar height reduce feet embedded into prims.
This adjustment makes a default, shoeless avatar stand properly on a prim
for the various heights (0% to 100% in the appearance adjustment).
2014-04-10 06:53:36 -07:00
Snoopy Pfeffer
32ad66c274 Allows to sell objects on a parcel of land together with that parcel of land. The objects that are sold together with the parcel of land need to fulfill the following preconditions: owned by the current parcel owner, not set to a group, transferrable. This feature does not work for group owned parcels or land bought by a group. 2014-04-10 11:47:46 +02:00
Oren Hurvitz
c725ad1577 Fixed: when teleporting between grids, the avatar name wasn't always updated.
When an avatar is in their home grid, their name appears as "First Last". In other grids the name appears as "First.Last @grid.example.com". However, viewers have a bug and they don't always show the new name. We use a trick (changing the Group Title briefly) in order to make the viewers show the new name. This is only done after a Hypergrid teleport.
2014-04-09 15:00:54 +01:00
Oren Hurvitz
06e0528d0b In teleports, pass the source region to the destination (similar to an HTTP referrer) 2014-04-09 09:22:20 +01:00
Oren Hurvitz
cf1686335f Log when the presence service logs-out all the users in a region 2014-04-09 06:06:52 +01:00
Oren Hurvitz
af406748a2 Improved error messages when a teleport fails. The viewer's dialog already says "Teleport failed", so adding "Teleport refused" is redundant. 2014-04-08 08:11:30 +01:00
Oren Hurvitz
e00f1a0410 Allow invalidating the users cache 2014-04-08 08:11:29 +01:00
Diva Canto
86105a1533 Better (amend to previous commit) 2014-04-07 19:51:26 -07:00
Diva Canto
c0fd09b445 Avoid calling HELO service on malformed URLs. This is in response to an exception reported by danbanner. 2014-04-07 19:41:25 -07:00
Oren Hurvitz
85d51e57a9 When sending QueryAccess to a region, also send the user's Home URI 2014-04-07 07:32:36 +01:00
Oren Hurvitz
55cc8044cb Refactored: use Scene.GetAgentHomeURI() to get the Home URI of a user 2014-04-07 07:26:44 +01:00
Oren Hurvitz
f3508649f5 Fixed: during a teleport we always sent the error "The teleport destination could not be found" to the client. This happened on both success and failure.
On successful teleports this error wasn't actually shown to the user. But on failed teleports this error could hide the true cause of the failure. For example, attempting to use a Landmark that's more than 4095 regions away would result in two warnings appearing in the viewer: "Region too far" and "Destination could not be found". The second message hid the first one, so it wasn't obvious to the user what is actually the problem.
2014-04-06 15:42:33 +01:00
Oren Hurvitz
abe0f4a088 When preparing a Hypergrid teleport, tell the receiving grid which user is entering the grid.
This can affect which region to use. E.g., returning users may be allowed to enter any region, whereas users from other grids will have to enter a gateway region. Previously per-user decisions were only made later, but by then it's too late to change which region the user enters.
2014-04-06 15:40:45 +01:00
Oren Hurvitz
d4acaf25af Pass the correct position to QueryAccess() instead of UUID.Zero (it was wrong in one place) 2014-04-06 15:40:45 +01:00
Justin Clark-Casey (justincc)
cacbb5c165 Don't re-retrieve sit part in SP.HandleAgentSit() when we already have it (this time with the right code change) 2014-04-05 02:16:14 +01:00
Justin Clark-Casey (justincc)
86a2cd915c Revert "Don't re-retrieve sit part in SP.HandleAgentSit() when we already have it."
This reverts commit 2c00b73cd2.

Wrong code change
2014-04-05 02:11:36 +01:00
Justin Clark-Casey (justincc)
2c00b73cd2 Don't re-retrieve sit part in SP.HandleAgentSit() when we already have it. 2014-04-05 02:09:44 +01:00
tglion
8b8e1b88ec fixed object-collision issue after uncheck phantom-flag
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-04-04 12:29:44 -04:00
Justin Clark-Casey (justincc)
aec723b955 Fix sp.AbsolutePosition when agent is sitting on a child prim, which in turns fixes llDetectedPos(), llGetLinkPrimitiveParams() and similar functions.
Add regression test for this case.
In relation to http://opensimulator.org/mantis/view.php?id=7043
2014-04-03 23:22:57 +01:00
Michael Cerquoni
6b1d09813e remove some whitespace that snuck in with last patch 2014-04-03 13:25:32 -04:00
Dev Random
50eec6df52 Add Varregion support to Terragen Handler
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-04-03 13:14:13 -04:00
Vegaslon
3c5b7d7b79 BulletSim: Minor Fix to vehicle hovering, add more ways to disable it.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-04-03 13:07:48 -04:00
Dev Random
4aa483777b Move new Estate commands to OpenSim.cs
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-04-03 12:45:43 -04:00
Oren Hurvitz
672bd9fc98 Reduced log levels for REST 404 errors to DEBUG 2014-04-03 15:04:26 +01:00
Oren Hurvitz
01daa74adf Better error messages in RestClient 2014-04-03 14:13:22 +01:00
Oren Hurvitz
6d2893be67 When teleporting using Hypergrid, show more informative error messages in case of error 2014-04-03 14:13:03 +01:00
Robert Adams
65c4cb48ac BulletSim: make avatar physical shape to be a rectangle rather than
a capsule. Set the default to be the rectangle shape and adjust the
parameters in OpenSimDefaults.ini for the new shape.

The rectangle shape will perform better and avatar height can be
computed more accurately.
2014-04-02 21:53:58 -07:00
Robert Adams
9406db3047 Fix problem with floating avatar by passing avatar size information
to the physics engine.

This operation was accidentally removed while in the middle of improving
the computation of the avatar height. This is a temp fix until the real
solution is added.
2014-04-02 21:52:24 -07:00
Justin Clark-Casey (justincc)
e756457703 Remove redundant part.SitTargetAvatar setting from SP.MakeRootAgent as part.AddSittingAvatar already does this. 2014-04-03 01:21:50 +01:00
Justin Clark-Casey (justincc)
6ac9c9c972 refactor: Use m_sittingAvatars to maintain the list of sitting avatars instead of two independent structures that do exactly the same thing
m_sittingAvatars code also already properly handles locking to avoid races.
2014-04-03 01:14:39 +01:00
Justin Clark-Casey (justincc)
91b7679db9 minor: Fix warning in AvatarFactoryModule 2014-04-03 00:35:42 +01:00
Justin Clark-Casey (justincc)
17929abd28 Wrap contents of ETM.CrossAgentToNewRegionAsync() in try/catch to avoid a failure terminating simulators running on Windows
In relation to http://opensimulator.org/mantis/view.php?id=7050
2014-04-03 00:34:20 +01:00
Justin Clark-Casey (justincc)
5cb4044539 Don't clear avsToCross in SOG.AbsolutePosition.set(), this is unnecessary since the structure is local and never reused after the clear 2014-04-03 00:26:55 +01:00
Justin Clark-Casey (justincc)
e6d0dcd4e8 Fix bug where crossing to a neighbouring region and back again would trigger an exception, and a second recross would stop the user moving until relog
Also fixes an issue where sitting avatar counts became inaccurate after any cross.
Part of the problem was due to cloning code using MemberwiseClone() but not resetting certain collection structures.
Adds regression test for this case.
In relation to http://opensimulator.org/mantis/view.php?id=7050
2014-04-03 00:19:53 +01:00
Oren Hurvitz
2051535ce1 String matching in REST handlers: must allow '-' as a separator, because the "/map" handler uses it 2014-04-02 15:11:54 +01:00
Oren Hurvitz
0301c81b01 Made GetScenePresence() case-insensitive when searching by user name. This makes it easier to use console commands such as "show appearance". 2014-04-02 13:08:31 +01:00
Oren Hurvitz
9211361b19 Fixed AssetsExist in SQLite 2014-04-02 10:00:09 +03:00
Oren Hurvitz
6b65895736 Made the SQLite unit tests work on Windows (sqlite3.dll wasn't being loaded) 2014-04-02 09:49:57 +03:00
Oren Hurvitz
559c66afe6 Added System.Core reference to MSSQL 2014-04-02 09:20:28 +03:00
Oren Hurvitz
aa217cf90f Better string matching when searching for REST handlers: must match an entire path component (ending with '/' or a similar character).
For example, these should match: "/assets" and "/assets/12345", but these shouldn't match: "/assets" and "/assets_exist".
2014-04-02 08:52:44 +03:00
Oren Hurvitz
bbfda8e19e Fixed last-resort sending of error response (HTTP 500) when an error occurs while handling a request.
The previous code didn't actually send the response, so the caller was stuck until the timeout (100 seconds).
2014-04-02 06:32:41 +01:00
Oren Hurvitz
fad0fd7f75 Fixed the "Update Asset" handler: it was looking for the Asset ID in the wrong parameter.
This doesn't actually matter because the "Update Asset" operation isn't implemented in AssetsServer. But still, the handler should do the right thing...
2014-04-02 06:32:40 +01:00
Oren Hurvitz
d1c3f8eef5 Added assets service method AssetsExist(), which returns whether the given list of assets exist.
This method is used to optimize sending assets with embedded assets: e.g., when a Hypergrid visitor takes an item into the inventory.
2014-04-02 06:30:57 +01:00
Mic Bowman
ac16a667e1 fix orphaned code in sun module per mantis 7068 2014-04-01 19:48:03 -07:00
Justin Clark-Casey (justincc)
7bafee28fa Removing warning from SceneObjectLinkingTests.TestLinkDelink2SceneObjects() by actually checking whether delinked grp3 is not null 2014-04-02 01:26:58 +01:00
Justin Clark-Casey (justincc)
46095c058e minor: comment out currently unused RegionCombinerModule.LogHeader 2014-04-02 01:24:40 +01:00
Justin Clark-Casey (justincc)
e5a5b69b08 remove EstateManagmentCommands.m_commander that has been unused for some time 2014-04-02 01:23:40 +01:00
Dev Random
43eab5e163 Console command to rename Estate 2014-04-02 01:17:41 +01:00
Justin Clark-Casey (justincc)
444737c830 minor: Only calculate fetched usedPrims and simulatorCapacity info in PrimLimitsModule.CanObjectEnter() when we know for sure that we need them. 2014-04-02 01:05:37 +01:00
Justin Clark-Casey (justincc)
7cb1690589 minor: disable logging in recently added scene object crossing tests and remove some unnecessary test config 2014-04-02 01:01:53 +01:00
Justin Clark-Casey (justincc)
0af8886400 Fix problem where moving an object to another region on the same simulator was failing, with the object returning to its original position.
Root cause was that PrimLimitsModule was not properly handling the case where the parcel it was asked to check was outside the current region's bounds.
If this is the case, we can abort the check since the receiving region will perform it.
Added a regression test for this case.
2014-04-02 00:58:33 +01:00
BlueWall
4cbd45f3d5 Merge branch 'master' of /home/opensim/src/opensim 2014-03-31 15:50:27 -04:00
BlueWall
59d0e3c3c8 Add check to prevent the return of a wrong value when key is NULL_KEY 2014-03-31 15:49:53 -04:00
Dev Random
635f3f77ab Console command to change Estate owner
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-03-29 00:59:15 -04:00
Oren Hurvitz
6557eba235 Removed default timeout when starting scripts after Load OAR 2014-03-28 13:04:19 +03:00
Oren Hurvitz
1fe504fee5 Better skipping of "SculptData" when parsing XML 2014-03-28 12:52:06 +03:00
Oren Hurvitz
f360b687d6 Removed "SculptData" from the serialized XML format of prims 2014-03-28 07:51:21 +01:00
BlueWall
ba5a236922 Profiles local StorageProvider fix, round 3 2014-03-27 13:41:20 -04:00
BlueWall
20640357ab Fix to local StorageProvider override 2014-03-27 13:27:46 -04:00
BlueWall
45ada5ca2d Merge branch 'master' of /home/opensim/var/repo/opensim 2014-03-27 12:56:12 -04:00
BlueWall
9c7b28341c Add support for specifying non-default StorageProvider 2014-03-27 12:36:30 -04:00
BlueWall
a15282f023 Merge branch 'master' into m_test 2014-03-27 12:21:38 -04:00
Oren Hurvitz
161c827a44 Fixed a case where logging an HTTP response failed because the stream was non-seekable 2014-03-27 17:46:37 +02:00
Oren Hurvitz
76add0fdb0 Log errors in MakeRequest() as INFO, not ERROR. Some communications problems are benign (e.g., can't send Friend status update to a region that is down), so don't log them as ERROR so soon. We rethrow the exception, so the caller can still decide to log the error as an ERROR.
Resolves http://opensimulator.org/mantis/view.php?id=7077
2014-03-27 15:00:42 +01:00
Justin Clark-Casey (justincc)
af54e6f370 minor: Change incorrect "Maximum" in the PhysicalPrimMin OpenSim.ini.example description to "Minimum"
Thanks to aiaustin for the spot.
2014-03-26 23:45:02 +00:00
Justin Clark-Casey (justincc)
e7fa8a4699 minor: change misspelling of overriden to overridden in comments within config files
Thanks to aiaustin for the spot.
2014-03-26 23:43:49 +00:00
Justin Clark-Casey (justincc)
262892336b Add LuciusSirnah to contributors list 2014-03-26 21:03:21 +00:00
Justin Clark-Casey (justincc)
1247174db4 Fix MSSQLInventoryHandler.IncreementFolderVersion where sql accidentally used a MySQL style ?folderID insted of @folderID
Thanks to LuciusSirnah in http://opensimulator.org/mantis/view.php?id=7075 for this fix
2014-03-26 21:02:26 +00:00
Justin Clark-Casey (justincc)
de941d2ec7 minor: remove compiler warning from NullEstateData 2014-03-26 21:00:57 +00:00
Justin Clark-Casey (justincc)
b0bae62c30 refactor: Actually use MaptileStaticFile in RegionInfo rather than having both a public field and a get property 2014-03-26 20:58:58 +00:00
Justin Clark-Casey (justincc)
7a4c5b067d Add MSSQL EstateStore.migrations VERSION 10 transaction to add AllowLandMark, AllowParcelChanges and AllowSetHome columns to estate_settings table.
Taken from http://opensimulator.org/mantis/view.php?id=7074 by LuciusSirnah.  Thanks!
2014-03-26 20:42:53 +00:00
Justin Clark-Casey (justincc)
6c447f892e Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-26 20:36:33 +00:00
Justin Clark-Casey (justincc)
5e8dfb4f7e Fix extra physics params MSSQL migration (version 39).
This was failing because it used MySQL syntax
This is taken from Lucius Sirnah's entry in http://opensimulator.org/mantis/view.php?id=6593
But with the column existence checking removed, as this should not be necessary in a migration and is inconsistent with all other migrations, though I can see a case for doing it.
2014-03-26 20:34:04 +00:00
Oren Hurvitz
7a47c15edb - Increased the threadpool timeout to 10 minutes
- Changed a few places that launch long-lasting threads to skip the timeout altogether
2014-03-26 20:34:55 +01:00
Oren Hurvitz
14a7ddb885 Revert "Use log-rolling on the log files (once per day)"
This reverts commit 8ecab21b37.
2014-03-26 08:56:56 +02:00
Justin Clark-Casey (justincc)
2fbb906ff6 Reinsert code to extract size_x and size_y parameters from GetHomeRegion response in UserAgentServiceConnector.
This is actually code from commits afb2e07 and cf61cdf
For as yet unexplained reasons, the section of these commits which changed UserAgentServiceConnector.cs disappeared from its history between approx Feb 5 2014 and Feb 13 2014.
This ought to be impossible.  More details to follow in opensim-dev mailing list
2014-03-26 02:34:22 +00:00
Justin Clark-Casey (justincc)
62a03a5cac Also take YP/commented out JS references from script engine CodeTools.
Fixes build break from d3387d591a
2014-03-26 01:20:49 +00:00
Justin Clark-Casey (justincc)
d3387d591a Remove unmaintained and unused YieldProlog scripting language
This hasn't been mainntained since 2008 and has not been kept up with the rest of the language infrastructure.
Hence, it almost certainly doesn't work and has never been used, afaik
If this is wrong, please say on the opensim-users/dev mailing list.
Removing to reduce maintenance burden (since it still needs to be made to compile).
2014-03-26 00:59:57 +00:00
Justin Clark-Casey (justincc)
cffea984f1 minor: Remove "js" (Javascript) from list of allowed languages in script config since it hasn't been present in OpenSimulator for a very long time (0.6 days)
One reason support was removed is that the external DLL that implemented Javascript stopped development.
Not sure how well this ever worked in OpenSimulator.
Not removing vb for now as this is directly supported by Mono (via vbnc compiler) though I strongly suspect it is also inoperable.
2014-03-26 00:50:33 +00:00
Justin Clark-Casey (justincc)
99308d64c6 minor: Add some doc to Scene.Backup() detailing its direct invocation if the indepedent backup thread is not running (e.g. in a regression test) 2014-03-26 00:43:17 +00:00
Oren Hurvitz
6d1d58b654 Use the "X-Content-Encoding" header to indicate gzipped data, because old OpenSims fail if they get an unknown "Content-Encoding" 2014-03-25 18:09:23 +01:00
BlueWall
14836e60ff Fix issue with user picks creation. The snapshot id is UUID.Zero in new parcels. 2014-03-25 11:10:48 -04:00
BlueWall
9aec36156e Sync code that has moved in development branch with changes in master 2014-03-25 11:09:27 -04:00
BlueWall
fce3fca7f9 Add the UserProfiles local service module to non-HG Standalone configuration. 2014-03-25 11:08:58 -04:00
BlueWall
542bef20e8 Move JsonRpc request code out for general availability 2014-03-25 11:08:27 -04:00
BlueWall
dba33fee39 Move from UserProfileModule for general availability 2014-03-25 11:08:11 -04:00
Oren Hurvitz
b1d8aa0b64 Use the "Content-Encoding" header to indicate gzipped streams 2014-03-25 15:36:59 +01:00
Oren Hurvitz
8ecab21b37 Use log-rolling on the log files (once per day)
Resolves http://opensimulator.org/mantis/view.php?id=6950
2014-03-25 09:53:02 +01:00
Oren Hurvitz
368b29a680 In Core Profiles: as a fallback, try to get profiles from foreign grids using the OpenProfile protocol
Resolves http://opensimulator.org/mantis/view.php?id=6954
2014-03-25 09:37:18 +01:00
Oren Hurvitz
f90aee696a Always throw an exception if MakeRequest (used for HTTP POST) fails. (Previously many exceptions were ignored)
Resolves http://opensimulator.org/mantis/view.php?id=6949
2014-03-25 09:37:10 +01:00
Oren Hurvitz
f901a38204 Improved logging of HTTP requests
- MemoryBuffer isn't seekable, so we can't log it. Log the string instead.
- Handle compressed streams
- Don't attempt to dump binary data. Either don't log it at all (if we know it's binary), or at least convert non-ASCII characters to ASCII.
- Log responses to HTTP requests
- Use the same log prefix for all of these log messages ("[LOGHTTP]"), to make them easy to see at a glance
- Increased the snippet length to 200 (80 doesn't show enough), and add "..." only if the message was actually truncated

Resolves http://opensimulator.org/mantis/view.php?id=6949
2014-03-25 09:36:53 +01:00
Oren Hurvitz
4289b71141 Fixed unit tests due to changes in the threadpool 2014-03-25 10:04:52 +02:00
Oren Hurvitz
e131e73652 Run slow operations in a separate thread, instead of using FireAndForget (which has a 1-minute timeout)
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:55 +01:00
Oren Hurvitz
84d7227dfd Changed LogThreadPool to have 4 logging levels. Added console command "debug threadpool level" to set the logging level.
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:50 +01:00
Oren Hurvitz
b13214af27 Added a watchdog to abort slow threads in the main thread pool
If a task in the thread pool hangs then it will permanently take up
one of the threads. If this happens repeatedly then the thread pool will
become exhausted and OpenSim will fail. This watchdog terminates threads in the
thread pool that have been executing for over a minute (which probably
means they're hung).

Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:45 +01:00
Oren Hurvitz
e735f76553 LogThreadPool: when the thread is for ProcessPacketMethod, also log the packet type
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:41 +01:00
Oren Hurvitz
4031933475 Refactored DebugFlagsEnum
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:37 +01:00
Oren Hurvitz
8555e54e22 Automatically start logging FireAndForget activity if the threadpool is full
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:32 +01:00
Oren Hurvitz
7c0ebcb984 Added debug flag: LogThreadPool. It makes us log every use of the main threadpool.
Resolves http://opensimulator.org/mantis/view.php?id=6945
2014-03-25 08:01:13 +01:00
Justin Clark-Casey (justincc)
091f3a8000 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-25 00:20:38 +00:00
Justin Clark-Casey (justincc)
e12c044eab Don't fail to enable permissions modules correctly if there is any leading or trailing whitespace between comma separate module combinations. 2014-03-25 00:19:24 +00:00
Oren Hurvitz
8276a9e5f7 Fixed Debug command for Groups. (Use of wrong capitalization caused *two* "debug" options to appear in "help")
This is a (small) part of http://opensimulator.org/mantis/view.php?id=6949
2014-03-24 18:27:18 +01:00
Oren Hurvitz
6a477e044d If prim region crossing fails then don't delete the prim from the original region
Resolves http://opensimulator.org/mantis/view.php?id=6946
2014-03-24 18:24:50 +01:00
Oren Hurvitz
1769e93c42 Fixed parsing of coalesced objects if the XML starts with an XML Declaration ("<xml ...>")
Resolves http://opensimulator.org/mantis/view.php?id=6944
2014-03-24 18:18:29 +01:00
Oren Hurvitz
1a32b35279 In Load OAR, correctly restore group-owned objects
Resolves http://opensimulator.org/mantis/view.php?id=6943
2014-03-24 18:18:23 +01:00
Oren Hurvitz
305f5110c6 In Load OAR: Zero isn't a valid Group ID
Resolves http://opensimulator.org/mantis/view.php?id=6943
2014-03-24 18:18:08 +01:00
Oren Hurvitz
35078e03e5 During Load OAR, fix the User and Group ID's in objects that are embedded in assets (previously only rezzed objects were fixed)
Resolves http://opensimulator.org/mantis/view.php?id=6942
2014-03-24 18:17:59 +01:00
Oren Hurvitz
5fd9411143 Refactored Load IAR: created a generic mechanism to modify the SOG's as they are being loaded
Resolves http://opensimulator.org/mantis/view.php?id=6942
2014-03-24 18:17:35 +01:00
Oren Hurvitz
0ff61341e4 HGAssetService searches for the "HomeURI" setting in several sections: Startup, Hypergrid, HGAssetService
Resolves http://opensimulator.org/mantis/view.php?id=6940
2014-03-24 18:02:22 +01:00
Oren Hurvitz
8cec0b3fa1 If updating a user's profile notes fails then return an error
Resolves http://opensimulator.org/mantis/view.php?id=6938
2014-03-24 18:02:17 +01:00
Oren Hurvitz
1b30ae81b5 Fixed updating usersettings in the database
Resolves http://opensimulator.org/mantis/view.php?id=6938
2014-03-24 18:02:05 +01:00
Oren Hurvitz
b9e0d0fdb2 Don't show hidden groups in search results
Resolves http://opensimulator.org/mantis/view.php?id=6937
2014-03-24 18:01:56 +01:00
Oren Hurvitz
1d4551e52f Check settings for groups module
Resolves http://opensimulator.org/mantis/view.php?id=6937
2014-03-24 18:01:47 +01:00
Oren Hurvitz
c8583e566d When searching for users, don't add users from the local cache if they have an invalid UUID
Resolves http://opensimulator.org/mantis/view.php?id=6935
2014-03-24 18:01:37 +01:00
Oren Hurvitz
a2dd8f31de Trim search queries (for users, groups, etc.). I have found that sometimes the viewer adds a space at the end, which causes searches to fail.
Resolves http://opensimulator.org/mantis/view.php?id=6935
2014-03-24 18:01:28 +01:00
Oren Hurvitz
6edc446780 Fixed: OnRegionInfoChange was never triggered
Resolves http://opensimulator.org/mantis/view.php?id=6934
2014-03-24 18:01:22 +01:00
Oren Hurvitz
bf68dbabd7 Save to database these parcel updates: Force Owner, Abandon Request, Reclaim. (Previously these updates only changed the parcel in memory)
Resolves http://opensimulator.org/mantis/view.php?id=6934
2014-03-24 18:01:08 +01:00
Oren Hurvitz
89945f8829 Refactored: ExternalRepresentationUtils should be the only place where the "CreatorData" field is calculated, to ensure uniformity
Resolves http://opensimulator.org/mantis/view.php?id=6933
2014-03-24 18:00:59 +01:00
Oren Hurvitz
edc04d4184 When updating the CreatorId of an inventory item, automatically update the CreatorIdAsUuid field as well
Resolves http://opensimulator.org/mantis/view.php?id=6933
2014-03-24 18:00:39 +01:00
Oren Hurvitz
5b2af7f99e Moved the linkage between LoginService and HGInventoryService to the config file 2014-03-24 18:33:18 +02:00
Oren Hurvitz
df9845a283 When a user logs-in, automatically create the Suitcase folder
This is only done if the Suitcase Inventory Service is used.
Previously the Suitcase was created at a later time, which meant that it wasn't shown in the viewer until the viewer was restarted.
2014-03-24 17:02:13 +01:00
Oren Hurvitz
7496d0b0f7 Fixed unit tests for delinking objects 2014-03-24 15:05:39 +02:00
Oren Hurvitz
4bccfed80c When logging in UserAgentServiceConnector, always log the original server URL (the hostname), not the IP
This resolves http://opensimulator.org/mantis/view.php?id=6955 (that patch was modified a bit)
2014-03-24 14:20:19 +02:00
Oren Hurvitz
eaf99bf928 Changed to Unix line-endings in VS2010Target.cs
Resolves http://opensimulator.org/mantis/view.php?id=6951
2014-03-24 12:27:07 +01:00
Oren Hurvitz
f5ae36d7e2 Updated Prebuild to support .NET 4.5
Resolves http://opensimulator.org/mantis/view.php?id=6951
2014-03-24 12:26:54 +01:00
Oren Hurvitz
425d76bb98 Enable runprebuild.bat to run in Cygwin
This resolves http://opensimulator.org/mantis/view.php?id=6951
2014-03-24 12:26:53 +01:00
Oren Hurvitz
921f0052f4 Get the full viewer name even if it's (incorrectly) sent in the 'Channel' field
Recent versions of Firestorm and Singularity have started sending the viewer name in the 'Channel' field, leaving only their version number in the 'Viewer' field. So we need to search both of these fields for the viewer name.

This resolves http://opensimulator.org/mantis/view.php?id=6952
2014-03-24 12:26:52 +01:00
Oren Hurvitz
6734b94761 Better error messages
This resolves http://opensimulator.org/mantis/view.php?id=6936
2014-03-24 12:22:32 +01:00
Oren Hurvitz
773ffcafc3 Removed "hacktastic" code that is no longer needed.
We no longer set the object's AbsolutePosition in this place, so the IsAttachment hack doesn't do anything anymore.

This resolves http://opensimulator.org/mantis/view.php?id=6936
2014-03-24 12:05:25 +01:00
Oren Hurvitz
62b3bdf0fc When linking two groups, and then deleting the combined group: delete *all* of the combined group's prims, including those that came from the second subgroup
This fixes http://opensimulator.org/mantis/view.php?id=6175
2014-03-24 11:44:48 +01:00
Robert Adams
b0cb0ec02f BulletSim: fix problem where axis constraints were also constraining
linear motion.

The code was limiting linear motion to be only in the positive direction
for any axis that was constrained.
2014-03-23 13:08:31 -07:00
Oren Hurvitz
81c9952e99 Added missing quotes in Robust.HG.ini.example 2014-03-23 16:40:09 +02:00
Dev Random
db83208794 Fix negative stat for Active Scripts
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-03-22 23:02:10 -04:00
Kevin Cozens
ff5c38534d Reverting "Set default name for mute list" that was pushed by mistake.
This reverts commit 58def34dbe.
2014-03-22 16:38:48 -04:00
Kevin Cozens
58d7e3b8ed Reverting "Pass method to offline.php" commit that was pushed by mistake.
This reverts commit fe16a72a9a.
2014-03-22 16:31:36 -04:00
Kevin Cozens
949139eb0b Moved Kevin Cozens to the core developers list. 2014-03-22 15:57:32 -04:00
Kevin Cozens
fe16a72a9a Pass method to offline.php using ?blah instead of /blah/. Avoids issue with Apache web servers running PHP via CGI. 2014-03-22 15:13:03 -04:00
Kevin Cozens
58def34dbe Set default name for mute list module as shown in OpenSim.ini.example 2014-03-22 15:13:03 -04:00
Vegaslon
d4dad75a3c BulletSim: Fix jumping while running. Was unintentional taking way all upward target motion for avatar when running.
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-03-22 15:00:48 -04:00
Melanie
ebe7726cd7 Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim 2014-03-22 01:49:28 +00:00
Melanie
a4d322dcd1 Allow the setting from the environment to take effect if no explicit setting is given.
This is done by calling the constructor only with a directory if one is actually given.
2014-03-22 01:47:48 +00:00
Justin Clark-Casey (justincc)
ccf18fd2ef Rename SOG.InSceneBackup to CanBeBackedUp to reflect its actual functionality.
It does not indicate that a SOG has been set to be backed up or not.  It indicates that a SOG can be backed up in principle.
In practice, this was added by lbsa71 in 2007 and is set to always true, albeit as a virtual property.
2014-03-22 01:36:21 +00:00
Dev Random
3d0778bcd6 Allow Mono Plugin Registry setting for Regions
Signed-off-by: Melanie <melanie@t-data.com>
2014-03-22 01:29:51 +00:00
Justin Clark-Casey (justincc)
a5800f479e If an object has it's temporary flag unset after being set, put it back in the persistence list.
Effectively uses the patch in http://opensimulator.org/mantis/view.php?id=7060
But also adds a regression test and exposes the necessary property to allow this to work.
2014-03-22 00:29:13 +00:00
Justin Clark-Casey (justincc)
178a5a5585 rename prefix of scene-inventory.<scene-name>.ProcessedFetchInventoryRequests and QueuedFetchInventoryRequests to inventory.httpfetch.*
Actual inventory processing is done with a single set of static structures rather than per scene.
2014-03-21 23:29:31 +00:00
Justin Clark-Casey (justincc)
6664079f84 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-21 23:18:13 +00:00
Talun
fb312279c9 Mantis 6922: No particles are generated if their size exceeds the maximum allowed size.
This patch ensures that no particle scal value can exceed 4.0
2014-03-21 23:13:34 +00:00
Oren Hurvitz
f8caf41bd8 Moved Oren Hurvitz to core developers list 2014-03-21 17:33:19 +02:00
Justin Clark-Casey (justincc)
47e7febebc Add monitored thread last update times as stats in "show stats all"
These have the format server.thread.<thread-name>
2014-03-21 02:06:10 +00:00
Justin Clark-Casey (justincc)
33ae733006 Add H-H-H to contributors 2014-03-20 22:43:00 +00:00
H-H-H
da25903300 Adding a way to disable/enable the in built Dwell Module 2014-03-20 22:35:50 +00:00
Justin Clark-Casey (justincc)
7f027552ec If we find an existing suitcase folder in HGSuitcaseInventoryService.GetRootFolder(), then return that as a response rather than null.
Fixes a regression from commit 346644016c (Fri Nov 15 23:10:59 2013)
This is actually the reverse of zadark's patch in http://opensimulator.org/mantis/view.php?id=6969
But I'm assuming that was a mistake since clearly we should be returning this data - this was original behaviour
2014-03-20 20:36:47 +00:00
Justin Clark-Casey (justincc)
d04bb3ca9b Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-20 20:15:57 +00:00
Talun
bd6f734d3a Mantis 6974 PERMISSION_TRACK_CAMERA should be implicit on attach.
http://wiki.secondlife.com/wiki/Run_time_permissions
This change makes PERMISSION_TRACK_CAMERA implicit on attach
2014-03-20 20:11:26 +00:00
Michael Cerquoni
b5f94c72b9 Allow MaptileStaticFile path to be set to anywhere and not force it to bin/maptiles 2014-03-19 11:16:52 -04:00
Robert Adams
220ea9f687 Add Jak Daniels to CONTRIBUTORS.TXT 2014-03-18 22:20:00 -07:00
Jak Daniels
61353dde80 Allow Region specific static maptiles to be loaded from file. 2014-03-18 22:18:50 -07:00
Justin Clark-Casey (justincc)
cf97535d9e Revert "Simplify DoubleQueue to eliminate redundant sempahore work."
This reverts commit 52b7b40034.

Got the semantics wrong - the sempahore is required so that the blocking thread waits for a signal.
2014-03-19 01:40:56 +00:00
Justin Clark-Casey (justincc)
52b7b40034 Simplify DoubleQueue to eliminate redundant sempahore work.
Exclusion is already guaranteed by the lock on m_syncRoot.
Semaphore could not allow more than one thread in these sections anyway since the underlying SDK structures are not thread-safe.
2014-03-19 00:48:13 +00:00
Justin Clark-Casey (justincc)
1497b75361 minor: Put ProcessedFetchInventoryRequests and QueuedFetchInventoryRequests in stats category "scene-inventory" instead of "scene"
To distinguish from general scene stats
2014-03-19 00:37:06 +00:00
Justin Clark-Casey (justincc)
9858766516 minor: Make "stats show" an alias for "show stats" command. 2014-03-19 00:35:49 +00:00
Justin Clark-Casey (justincc)
e6080a38c5 Rename "debug stats record" command to "stats record" for consistency. Move from debug to general command category 2014-03-19 00:29:36 +00:00
Justin Clark-Casey (justincc)
1d0a9e521c Allow a snapshot of stats to be dumped to a file with a "stats save" command 2014-03-19 00:28:57 +00:00
Justin Clark-Casey (justincc)
fad1d70180 Add httpserver.<port>.QueuedPollResponses and httpserver.<port>.ProcessedPollResponses statistics 2014-03-18 23:47:33 +00:00
Justin Clark-Casey (justincc)
9e0d419239 minor: Correction to description of QueuedPollResponses since this covers long poll and other 'poll' types 2014-03-18 23:24:22 +00:00
Justin Clark-Casey (justincc)
eed343ed8a Add httpserver.<port-number>,QueuedPollResponses stat
This shows the number pf poll responses queued for processing.
2014-03-18 23:21:07 +00:00
Justin Clark-Casey (justincc)
7df325c275 Extend locking in BlockingQueue to cover operations that are not guaranteed to be thread-safe 2014-03-18 23:05:49 +00:00
Justin Clark-Casey (justincc)
fdcd392582 Set executable bit on Npgsql.dll for cygwin 2014-03-18 21:04:37 +00:00
Justin Clark-Casey (justincc)
f27766d47b Set executable flag on BulletXNA.dll for cygwin 2014-03-18 21:02:51 +00:00
Justin Clark-Casey (justincc)
a660c0a750 Add scene.<scene-name>.ProcessedFetchInventoryRequests
This shows the number of requests that have been processed.
These have not necessarily been sent back to the request since this is done separately by the PollServiceRequestManager
2014-03-18 20:59:11 +00:00
Justin Clark-Casey (justincc)
8ce3fa646b Allow "show stats" console command to take a full stat name and display only that stat.
For example, scene.test.RootAgents will show only the RootAgents stat in the scene named "test"
2014-03-18 20:21:47 +00:00
Justin Clark-Casey (justincc)
e82d394ddf Add scene.<scene-name>.QueuedFetchInventoryRequests stat
This is to aid in detecting whether there are fetch inventory requests remaining to be processed.
2014-03-18 20:10:41 +00:00
Justin Clark-Casey (justincc)
d5f5649750 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-18 20:09:15 +00:00
Justin Clark-Casey (justincc)
c605c7a7b7 Lock m_syncRoot on DoubleQueue.Count. This is not documented as a thread-safe operation 2014-03-18 19:54:07 +00:00
Melanie Thielker
a53272c5fb Add delete maptile ability to MapImageService - yet untested 2014-03-18 00:50:00 +00:00
Justin Clark-Casey (justincc)
ae56b946cf Fix a bug in previous commit 01520bb where I accidentally saved OtherCleanTime instead of Dwell 2014-03-18 00:34:40 +00:00
Justin Clark-Casey (justincc)
01520bbb3e Save and load dwell parcel stat in MySQL DB adaptor. Field in table already exists!
The SQLite database adaptor was loading and saving dwell whilst MySQL was not, even though the field already exists in the db table.
2014-03-18 00:02:55 +00:00
Justin Clark-Casey (justincc)
f3e177814a Add regression test for http inventory fetch.
Involved some restructuring to allow regression tests to dequeue inventory requests and perform poll responses synchronously rather than async
2014-03-17 20:51:35 +00:00
Justin Clark-Casey (justincc)
873eee5431 Implement osForceBreakAllLinks().
Identical to llBreakAllLinks() except that it doesn't require the script to have link permissions.
2014-03-13 00:04:20 +00:00
Justin Clark-Casey (justincc)
6a279feb2f Only allow llBreakAllLinks() to work if script has received PERMISSION_CHANGE_LINKS
As per http://wiki.secondlife.com/wiki/LlBreakAllLinks
Same as existing llCreateLink() and llBreakLink()
2014-03-12 23:54:20 +00:00
Justin Clark-Casey (justincc)
296d63e20b Implement osForceCreateLink() and osForceBreakLink()
These are identical to llCreateLink() and llBreakLink() except that they don't require script permissions.
However, osForceCreateLink() still requires that linked and linkee still have the same owner.
There's also an AutomaticLinkPermission setting in [XEngine] that could be set to true to prevent the LSL function checks.
But this doesn't allow the finer control over which users/scripts, etc. can do this that the OSSL functions provide.
2014-03-12 23:05:16 +00:00
Justin Clark-Casey (justincc)
beba20846f When sending group notices through group messaging, allow the agent ID to use for fetching group data to be different from im.fromAgentID
This is because xmlrpcgroups currently always checks visibility for the requesting agent ID (unlike Groups v2, which can accept UUID.Zero)
But group notice IMs have a from agent which is the group rather than the sending agent.
Further addresses http://opensimulator.org/mantis/view.php?id=7037
2014-03-12 19:31:04 +00:00
Dev Random
7112ee0015 Enable MapImageServiceModule with no refresh 2014-03-11 23:52:11 +00:00
Justin Clark-Casey (justincc)
86630a1b70 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-11 23:39:07 +00:00
Justin Clark-Casey (justincc)
d975b42f6a Instead of auto-creating a parcel on request if one doesn't cover a given location, fill in gaps or extend existing parcel right after initial data load.
This is in line with simpler and still existing behaviour where a default parcel is created if no parcels are in storage at all.
Making this change as another step to address current problems with spurious parcels occasionally being created.
Also adds regression tests for different load behaviours depending on existing stored parcel data.
Relates to http://opensimulator.org/mantis/view.php?id=7035
2014-03-11 23:38:22 +00:00
Robert Adams
8edf4225f3 varregion: remove serialization of region terrain to floats when sending patches.
This should eliminate much memory thrashing and CPU usage while sending initial
terrain.

The old way of passing terrain was to convert it to an array of floats. This is
really bad for large terrain (think 4096x4096 floats). This change passes a dummy
float array since the real region info is used anyway and the floats are ignored.
(The ignoring the terrain floats is a kludge so as to not change IClientAPI.)
2014-03-11 07:12:47 -07:00
Robert Adams
6b17c9bd98 Add Lani Global to CONTRIBUTORS.txt 2014-03-10 22:12:56 -07:00
Lani Global
71c808cd32 PhysicalPrimMax 64m for OpenSim_ini_example standard size prim
Signed-off-by: Robert Adams <misterblue@misterblue.com>
2014-03-10 22:11:24 -07:00
Lani Global
3e8f593bf2 PhysicalPrimMax to 64m for ini Default files to enable standard size prims and mesh to be used with vehicles.
Signed-off-by: Robert Adams <misterblue@misterblue.com>
2014-03-10 22:11:09 -07:00
Robert Adams
742f505440 Change terrain update sending to be triggered by frame tick rather
than everytime terrain is changed.

The TerrainModule now hooks the frame event and, if terrain has changed,
sends terrain updates to the clients. This polling pattern replaces
the previous push on change pattern and will make it easier to do per
client throttling and per scene presence terrain update ordering.
2014-03-10 22:05:18 -07:00
Oren Hurvitz
0237d9113d Don't start KeyframeMotion timers until all the regions are ready. This prevents problems in megaregions (prims that think they've crossed over to other regions). 2014-03-11 00:55:58 +00:00
Oren Hurvitz
120f872d2b After an object with KeyframeMotion is copied into inventory, resume the motion (previously it remained stopped) 2014-03-11 00:43:22 +00:00
Justin Clark-Casey (justincc)
932c9e757b Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-03-11 00:16:31 +00:00
Justin Clark-Casey (justincc)
77e7bbcbf7 Send group notices through the same messaging module mechanism used to send group chat to avoid timeout issues when sending messages to large groups.
Only implementing for XmlRpcGroups initially to test.
May require MessageOnlineUsersOnly = true in [Groups] to be effective.
In relation to http://opensimulator.org/mantis/view.php?id=7037
2014-03-11 00:11:18 +00:00
Michael Cerquoni
4f67286044 fix missing quote for xBakes connector in Robust example ini files 2014-03-09 19:09:10 -04:00
Michael Cerquoni
cfd3e8f0ea minor spelling mistake fix. 2014-03-09 11:46:25 -04:00
Michael Cerquoni
abcb2cdb36 add XBakes connector to Robust.HG.ini.example 2014-03-08 21:50:41 -05:00
Michael Cerquoni
a96601478c add [BakedTextureService] section to Robust.HG.ini.example file same as Robust.ini.example. 2014-03-08 21:48:33 -05:00
Michael Cerquoni
e3c4936dea remove RefreshTime = 0 from [MapImageService] in Standalone.ini, StandaloneHypergrid.ini, Grid.ini, GridHypergrid.ini they were redundant and would not allow variables in OpenSim.ini to be set to anything. 2014-03-08 16:28:45 -05:00
Michael Cerquoni
da990d01f2 set RefreshTime = 0 in [MapImageService] in Standalone.ini and StandaloneHypergrid.ini to eliminate memory leaking for Warp3D map tiler, these variables should be erased needs more discussion! 2014-03-08 15:57:19 -05:00
Michael Cerquoni
12f2648a57 set RefreshTime = 0 in [MapImageService] in Grid.ini and GridHypergrid.ini to eliminate memory leaking for Warp3D map tiler, these variables should be erased needs more discussion! 2014-03-08 15:41:26 -05:00
Dev Random
9de3fe9410 Add Varregion support to osGetRegionSize OSSL function
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2014-03-07 17:48:07 -05:00
Justin Clark-Casey (justincc)
8225e3f40c Remove try/catch in LandManagmentModule.GetLandObject() - this is very old code and the caught exceptions can no longer occur. 2014-03-07 01:41:31 +00:00
Justin Clark-Casey (justincc)
3c05d67094 Lock m_landlist whilst loading parcels from storage to prevent a race against any parcel auto-creation in GetLandObject() 2014-03-07 01:36:06 +00:00
Justin Clark-Casey (justincc)
6b7625a56b Only auto-create a land parcel when there is none in a specified tile if there is more than 1 existing land parcel.
This is because there are still issues with bad parcels being generated in http://opensimulator.org/mantis/view.php?id=7035
Theorizing now that it's possible that something is calling GetParcel() before any parcel data has been loaded from persistence.
2014-03-07 01:23:19 +00:00
Justin Clark-Casey (justincc)
71918eeab4 Add regression test for sending group notices via xmlrpc groups connector. 2014-03-07 01:04:54 +00:00
Justin Clark-Casey (justincc)
ddd38a3dea Add scene name to bad parcel add logging 2014-03-06 19:12:16 +00:00
Justin Clark-Casey (justincc)
58c0ed78d4 refactor: Simplify land object by using c# get/set auto-properties where applicable. 2014-03-06 02:12:58 +00:00
Justin Clark-Casey (justincc)
470d053443 minor: slightly simplify code in LandObject.ContainsPoint() 2014-03-06 00:51:39 +00:00
Justin Clark-Casey (justincc)
ed14e97bb4 Remove array initialize calls in LMM - these are unnecessary as the VM already does this. 2014-03-06 00:46:16 +00:00
Justin Clark-Casey (justincc)
aa2fb1ec25 minor: Increase size of parcel name field in "land show" console command output. Construct table using CDT rather than string formats 2014-03-06 00:40:24 +00:00
Justin Clark-Casey (justincc)
14569992e1 Prevent adding a land object if it overlaps any existing objects that have not had their bitmaps adjusted.
This is to prevent an immediate problem in http://opensimulator.org/mantis/view.php?id=7035 where a development code bug occasionally overlays all the existing parcels with a blank parcel owned by the estate manager and to gather more data.
My guess is that this parcel is being created by the new code in LandManagementModule.GetLandObject(), probably some race between threads since this only happens occasionally.
Adds regression tests for this case and for parcel subdivide.
2014-03-06 00:11:13 +00:00
Justin Clark-Casey (justincc)
4e6f7435d0 Add UUID and ready status (whether region has finished starting up) to "show regions" console output. 2014-03-05 01:23:48 +00:00
Justin Clark-Casey (justincc)
39ed382ddf Don't request a terse update after local teleport - this will be done by the main frame loop anyway and has the potential to race that thread. 2014-03-05 00:59:27 +00:00
Justin Clark-Casey (justincc)
c9415fd763 If an avatar is sitting, send out position updates to clients for any change, not just those outside the usual tolerances.
This is to allow small adjustments of less than 0.05m in functions such as llSetPrimitiveLinkParams() to work
This is another fix for http://opensimulator.org/mantis/view.php?id=7044
Extends regression test for this case.
2014-03-05 00:38:38 +00:00
Justin Clark-Casey (justincc)
31de7b845f When positioning agent with PRIM_ROTATION in llSetLinkPrimitiveParams(), set the global rotation rather than the local rotation
Functionally the same as the patch in http://opensimulator.org/mantis/view.php?id=7044, thanks Aleric.
This commit also extends the regression test
2014-03-03 23:35:21 +00:00
Justin Clark-Casey (justincc)
5038a59ef3 Maybe slightly reduce warp3d memory leakage by disposing of decoded bitmap in Warp3DImageModule.GetTexture()
However, this still appears to be leaking massively, at least for me.  Possible cause is warp3D using GDI objects internally and not disposing of them.
2014-02-28 00:16:06 +00:00
Justin Clark-Casey (justincc)
88b1fc1382 Set up a StreamReader and call ReadToEnd() instead of using the GetStreamString() extension method
This eliminates some stream seeking that was never necessary and makes disposable of the StreamReader consistent with other code
2014-02-27 23:13:26 +00:00
Justin Clark-Casey (justincc)
94ad69faf2 Remove long unused UntrustedWebRequest class
This purports to check web requests but doesn't appear to actually do that.
2014-02-27 22:58:44 +00:00
Justin Clark-Casey (justincc)
5fafea6631 refactor: More consistently use using construct within WebUtil to match other existing code there. 2014-02-27 22:52:43 +00:00
Justin Clark-Casey (justincc)
1f4f09ad69 Add more details to InvalidOperationException logging in SychronousRestFormsRequest.MakeRequest(). 2014-02-27 20:35:56 +00:00
Justin Clark-Casey (justincc)
91333b9267 Stop LSL_Api.GetLinkEntities() from creating an unused list on every parameter except LINK_THIS. Simplify code. 2014-02-27 00:23:24 +00:00
Justin Clark-Casey (justincc)
ed760f2586 minor: remove unused variable from recent commit 0e23374 2014-02-27 00:14:16 +00:00
Justin Clark-Casey (justincc)
d7c9725ec0 refactor: Make osGetPrimtiveParams() and soSetPrimitiveParams() use common get/set params code in LSL_Api rather than an old copy&pasted section. 2014-02-27 00:11:50 +00:00
Dev Random
6955190c7d Add Util method to load OpSys env vars 2014-02-26 23:39:45 +00:00
Justin Clark-Casey (justincc)
ce5d308d23 Add some regression tests for previous commit 0e23374 2014-02-26 23:13:56 +00:00
Justin Clark-Casey (justincc)
0e23374aa2 Implement PRIM_ROTATION, PRIM_ROT_LOCAL, PRIM_POSITION and PRIM_POS_LOCAL when manipulating avatars via llSetLinkPrimitiveParams()
Combination of core parts of Freaky's patch at https://github.com/ft-/opensim-patches/blob/master/opensim-llsetlinkprimitive-agent-fix.patch plus further adjustments from myself.
Resolves Mantises 6121, 6421, 6573, 6657
2014-02-26 23:07:13 +00:00
Justin Clark-Casey (justincc)
26fe59c35e Improve regression test TestSetAppearance() 2014-02-24 19:43:06 +00:00
Justin Clark-Casey (justincc)
bc9952f901 Re-enable regression TestSaveBakedTextures() 2014-02-24 19:30:33 +00:00
Justin Clark-Casey (justincc)
fd1b2a1c57 Stop mesh avatars that specify the alpha texture in their bake slots from causing the simulator to continually request that they rebake
This is because the alpha texture is not in the cache, we must continue to have the fallback of looking for these and other persisted bakes in the asset service.
Relates to http://opensimulator.org/mantis/view.php?id=6927
2014-02-24 19:20:50 +00:00
Robert Adams
0f03c64a0c Make Scene.DefaultDrawDistance to be the max of the region size and the
user setting. Seems this parameter has many side effects.
2014-02-23 21:56:37 -08:00
dahlia
d6837f5dc7 update libomv to 59280cfe3e96714151158f4ec7b167af57f60e93 (current head) to hopefully resolve zlib incompatibilities when rendering maptiles with mesh 2014-02-22 18:52:59 -08:00
Robert Adams
0b213af675 Fix problem of hurricane speed winds. Thanks Vegaslon. 2014-02-22 15:04:28 -08:00
Diva Canto
cddf1ec0dc Added 2 new behaviors to pCampBot 2014-02-21 10:06:08 -08:00
Diva Canto
97c74afca8 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-02-21 10:05:06 -08:00
Diva Canto
d27e188fe2 Added 2 new behavirors to pCampBot. These are part of a systematic study I'm doing for understanding the load that AgentUpdate packets incur on the server. 2014-02-21 10:04:12 -08:00
Justin Clark-Casey (justincc)
11b4f534c2 If texture decode fails in Warp3D map maker, log uuid of asset that failed to decode along with exception 2014-02-20 23:36:50 +00:00
Justin Clark-Casey (justincc)
d50d169441 If GetFolderContent called by WebFetchInvDescHandler.Fetch() fails for some reason and returns null, log and return empty contents rather than throwing an exception that ends up terminating the simulator. 2014-02-20 22:35:41 +00:00
Justin Clark-Casey (justincc)
28419251bf minor: Add some method doc to AFM,SetAppearanceAssets() 2014-02-20 19:30:47 +00:00
Justin Clark-Casey (justincc)
d1bb73d068 In core.groups GroupsServiceRemoveConnector, if GetGroupRecord() or UpdateGroup() do not have a RESULT parameter in the result message, return null rather than fail with NullReferenceException
This check was already done by other methods.
Looks to resolve http://opensimulator.org/mantis/view.php?id=7012
2014-02-20 19:17:21 +00:00
Justin Clark-Casey (justincc)
4d1426e77d For now, do not replacing missing wearables with default wearables if itme details cannot be found.
This is causing many issues on OSGrid, possibly due to teleporting timing differences with simulators hosted in different places or HG teleports
Added a bit more logging for debug purposes.
See http://opensimulator.org/mantis/view.php?id=6939
2014-02-20 18:40:21 +00:00
dahlia
a2866b85f3 add newRegion parameter to CrossAgentToNewRegion event and trigger the event after crossing thread is invoked 2014-02-20 00:18:28 -08:00
dahlia
269a6410a0 add EventManager event OnCrossAgentToNewRegion 2014-02-19 17:52:38 -08:00
Robert Adams
c26f01ff8c varregion: make scene default draw distance to be the maximum size of the
region. This is a temp fix for the use of draw distance to compute child
regions. Eventually must use the draw distance from the viewer for the
computation.
2014-02-19 09:51:49 -08:00
Robert Adams
fc9930e420 Repair check for if in region position (I mean || is kinda like &&). 2014-02-15 18:49:40 -08:00
Robert Adams
79200ed270 Fix displacement and location operations on legacy trees and grass in
the 'load oar' and 'scene' commands. Before they  were ignored but the
code now relies on the SOG.IsAttachment function for attachmentness.
2014-02-15 17:10:20 -08:00
Robert Adams
7fc289c039 Properly restore position on crossing failure for mega-regions.
Fix odd "cannot cross into banned parcel" viewer error message when crossing
into non-existant region. Proper permission failure messages are now returned.
2014-02-15 17:02:53 -08:00
Robert Adams
877bdcdce1 Rewrite of mega-region code to use new form of border checking.
This commit eliminates all of the 'border' class and list code and replaces
it with testing if in the current region.
Impacts: can make a mega-region out of varregions of the same size; and
mega-region combinations must be rectangular (not square but rectangular)
2014-02-15 16:01:43 -08:00
Robert Adams
bdbbeaa494 Non-functional changes of numbers into symbolic references and a few
comments on what variables really mean.
2014-02-15 16:01:01 -08:00
Justin Clark-Casey (justincc)
f6913e911e Merge branch 'justincc-master' 2014-02-15 01:18:10 +00:00
Justin Clark-Casey (justincc)
f74aafaf63 In GridUserService, if a UUID is given consistently use the longest matched entry (as already done by GetGridUserInfo()) in order to avoid problems with multiple entries.
This is to avoid issues where LoggedIn, SetHome, etc were always using the exact UUID match but GetGridUserInfo() would use the longest.
Looks to address http://opensimulator.org/mantis/view.php?id=6986
2014-02-15 01:13:58 +00:00
Justin Clark-Casey (justincc)
4fed301e65 Don't request group information in SP.MakeRootAgent() if the presence belongs to no group (UUID.Zero)
This was trigger the XmlRpcGroups errors described in http://opensimulator.org/mantis/view.php?id=6986
Introduced in commit 5b73b9c4 (Wed Dec 11 01:39:56 2013)
2014-02-14 23:43:07 +00:00
Justin Clark-Casey (justincc)
733e067958 Log information about which function, request data and agent ID triggered an XmlRpcGroupsServiceConnector error 2014-02-14 21:28:45 +00:00
Justin Clark-Casey (justincc)
ffd0da23fb Merge branch 'justincc-master' 2014-02-14 00:16:17 +00:00
Justin Clark-Casey (justincc)
f49d513089 Change warns associated with UserAgentServiceConnector to debugs, as this is not necessarily a problen with the source simulator (e.g. someone else's remote simulator cannot be contacted).
This is Oren Hurvitz's second patch from http://opensimulator.org/mantis/view.php?id=6956 with a small amount of correction
2014-02-14 00:08:13 +00:00
Justin Clark-Casey (justincc)
fc35b45e21 If calls to UserAgentServiceConnector fail then throw an exception. This lets the caller decide whether to discard the error or not.
This is Oren Hurvitz's 0001 patch from http://opensimulator.org/mantis/view.php?id=6956 but I ended up doing some tweaking to resolve patch application issues.
2014-02-14 00:01:12 +00:00
Justin Clark-Casey (justincc)
bc7fda39b4 Merge branch 'justincc-master' 2014-02-12 23:23:56 +00:00
Justin Clark-Casey (justincc)
e10012a7a6 If a caller tries to queue a CAPs message to a scene presence that has no event queue (e.g. an NPC), only warn if event queue debugging is greater than zero.
Removes the spurious log warnings if groups are active when NPCs are used.
Adds more regression tests associated with adding messages to the event queue
2014-02-12 23:18:10 +00:00
Robert Adams
3a7c8d1f32 BulletSim: the minimum vehicle velocity was set too low so moving slow
was getting zeroed too easily. Added VehicleMinVelocity parameter.
2014-02-11 21:07:55 -08:00
Robert Adams
c0cc5e0fa4 varregion: Send large region patches for wind and clouds. 2014-02-11 21:07:55 -08:00
Mic Bowman
b83a224147 Add JsonRezAtRoot script function. Operation is very similar to
llRezAtRoot except that the start parameter is a Json string that will
be unpacked into a json store identified by the objects uuid.  This
makes a much more expressive (and simpler) way of passing initial
parameters to a rezzed object.
2014-02-09 18:07:49 -08:00
Robert Adams
4a1c1fc009 Add zadark to CONTRIBUTORS.txt 2014-02-06 11:47:19 -08:00
Roger Kirkman
cf61cdf58c Fix - Viewer crash during HG Teleport
Signed-off-by: Robert Adams <misterblue@misterblue.com>
2014-02-06 11:33:17 -08:00
Mic Bowman
1913ab5ad5 Update the SimianMaptile uploader to accommodate varregions. 2014-02-05 21:26:39 -08:00
Melanie
29c8461631 Remove the added whitespace, test concluded 2014-02-04 05:54:28 +00:00
Melanie
8f372b8ac8 Bot test 2014-02-04 05:52:22 +00:00
Robert Adams
342be228c6 Remove compile error from returning value in void function 2014-02-03 21:53:14 -08:00
Michael Cerquoni
87abf06956 test again undoing previous changes 2014-02-04 00:32:40 -05:00
Michael Cerquoni
f81841a2c5 this is just a test 2014-02-04 00:30:35 -05:00
Robert Adams
1b41ec0a85 Fix raw32 terrain heightmap reader so it estimates terrain size from
the size of the input stream. This is required since the raw heightmap
format (.r32) does not contain any size information.
The estimation relies on terrain being square.
2014-02-03 21:23:32 -08:00
Melanie
31cba5aa66 Add one check for a blank URL because the module wasn't quite sure not to work when unconfigured :| 2014-02-04 04:20:37 +00:00
Melanie
1aed6567a8 Samle configurations for the baked texture server. 2014-02-04 02:49:13 +00:00
Melanie
f0f852b27f Final code drop for appearance. Adding Avination's baked texture storage server. 2014-02-04 02:29:02 +00:00
Melanie
1197658233 Adding the Avination XBakesModule, the client for the persistent bakes system 2014-02-04 02:09:39 +00:00
Melanie
e1d1c27965 Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim 2014-02-04 01:55:41 +00:00
Melanie
49c2213a01 Dropping the rest of Avination's modified appearance code for core.
Module to follow.
2014-02-04 01:54:16 +00:00
Robert Adams
41b6602a77 Add "--no-objects" parameter to 'load oar'. 2014-02-02 22:16:01 -08:00
Robert Adams
8c6a0cb44a Really add the old parameter names to load oar to keep downward compatibiliy 2014-02-02 17:18:08 -08:00
Robert Adams
2a4dd34616 Change new 'load oar' parameters to be hyphenated to be consistant with
existing parameters. ('--forceterrain' becomes '--force-terrain').
The old forms have been kept for downward compatiblity.
2014-02-02 12:21:18 -08:00
Robert Adams
9c97fb8e12 Implement terrain merging in TerrainChannel.
Modify archiver to use terrain merging when loading oars.
This makes displacement AND rotation properly work on terrain when loading oars.
Especially useful when loading legacy region oars into large varregions.
2014-02-02 11:17:49 -08:00
dahlia
a8e64cd59a Overload INPCModule.CreateNPC() to allow agentID to be specified. Note: this is intended for use in region modules and is not exposed to scripts. 2014-02-01 04:09:20 -08:00
Oren Hurvitz
abb193ec94 In UuidGatherer, gather materials referenced in the prim's TextureEntry
Signed-off-by: dahlia <dahlia@nomail>
2014-02-01 02:56:15 -08:00
Justin Clark-Casey (justincc)
b2878eb773 Merge branch 'justincc-master' 2014-01-31 00:51:22 +00:00
Oren Hurvitz
b8e22f02e7 Make sure Web streams are disposed after use 2014-01-31 00:44:22 +00:00
David Rowe
1380b37d71 Made error messages more consistent 2014-01-31 00:24:52 +00:00
David Rowe
3d62f4369d Replaced throwing exceptions with calls to Error() 2014-01-31 00:24:47 +00:00
David Rowe
d405254971 Replaced llSay()ing LSL errors with calls Error() 2014-01-31 00:24:43 +00:00
David Rowe
9db4090c07 Replaced LSLError() calls with calls to Error() 2014-01-31 00:24:40 +00:00
David Rowe
c9550e473d Updated "deprecated" LSL errors to use Deprecrated() 2014-01-31 00:24:36 +00:00
David Rowe
257f9cec40 Updated "not implemented" LSL errors to use NotImplemented() 2014-01-31 00:24:31 +00:00
David Rowe
13bb9ea682 Updated ShoutError() calls to use new LSL error methods 2014-01-31 00:21:22 +00:00
David Rowe
67ec95bde8 Updated methods for handling LSL script errors, deprecated, and not implemented 2014-01-31 00:20:10 +00:00
Justin Clark-Casey (justincc)
c467dfcd81 Merge branch 'justincc-master' 2014-01-30 00:42:20 +00:00
Justin Clark-Casey (justincc)
b73baeb4a4 Record whether login to home fails because no home set (UUID.Zero) or region not found. 2014-01-30 00:40:56 +00:00
Justin Clark-Casey (justincc)
b50e5704b8 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-30 00:06:09 +00:00
Justin Clark-Casey (justincc)
7807b19a89 Merge branch 'justincc-master' 2014-01-30 00:05:12 +00:00
Justin Clark-Casey (justincc)
bdab05df0e Add "show grid user" robust/standalone console command for debug purposes.
Shows all data on entries which match or start with a given ID.
This would usually be a UUID.
2014-01-30 00:03:22 +00:00
Robert Adams
0842e2e15b BulletSim: default physical terrain implementation to heightmap.
It originally looked like mesh terrain would perform better for vehicles
but, after much use, heightmap is the clear winner.
Force terrain implementation to heightmap if the physics region is
larger than legacy region size. This solves running out of memory for
very large regions.
2014-01-29 06:44:14 -08:00
Mic Bowman
fbf33ef1de Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-28 22:42:35 -08:00
Mic Bowman
3f5c6c897f One more run at fixing the sun module. Parameter setting fixed to
work through the OSSL interface. And setting the parameters now
adjusts all the dependent variables correctly so the sun moves
at the modified rate.
2014-01-28 22:40:39 -08:00
Robert Adams
1900254e77 Restore brush tests with correct values and adjustments for new terrain height
rounding characteristics.
2014-01-28 21:43:18 -08:00
Robert Adams
678c107915 Temporarily disable brush test. It will come back when tuning is complete. 2014-01-28 16:58:27 -08:00
Robert Adams
dde0e547a7 Change area of brush test to account for rounding errors in terrain implementation 2014-01-28 16:48:34 -08:00
Robert Adams
226b5e4d75 Increase the strength of brushes in brush test in an attempt to overcome rounding
introduced with new terrain height class.
2014-01-28 16:36:56 -08:00
Mic Bowman
cfe1bced7d Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-28 16:34:49 -08:00
Mic Bowman
2877c7d94d Actually make the parameter updates change the behavior of
sun movement.
2014-01-28 16:34:22 -08:00
Robert Adams
0c3493f619 clear land tainting when tested. Then testing, pass scene to LandObject as now needed to get region size 2014-01-28 16:25:01 -08:00
Robert Adams
d25265ae82 Fix terrain tests by properly initializing low detail terrain to zero height.
Also remove PI heightmap test as new heightmaps only have two significant digits.
2014-01-28 15:58:45 -08:00
Mic Bowman
1d533b0f01 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-28 15:47:24 -08:00
Mic Bowman
bfb0011cd3 Some major surgery on the sun module. Updates to the client were gated
by a "mode" check. That mode check has been removed (it didn't result
in any change of behavior anyway). Also added a command line variable
update to set the sun position time offset (offset from the system
clock). Default is no offset to preserve existing behavior.
2014-01-28 15:43:47 -08:00
Robert Adams
e5d59dc696 Repair database routines so they properly return null when asked for
the heighmap of a region that does not exist.
2014-01-28 15:29:06 -08:00
Robert Adams
8eec717f5f Merge branch 'master' into varregion 2014-01-28 08:50:28 -08:00
Robert Adams
4faf11e001 varregion: fix for teleporting by double clicking on a map location.
Thanks Garmin.
2014-01-28 08:49:22 -08:00
Justin Clark-Casey (justincc)
cd35d298fa Merge branch 'justincc-master' 2014-01-28 00:23:10 +00:00
Oren Hurvitz
2cf224166f Added osGetRegionSize(), which returns the region size in meters and recognizes megaregions 2014-01-28 00:11:50 +00:00
Justin Clark-Casey (justincc)
f7172095e0 Convert tabs to spaces from previous commit 8c2b41b01 2014-01-28 00:04:55 +00:00
Dev Random
8c2b41b01d Make inidirectory files supercede distro files 2014-01-27 23:56:10 +00:00
Justin Clark-Casey (justincc)
a4017ee1eb Reinsert attachments list taking code in SP.MakeRootAgent()
Locking attachments then launching script instances on a separate thread will not work, attachments will simply be unlocked and vulnerable to race conditions.
2014-01-27 23:47:43 +00:00
Justin Clark-Casey (justincc)
1b86239f79 refactor: Remove identical part.ParentGroup.AddAvatar(UUID); calls which occur no matter which branch of the conditional is executed 2014-01-27 23:17:09 +00:00
Justin Clark-Casey (justincc)
e2fbc88d98 Re-enabled NPCModuleTests.TestCreate() 2014-01-27 22:56:51 +00:00
Robert Adams
49af6b53e7 varregion: enable teleporting to a varregion by clicking on the map and
pressing the 'teleport' button.
This commit adds returning region map info for all the subregions of a
varregion. This also handles the selection of the extra region and then
the displacement of the postion so the teleport is to the correct location.
2014-01-26 19:32:28 -08:00
Robert Adams
13a9d5409c Merge branch 'master' into varregion
Conflicts:
	OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs
	OpenSim/Region/CoreModules/World/LegacyMap/ShadedMapTileRenderer.cs
	OpenSim/Region/CoreModules/World/LegacyMap/TexturedMapTileRenderer.cs
2014-01-26 07:56:47 -08:00
Robert Adams
6831e58616 varregion: modify MapImageModule structure so it will better merge
with changes made in master.
2014-01-26 07:38:28 -08:00
Justin Clark-Casey (justincc)
0eda7dd1c7 Merge branch 'justincc-master' 2014-01-24 19:41:41 +00:00
Justin Clark-Casey (justincc)
fea8345f56 minor: remove long unused state queue from "show queues" console reports 2014-01-24 19:40:14 +00:00
Justin Clark-Casey (justincc)
c9b5ba78d9 minor: correct the usage statement on the "show image queues" console command - should not have been "image queues show" 2014-01-24 19:36:12 +00:00
Justin Clark-Casey (justincc)
4a9796a506 Skip IClientAPIs that don't implement IStatsCollector (such as NPCAvatar) from the "show queues" console report to stop screwing up formatting.
"show pquques" already did this
2014-01-24 19:31:31 +00:00
Robert Adams
afb2e07111 varregion: pass region size in more HG services. 2014-01-24 06:30:38 -08:00
Mic Bowman
674a3a5639 Enable the simulator to handle region size information returned from
a hypergrid gatekeeper. Fields are "size_x" and "size_y". Server side
will be updated separately.
2014-01-23 16:20:18 -08:00
Justin Clark-Casey (justincc)
966ab21839 Merge branch 'justincc-master' 2014-01-24 00:17:39 +00:00
Justin Clark-Casey (justincc)
a2d5d810e0 Properly dispose of drawing objects to reduce/stop memory leakage on generating map tiles with the MapImageModule and TexturedMapTileRenderer (the current defaults) 2014-01-24 00:14:58 +00:00
Justin Clark-Casey (justincc)
a859464e91 Add "generate map" console command to allow manual regeneration and storage of maptiles
Primarily for test purposes though could be useful if one prefers to manually update the map tile
2014-01-23 23:44:21 +00:00
Robert Adams
4c362a83f9 Merge branch 'master' into varregion 2014-01-21 11:31:51 -08:00
Mic Bowman
83626e60e6 Adds a configuration option to cannibalize bandwidth from the
udp texture throttle and move it to the task throttle. Since most
viewers are using http textures, the udp texture throttle is holding
onto bw that could be used for more responsive prims updates. See
the documentation for CannibalizeTextureRate in OpenSimDefaults.ini.
Option is disabled by default.
2014-01-20 18:59:43 -08:00
dahlia
7bd42fc42f Add back code to UuidGatherer to retrieve UUIDs for materials stored in DynAttrs. This is unfortunately still necessary until a better solution for handling existing legacy materials can be implemented 2014-01-20 15:01:18 -08:00
dahlia
af58631f00 rather than converting existing materials to assets, just retrieve them and make them available for viewing. Any new materials added to the scene will become assets. 2014-01-20 13:57:14 -08:00
dahlia
719810e9d8 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-20 11:54:36 -08:00
dahlia
1cae3664a5 add null texture entry face check before converting legacy materials 2014-01-20 11:53:33 -08:00
Justin Clark-Casey (justincc)
5fc871027e Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2014-01-20 19:38:47 +00:00
Justin Clark-Casey (justincc)
2cf7478b9a Merge branch 'justincc-master' 2014-01-20 19:34:55 +00:00
Mic Bowman
2e78e89c36 Clean up orphaned json stores. This can happen when an object is
removed, when a script is removed, or when a script is reset. Also
added a stats command to track the number of json stores used by
a region. Will probably add some more commands later.
2014-01-20 11:33:49 -08:00
Justin Clark-Casey (justincc)
8e72b53edc Stop exceptions being generated on agent connection if a telehub object has been deleted or has no spawn points. 2014-01-20 19:16:19 +00:00
dahlia
4800303abd update OpenMetaverse.StructuredData to git master (bf4e9f654ff99c85e20b53e56faac38e307dd8c2) which fixes JSON OSD serialization to a standards compliant means of encoding floating point NaN and Infinity 2014-01-20 03:18:36 -08:00
dahlia
36d8a24a86 force SOG update when converting legacy materials to ensure changes are persisted 2014-01-20 03:11:01 -08:00
dahlia
95c926b2cd delay texture entry parsing until absolutely necessary while converting legacy materials 2014-01-20 03:02:30 -08:00
dahlia
28723beb0c Add code to convert legacy materials stored in DynAttrs to new asset format and store them as assets 2014-01-20 02:57:08 -08:00
Oren Hurvitz
d1f16c4b4b Check agent permissions before modifying an object's materials. Also, when creating a Material asset, set the current agent as the Creator. 2014-01-20 00:38:44 -08:00
Oren Hurvitz
68d83425c6 When asked to change the Material for one face, change only that face; not the default material 2014-01-20 00:38:43 -08:00
Oren Hurvitz
3018b2c5d7 Materials module: a) Store materials as assets; b) Finalized it (removed the "Demo" label; removed most of the logging); c) Enabled by default
Changed UuidGatherer to use 'sbyte' to identify assets instead of 'AssetType'. This lets UuidGatherer handle Materials, which are defined in a different enum from 'AssetType'.
2014-01-20 00:38:42 -08:00
Oren Hurvitz
ca0336d834 Renamed MaterialsDemoModule to MaterialsModule 2014-01-20 00:38:41 -08:00
Oren Hurvitz
e8273fa8ad - Materials: support the viewer removing the material (in which case matsMap["Material"] is missing) - Reduced logging 2014-01-20 00:37:26 -08:00
Robert Adams
90fa3202c6 varregion: remove debugging splat file saving that fills up the
maptile dir and causes errors.
2014-01-19 13:37:51 -08:00
Robert Adams
5e6a47f13f varregion: remove --noterrain and --noparcel parameters in 'load oar'.
Add --forceterrain and --forceparcel to 'load oar'. In order to not change
the operation of --merge (which does an object merge and suppresses terrain
and parcel information loading), added the --force* parameters to be used
when loading multiple oars to build up a varregion.

Added --rotation and --rotationcenter parameters to 'load oar' which apply a rotation to
the loaded oar objects before displacing. The rotation is in degrees (pos or neg)
and the center defaults to "<128, 128, 0>".
2014-01-19 12:45:16 -08:00
Robert Adams
6fbfb47b92 varregion: add --noterrain and --noparcel to 'load oar'.
--noterrain suppresses the loading of the terrain from the oar.
--noparcels suppresses the loading of parcel information from the oar.
2014-01-19 11:03:08 -08:00
Robert Adams
dd6db72939 varregion: add --displacement parameter to 'load oar'.
Adds displacment to all objects and terrain loaded from the oar.
As an example, if you have a 512x512 region and an old 256x256 oar, doing
  load oar --displacement "<128,128,0>" oarFile.oar
will load the object (and terrain) into the middle of the 512x512 region.
If displacement is not specified, 'load oar' works like it always has.
If you have a 5
2014-01-19 10:09:43 -08:00
Robert Adams
f127e4b4ee Merge branch 'master' into varregion 2014-01-19 07:38:53 -08:00
Robert Adams
4fb3d314b8 Fix casting error for float type INI file parameter parsing. 2014-01-19 07:37:14 -08:00
Robert Adams
54a4b9eab4 varregion: Update Warp3D to properly handle varregions.
This includes additions to Warp3D:
   Optional rendering of mesh and scupltie prims (INI parameter. Off by default)
   Texturing of large prims (INI parameter. On by default)
   Better garbage collection
2014-01-19 07:33:56 -08:00
Robert Adams
813f0da00b Add J2K decoder routine that converts directly to an image. 2014-01-19 07:32:41 -08:00
Robert Adams
08fa0a6a8a Fix casting error for float type INI file parameter parsing. 2014-01-19 07:26:55 -08:00
Robert Adams
60de0bc3c2 varregion: split up generated maptile images for storage in map. This
makes maps for varregions show up properly.
2014-01-19 05:09:03 -08:00
Justin Clark-Casey (justincc)
d466446df3 Merge branch 'justincc-master' 2014-01-18 01:39:45 +00:00
Justin Clark-Casey (justincc)
e9454d4672 Following on from 50ea2e0, only fetch scene presence for check if lightscript function has failed initial IsEstateManagerOrOwner() check 2014-01-18 01:36:40 +00:00
Oren Hurvitz
50ea2e0d67 Fixed: Windlight functions caused an error if called when the script's owner isn't in the scene 2014-01-18 01:26:30 +00:00
Justin Clark-Casey (justincc)
0cbe5f8424 Remove redundant methods in FlotsamAssetCache 2014-01-18 00:55:49 +00:00
Justin Clark-Casey (justincc)
b9453a8f6f implement CoreAssetCache.Check() 2014-01-18 00:52:36 +00:00
Justin Clark-Casey (justincc)
427ffd3387 implement GlynnTuckerAssetCache.Check() 2014-01-18 00:48:20 +00:00
Justin Clark-Casey (justincc)
fc7ccfdafa Properly implement CenomeAssetCache.Check() 2014-01-18 00:30:23 +00:00
Justin Clark-Casey (justincc)
ee8ba1ab9a Simplify FlotsamAssetCache.CheckFromMemoryCache() 2014-01-18 00:21:53 +00:00
Justin Clark-Casey (justincc)
d381da81d6 minor: Add method doc to IImproveAssetCache 2014-01-18 00:15:38 +00:00
Justin Clark-Casey (justincc)
97fbb8ed45 Elminate some copy/paste in FlotsamAssetCache.CheckFromFileCache() and use using() construct to ensure filestream is always closed 2014-01-18 00:12:12 +00:00
Justin Clark-Casey (justincc)
12bfce7b9f elminate unnecessary asset != null check in FlotsamAssetCache.UpdateFileCache()
Passed in asset is always not null
2014-01-18 00:06:12 +00:00
Justin Clark-Casey (justincc)
b52b50ee56 minor: reinsert some method doc back into IEntityTransferModule 2014-01-17 23:36:23 +00:00
Justin Clark-Casey (justincc)
9fefbcf7fc minor: since structs are values, assigning them to another variable copies it. Instantiation is unnecessary. 2014-01-17 23:32:37 +00:00
Justin Clark-Casey (justincc)
14c72d4a5b Revert "Fixed: Windlight functions caused an error if called when the script's owner isn't in the scene"
This reverts commit 39e5785c0f.

Did not mean to apply this yet.
2014-01-17 01:58:10 +00:00
Justin Clark-Casey (justincc)
18e0d2f343 minor: Add Ai Austin to additional OpenSim contributors by request as he has added config corrections and does extensive liaison with other projects 2014-01-17 01:55:40 +00:00
Oren Hurvitz
39e5785c0f Fixed: Windlight functions caused an error if called when the script's owner isn't in the scene 2014-01-17 01:47:37 +00:00
Justin Clark-Casey (justincc)
4fa843ff19 Reorder checks in SP.CompleteMovement() to fix test failures 2014-01-16 23:44:17 +00:00
Justin Clark-Casey (justincc)
f467121c51 Merge branch 'justincc-master' 2014-01-16 23:33:30 +00:00
Justin Clark-Casey (justincc)
3bc669ffc7 Actually put IsChildAgent = true inside the lock, otherwise there is still a small window for race conditions on duplicate CompleteMovement calls 2014-01-16 23:31:50 +00:00
Justin Clark-Casey (justincc)
3ffd90496a Prevent duplicate invocations or race dontision in SP.CompleteMovement()
This can happen under poor network conditions if a viewer repeats the message send
If this happens, physics actors can get orphaned, which unecessarily raises physics frame times
2014-01-16 20:23:31 +00:00
Justin Clark-Casey (justincc)
1a8b56fa87 Merge branch 'justincc-master' 2014-01-16 00:33:04 +00:00
Oren Hurvitz
2d9d6fe922 Can delete the Offline Messages sent to/from a user.
This is useful if the user is deleted.
2014-01-16 00:24:51 +00:00
Oren Hurvitz
46c2791fe2 In the offline message table, store the sender.
This data is useful for preventing abuse (e.g., someone who sends too many messages), or for deleting message if their sender has been deleted.
2014-01-16 00:16:33 +00:00
Oren Hurvitz
21bc799a17 Fixed offline IM 2014-01-16 00:10:10 +00:00
Justin Clark-Casey (justincc)
e99a7d879e Remove old IInterRegionComms and references. This hasn't been used since 2009 and was superseded by ISimulationService 2014-01-16 00:05:04 +00:00
Justin Clark-Casey (justincc)
4675a2fb29 Merge branch 'justincc-master' 2014-01-14 01:19:54 +00:00
Justin Clark-Casey (justincc)
797684115c minor: Add David Rowe to ctrlaltdavid handle by request 2014-01-14 01:16:04 +00:00
Robert Adams
cc5cffc212 varregion: properly pack the region size parameters so he viewer will parse them.
This gets rid of the viewer crash when teleporting into varregions and allows
multiple, adjacent varregions (of the same size) with border crossings.
2014-01-11 22:00:52 -08:00
Robert Adams
1eea6fd452 varregion: Debug messages for region crossing debugging. 2014-01-11 22:00:24 -08:00
Robert Adams
3760d10cd0 varregion: remove unnecessary border checking code in ScenePresence. 2014-01-11 21:59:22 -08:00
Robert Adams
1cf17a3cf7 Merge branch 'master' into varregion
Conflicts:
	OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
	OpenSim/Region/Framework/Scenes/SceneBase.cs
	OpenSim/Services/Interfaces/IGridService.cs
	OpenSim/Services/LLLoginService/LLLoginResponse.cs
(conflicts were debug statements that are commented out in master branch)
2014-01-11 08:52:23 -08:00
Robert Adams
239b85d7ce Fix crash in BulletSim which sometimes happens making a linkset physical
(like sitting on and activating a vehicle) and crossing borders.
This keeps better bookkeeping on compound shapes so BulletSim can
identify them when being freed.
2014-01-10 22:52:31 -08:00
Justin Clark-Casey (justincc)
b5ef585069 Merge branch 'justincc-master' 2014-01-11 01:22:42 +00:00
Oren Hurvitz
bc0ff5e7d4 Allow Boolean nodes in XML to be specified as "0/1". AuroraSim does that. 2014-01-11 00:54:41 +00:00
Justin Clark-Casey (justincc)
66e2e1c9c3 Merge branch 'justincc-master' 2014-01-10 20:52:50 +00:00
Justin Clark-Casey (justincc)
70dd4cf152 In library inventory, correct asset id for llSay example script
From http://opensimulator.org/mantis/view.php?id=6917
Thanks to FreakyTech for this spot.
2014-01-10 20:51:28 +00:00
Justin Clark-Casey (justincc)
09e800f4b1 Merge branch 'justincc-master' 2014-01-10 20:46:00 +00:00
Justin Clark-Casey (justincc)
8c6b9ef865 minor: Add ctrlaltdavid to contributors list 2014-01-10 20:45:05 +00:00
David Rowe
08f2fc63cd Fixed llTextBox error message text 2014-01-10 20:43:24 +00:00
Justin Clark-Casey (justincc)
68cbccb288 Merge branch 'justincc-master' 2014-01-10 20:37:14 +00:00
Melanie
9050c152b4 Dynamically adjust to the number of visual params sent. 2014-01-10 20:31:52 +00:00
Oren Hurvitz
da47bcae3e When moving the root prim of an attachment: a) Change the attach position; b) Move the other prims in the reverse direction to compensate 2014-01-10 20:24:11 +00:00
Justin Clark-Casey (justincc)
5e72de1908 Merge branch 'justincc-master' 2014-01-10 20:19:38 +00:00
Oren Hurvitz
88f01a4130 When creating a coalesced object, set its permissions to the lowest-common-denominator of all the sub-objects 2014-01-10 20:01:08 +00:00
Oren Hurvitz
a94e1e0e08 When creating a coalesced object, set its Creator ID if all the objects have the same creator 2014-01-10 19:54:17 +00:00
Oren Hurvitz
91fd9c4670 Refactored: use a single function to apply an object's folded permissions to its main permissions 2014-01-10 19:50:03 +00:00
Oren Hurvitz
13f31fdf85 Refactored setting permissions when rezzing items: use the same function when rezzing from user inventory and prim inventory.
Also, fixed a bug: when rezzing a coalesced object from a prim's inventory, apply the coalesced object's name and description only to the first sub-object; not to all the objects in the coalescence. (This was already done correctly when rezzing from a user's inventory.)
2014-01-10 19:37:59 +00:00
Justin Clark-Casey (justincc)
32e9c16957 Merge branch 'justincc-master' 2014-01-08 01:04:26 +00:00
Justin Clark-Casey (justincc)
0155d42b80 If an agent is sitting, then do send the rotation in the agent update instead of zeroing it to resolve mouselook camera problems
Addresses http://opensimulator.org/mantis/view.php?id=6892
Thanks to tglion for this spot.
This resolves a recent regression from 17b32b764a
2014-01-08 00:54:39 +00:00
Robert Adams
38148bd4b6 Some missing definitions needed for successful compilation. 2014-01-04 19:01:05 -08:00
Robert Adams
8ff2ff1a36 Remove some chatty DebugFormat statements. No functional changes. 2014-01-04 19:01:04 -08:00
Robert Adams
7e32313a49 varregion: Add region size to teleport event messages (EnableSimulator,
CorssRegion, TeleportFinishEvent).
Have Simian grid service return the region size.
Many teleport related debug log messages. Can be removed when teleport
works (like that's ever going to happen).

Conflicts:

	OpenSim/Framework/RegionInfo.cs
2014-01-04 19:01:04 -08:00
Robert Adams
004ecee314 varregion: send region size in LLLoginResponse. 2014-01-04 19:01:03 -08:00
Robert Adams
d9848943a9 Add routines in Util.cs for conversion of region handles to region
locations and for the conversion of region world location to region
'region' location. These routines will replace all the arithmatic
scattered throughout OpenSimulator.
2014-01-04 19:01:03 -08:00
Melanie
dd96fef940 Dynamically adjust to the number of visual params sent. 2014-01-04 21:18:37 +00:00
Robert Adams
fd045d520e Merge branch 'master' into varregion
Conflicts:
	OpenSim/Framework/Constants.cs
	OpenSim/Framework/RegionInfo.cs
	OpenSim/Services/GridService/GridService.cs
	OpenSim/Services/Interfaces/IGridService.cs
Most conflicts had to do with Util routines not in master branch yet.
2014-01-04 08:57:51 -08:00
Robert Adams
9984ecf862 varregion: Add region size to teleport event messages (EnableSimulator,
CorssRegion, TeleportFinishEvent).
Have Simian grid service return the region size.
Many teleport related debug log messages. Can be removed when teleport
works (like that's ever going to happen).
2014-01-03 07:41:06 -08:00
Robert Adams
eab9390e05 Initialize default region size in GridRegion in the no parameter constructor
as is used by the grid connector tests.
2013-12-28 07:20:14 -08:00
Robert Adams
6869633d76 Add serialization/deserialization of region size to RegionInfo, GridRegion, and RegionData.
This does not modify interfaces or handling of variable sized regions. This only
enables the loading and storing of the region size and the reporting of the
region size in grid service responses.
The database tables already have the code to load and store the region size.
2013-12-28 06:58:15 -08:00
Robert Adams
01c0bbf181 varregion: extract banned region logic into a class for cleanlyness.
Add 'not found' caching in EntityTransferModule.GetRegionContainingWorldLocation
so hitting borders and bad teleports do not continuiously hammer on the GridService.
2013-12-27 08:23:37 -08:00
Robert Adams
2d2bea4aa7 varregion: many more updates removing the constant RegionSize and replacing
with a passed region size. This time in the map code and grid services code.
2013-12-26 22:45:59 -08:00
Robert Adams
e5f7c8b6e8 varregion: add lots of DEBUG level log messages. Especially for teleport. 2013-12-24 12:31:26 -08:00
Robert Adams
b40b57776b varregion: remove unused Scene.HaveNeighbor routine. Its computation
was wrong for large regions anyway.
2013-12-24 12:28:54 -08:00
Robert Adams
5c9fa15f30 varregion: fix bug where destination region is not found and object is
not restored to its original location.
2013-12-24 11:51:50 -08:00
Justin Clark-Casey (justincc)
540fa84842 Merge branch 'justincc-master' 2013-12-21 01:12:45 +00:00
Justin Clark-Casey (justincc)
2f94165dcc Add lsl arg syntax checking for control event 2013-12-21 01:00:50 +00:00
Justin Clark-Casey (justincc)
f1cd813a29 refactor: rename internal lsl parser VectorDeclaration -> VecDeclaration for consistency 2013-12-21 00:49:01 +00:00
Justin Clark-Casey (justincc)
871ac5b16c Add arg checking for at_target lsl event 2013-12-21 00:46:34 +00:00
Justin Clark-Casey (justincc)
a5e4780547 Add lsl event arg checking for at_rot_target 2013-12-21 00:37:56 +00:00
Justin Clark-Casey (justincc)
b757ab2586 Add lsl event argument checking for attach and on_rez 2013-12-21 00:08:36 +00:00
Robert Adams
a01862509e Merge branch 'master' into varregion 2013-12-20 06:52:28 -08:00
Justin Clark-Casey (justincc)
68773ee7c4 Merge branch 'justincc-master' 2013-12-19 01:41:04 +00:00
Justin Clark-Casey (justincc)
e298bf41ff Add missing viewer param elements for butt and breast physics.
Patch from http://opensimulator.org/mantis/view.php?id=6864 except with tabs replaced by spaces
Thanks cinderblocks!
2013-12-19 01:24:36 +00:00
Justin Clark-Casey (justincc)
a5ca15c428 Create regression test TestSendAgentGroupDataUpdate() for groups agent data sending 2013-12-18 23:35:38 +00:00
Robert Adams
6937eec258 Merge branch 'master' into varregion
Add new region crossing code to varregion

Conflicts:
	OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
	OpenSim/Region/Framework/Scenes/ScenePresence.cs
2013-12-17 06:18:13 -08:00
BlueWall
141d771a93 Fix issue with editing notes for other avatars 2013-12-16 17:36:21 -05:00
BlueWall
b03ec6137f Populate user preferences with UserAccount email if it is present, else return an error indicating no email is on record for the user. 2013-12-16 17:36:04 -05:00
Melanie
fe01e7d1cc Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim 2013-12-16 22:11:03 +00:00
Melanie
f69e91dc2d This is the acutal sitting avatar crossing code. This commit implements the
actual crossing mechanics for seated avatars, using the supporting code from
the previous commits. Physics is not supported yet, although some few bits
for them are already in place due to the earlier code drops. With this commit,
crossing sitting avatar by "editing" the prim across the border, by using
llSetPos or keyframe motion may already be possible. Vehicles will come next.
2013-12-16 22:08:02 +00:00
Robert Adams
13a9a4b653 varregion: rename 'LegacyRegionLocX' back to 'RegionLocX' and same for Y and Z.
Rename 'RegionWorldLocX' to 'WorldLocX' and same for Y and Z.
This keeps the downward compatibility and follows the scheme of 'region'
and 'world' location naming that is happening in the Util module.
2013-12-14 07:53:01 -08:00
Justin Clark-Casey (justincc)
00e632ec3a Merge branch 'justincc-master' 2013-12-14 02:49:23 +00:00
Justin Clark-Casey (justincc)
51da52f904 Extend TestLlGetNotecardLine() regression test to contain chars that are two bytes in utf8 2013-12-14 02:48:29 +00:00
Justin Clark-Casey (justincc)
38d7d46c17 Merge branch 'justincc-master' 2013-12-14 02:33:08 +00:00
Kevin Cozens
957449e62c ParseNotecardToList() returned data past end of notecard text (mantis #6881). 2013-12-14 02:25:28 +00:00
Justin Clark-Casey (justincc)
ee163b5751 Merge branch 'justincc-master' 2013-12-14 02:23:12 +00:00
Justin Clark-Casey (justincc)
e7a294e739 Wrap analysis of the particle system in the UUID Gatherer in a separate try/catch as sometimes it appears that this can be corrupt.
As per Oren's suggestion.
2013-12-14 01:48:03 +00:00
Justin Clark-Casey (justincc)
996a6c2eea After previous discussion, put eye-catcher 'SCRIPT READY' messages to console rather than log as warning
The problem with logging at warn is that these aren't actually warnings, and so are false positives to scripts that monitor for problems.
Ideally, log4net would have a separate "status" logging level, but currently we will compromise by putting them to console, as they are user-oriented
2013-12-14 01:34:28 +00:00
Eva Comaroski
63ccc3dbf5 Convert if-blocks to return statements in small functions such as GetStartParameter(). 2013-12-14 01:20:24 +00:00
Justin Clark-Casey (justincc)
bf826699a5 Merge branch 'justincc-master' 2013-12-14 01:13:17 +00:00
Justin Clark-Casey (justincc)
d656ec2a07 Make WindParamSet success a console message rather than a log message.
This effectively disables the log message as requested by http://opensimulator.org/mantis/view.php?id=6890
2013-12-14 01:07:37 +00:00
Justin Clark-Casey (justincc)
5ddd818238 minor: Make wind console commands print out to console rather than log 2013-12-14 00:50:06 +00:00
Justin Clark-Casey (justincc)
bcb8c4068e Comment out sit position checks in TestSitAndStandWithSitTarget() in SP and NPC tests until positions are known to be stable.
Also resolve issues with NoSitTarget() tests where I was trying to use a destroyed PhysActor
2013-12-14 00:36:25 +00:00
Justin Clark-Casey (justincc)
d2d4ae541b Fix build break in test from previous commit 54cc229 - hadn't realized ScenePresence inst var name was slightly different 2013-12-14 00:19:04 +00:00
Justin Clark-Casey (justincc)
54cc229768 Fix TestSitAndStandWithNoSitTarget NPC and SP tests.
These stopped working because current code calculates sit heights based on avatar physics rather than appearance data.
Also changed BasicPhysics to not divide Z param of all set sizes by 2 - there's no obvious good reason for this and basicphysics is only used in tests
2013-12-14 00:10:32 +00:00
Justin Clark-Casey (justincc)
11f177d6a8 Eliminate unnecessary line from my previous commit 1d605642 2013-12-13 23:30:08 +00:00
Justin Clark-Casey (justincc)
1d605642f7 Refix sitting on child prims by reinserting relevant code back into SP.HandleAgentSit() 2013-12-11 23:59:52 +00:00
Melanie
82ebb86d58 Replace proprietary file header with BSD one 2013-12-11 01:51:57 +00:00
Melanie
92aad6f1bb Add missing files *blush* 2013-12-11 01:44:03 +00:00
Melanie
5b73b9c4a8 Committing the Avination Scene Presence and related texture code
- Parts of region crossing code
- New bakes handling code
- Bakes now sent from sim to sim without central storage
- Appearance handling changes
- Some changes to sitting
- A number of unrelated fixes and improvements
2013-12-11 01:39:56 +00:00
Melanie
3df8990e6f Merge branch 'master' of melanie@opensimulator.org:/var/git/opensim 2013-12-11 00:14:16 +00:00
Melanie
97934e00e6 This is the Avination Entity Transfer Module. Surprisingly, it still compiles
but I don't know if it runs. Will probably crash and burn as the supporting
code isn't there yet.
2013-12-11 00:12:36 +00:00
dahlia
0875050161 Add console utility commands "scale scene" and "translate scene". Note that repeated use of these commands will induce floating point accumulation errors. Please back up your region before using. 2013-12-10 13:57:18 -08:00
dahlia
8f221a3077 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-12-06 16:25:26 -08:00
dahlia
c0380d1bfe apparently mono DeflateStream has no CopyTo method =( 2013-12-06 16:24:44 -08:00
Diva Canto
5047bd7b44 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-12-06 16:02:03 -08:00
Diva Canto
4058e5f709 Fixed misleading comment 2013-12-06 16:01:29 -08:00
dahlia
aba2a44453 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-12-06 15:58:51 -08:00
dahlia
1496de7ce9 use System.IO.Compression.DeflateStream for mesh decompression in an attempt to reduce mesh asset decoding failures 2013-12-06 15:58:19 -08:00
BlueWall
1842388bb4 Add support for user preferences (im via email) 2013-12-06 02:52:13 -05:00
Robert Adams
4eb52eb19e Merge branch 'master' into varregion 2013-12-05 21:07:44 -08:00
BlueWall
04f8fc1ce9 Adding profile partners fix to SQLite and PgSQL drivers 2013-12-05 20:25:28 -05:00
BlueWall
823a175f07 Stop writing partner id to record when updating profile data. This should be changed only by admin in backend. 2013-12-05 20:06:04 -05:00
Fernando Oliveira
9b76a46df0 Reversing back to the row["ColumnName"] case field name. http://opensimulator.org/mantis/view.php?id=6868 2013-12-06 00:41:02 +00:00
Justin Clark-Casey (justincc)
bb4f4d9480 minor: Use enums for setting inv/asset types on data upload rather than magic numbers 2013-12-06 00:38:18 +00:00
Justin Clark-Casey (justincc)
16aaba77d4 Properly set InventoryType.Snapshot when a snapshot is uploaded
Resolves http://opensimulator.org/mantis/view.php?id=6857
This prevents the inventory service complaining later about an attempt to change an invariant
2013-12-06 00:30:44 +00:00
Justin Clark-Casey (justincc)
17b32b764a Fix regression where mouse look flight direction no longer worked by zeroing x/y rot before sending agent updates, instead of before any agent update processing
It turns out that the x/y rot data in mouselook is needed to implement this and to push the avatar against the ground if walking in mouselook.
Doing this in the terse send so that we preserve mouselook rotation information
2013-12-05 02:10:46 +00:00
Justin Clark-Casey (justincc)
62a2d7836f Ignore X and Y body rotations when sent by mouse look.
Fixes http://opensimulator.org/mantis/view.php?id=3274
When not in mouselook, avatar only sends rotations around the Z plane (since that's the only way an avatar can rotate).
However, in mouselook it also sends X and Y information.  But sending X and Y in terse updates causes issues with wrong camera movement in mouselook.
So strip out X and Y components for now.  If this is an issue, then could strip out before sending avatar terse update, though this generates more cpu work.
Thanks to mirceakitsune for suggesting an initial fix
2013-12-03 02:27:40 +00:00
Robert Adams
31bacfbb63 Merge branch 'master' into varregion 2013-12-01 15:51:42 -08:00
Robert Adams
6cd0d7a62b varregion: Add MaxRegionSize constant and enforce in RegionInfo.
Intermediate checkin of changing border cross computation from checking
boundry limits to requests to GridService. Not totally functional.
2013-11-30 15:28:39 -08:00
Justin Clark-Casey (justincc)
8ebad90800 Actually use the SP.AgentControlStopSlowWhilstMoving parameter intoroduced for slow walk/run in 4cfe02a rather than the magic number 2013-11-30 01:56:46 +00:00
Justin Clark-Casey (justincc)
96018afab4 Remove unused SP.Updated flag, which appears unused for many years and was only set true once and never reset 2013-11-30 01:52:45 +00:00
Justin Clark-Casey (justincc)
4cde02a2a3 Implement most effects of AGENT_CONTROL_STOP
AGENT_CONTROL_STOP is specified to SP.HandleAgentUpdate if the user holds down the space bar on a viewer.
For a stopped avatar, this prevents fly or walk/run (though not rotate) until released.
For a walking/running avatar, this reduces movement to half speed.
For a flying avatar, this stops the avatar.
These are observed behaviours on the LL grid - there was no previous OpenSimulator implementation
This commit introduces an optional parameter to SP.AddNewMovement(), which means that it will no longer compile on .NET 3.5 or earlier versions of Mono than 2.8
Currently, this does not work for jumping, and if used whilst flying the avatar continues the fly animation even though it does not move
2013-11-30 01:44:30 +00:00
Justin Clark-Casey (justincc)
4bd4f1cd83 Remove nudgehack from SP.HandleAgentUpdate by making MovementFlag a uint rather than a byte 2013-11-30 01:14:12 +00:00
Justin Clark-Casey (justincc)
8b3a4367ea Still send CameraEyeOffset in UDP SendSitReponse even if at offset is Vector3.Zero 2013-11-29 02:51:35 +00:00
Justin Clark-Casey (justincc)
5f0e763062 Remove unused sp.ParentPosition, which has not been used for some time 2013-11-29 02:48:59 +00:00
Justin Clark-Casey (justincc)
84bfde3bdf Comment out debug sit message accidently left active 2013-11-29 02:45:14 +00:00
Justin Clark-Casey (justincc)
ca079c378a Merge branch 'link-sitting' 2013-11-29 02:41:32 +00:00
Justin Clark-Casey (justincc)
868c0c2746 Fix regression where sitting on ground stopped working.
This was due to the PhysicsActor no longer being recreated on stand from ground.
2013-11-29 01:56:49 +00:00
Justin Clark-Casey (justincc)
f9193e3c51 Restore SP.AbsolutePosition to properly return actual absolute position when sitting 2013-11-29 01:50:12 +00:00
Justin Clark-Casey (justincc)
a64377149d Add parameter checking for land_collision, land_collision_start and land_collision_end lsl events
Wrong number of parmeters now generates syntax error on compile, as seen on LL grid
2013-11-29 00:44:53 +00:00
Robert Adams
109136c074 varregion: add ITerrainChannel.GetHeightAtXYZ() for eventual mesh terrain.
Implementation of same in TerrainChannel.cs.
Check for bounds in TerrainChannel[x,y] to prevent array access exceptions.
2013-11-28 08:22:41 -08:00
Robert Adams
7aa00632b9 varregion: many replacements of in-place arithmetic with calls to
the Util functions for converting world addresses to region addresses
and converting region handles to locations.
2013-11-28 08:20:16 -08:00
Justin Clark-Casey (justincc)
b8dd203378 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-28 00:23:58 +00:00
Justin Clark-Casey (justincc)
13017034b1 minor: Change ProfileServiceURL reference in OpenSim.ini.example to be consistent 2013-11-28 00:23:27 +00:00
Mic Bowman
73dadef8df Change the log level for the LOGIN DISABLED and LOGIN ENABLED messages is
the RegionReady module to be warn so that the message will show up in the
log for simulators running in a more production mode (knowing when logins
are functional is useful).
2013-11-27 12:01:09 -08:00
dahlia
e52a8d388f "rotate scene" command now uses Constants.RegionSize / 2 to pick the center of rotation and center can be optionally overridden in the command line 2013-11-26 21:07:37 -08:00
Justin Clark-Casey (justincc)
0785210e29 Fix stand positions rather than having the stand jump to the root prim. 2013-11-27 02:08:22 +00:00
dahlia
5a9ec0748b add a "rotate scene" console command. Seems to work for prims/sculpts/mesh but not for foliage, don't know why. Also doesn't work on terrain. Successive use of this command will likely introduce floating point error accumulation. Back up your region before using it :) 2013-11-26 17:18:44 -08:00
Justin Clark-Casey (justincc)
a3c72dafe6 Only translate linked prim specified offset pos by the link prim rotation, not any specified avatar rotation as well.
Don't translate root prim position by avatar rotation.
2013-11-26 01:40:55 +00:00
Justin Clark-Casey (justincc)
36d146bf27 fix position changes when sitting on a prim with position and/or orientation explicitly specified 2013-11-26 00:43:35 +00:00
Fernando Oliveira
0ad45531a1 Corrected case to get columns from Regions table from PostgreSQL http://opensimulator.org/mantis/view.php?id=6865
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2013-11-25 18:33:49 -05:00
Robert Adams
3193bcaae1 Merge branch 'master' into varregion 2013-11-24 07:23:12 -08:00
Justin Clark-Casey (justincc)
60e049ea39 Revert "Fix issue where sitting on non-root linked prims would send camera to wrong position in third-person and mouselook"
Reverting to place on separate branch

This reverts commit ff4e7de776.
2013-11-23 02:31:39 +00:00
Justin Clark-Casey (justincc)
1999b218fd Revert "Add line accidentally left out of recent non-root prim sit fix"
Reverting to place on new branch

This reverts commit ed1029712a.
2013-11-23 02:31:17 +00:00
Justin Clark-Casey (justincc)
a68d1fad73 Revert "Still send CameraEyeOffset in UDP SendSitReponse even if at offset is Vector3.Zero"
This reverts commit 9bdd3dc7de.
2013-11-23 02:29:14 +00:00
Justin Clark-Casey (justincc)
eb172be541 Revert "Fix non-root prim sit positions for prims where a sit target has been specified as well."
Revert to place on separate branch for now

This reverts commit 70e651a8d1.
2013-11-23 02:28:30 +00:00
Justin Clark-Casey (justincc)
910f07dffa Revert "Refix fix for sitting on non-root linked prims with explicit sit targets."
This reverts commit 78649eb099.
2013-11-23 02:27:26 +00:00
Justin Clark-Casey (justincc)
5aa3236ebe Revert "fix avatar rotation when sitting on a linked part"
Reverting for now to place on separate branch

This reverts commit 65304260af.
2013-11-23 02:27:03 +00:00
Justin Clark-Casey (justincc)
b9e42aeb6e Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-23 02:09:54 +00:00
Justin Clark-Casey (justincc)
65304260af fix avatar rotation when sitting on a linked part
Need to take into account rotation of linked prim now that we are always specifying sits wrt the root prim
2013-11-23 02:09:03 +00:00
Fernando Oliveira
f3f3d390f7 Fixed the update StoreRegionWindlightSettings() wasn't updating regionwindlight table, raising PrimaryKey violation;
Signed-off-by: Fernando Oliveira <fernando@oliveira.eti.br>
Signed-off-by: Michael Cerquoni <nebadon2025@gmail.com>
2013-11-22 20:48:12 -05:00
Justin Clark-Casey (justincc)
8217b52d3a Remove old *.exe.config files that related to programs that have long been deleted or renamed 2013-11-23 01:40:48 +00:00
Justin Clark-Casey (justincc)
78649eb099 Refix fix for sitting on non-root linked prims with explicit sit targets.
I forgot that m_post is being set inconsistently between non-explicit and explicit ragets
2013-11-23 01:35:08 +00:00
Justin Clark-Casey (justincc)
70e651a8d1 Fix non-root prim sit positions for prims where a sit target has been specified as well. 2013-11-23 01:32:29 +00:00
Justin Clark-Casey (justincc)
bd5c414618 Stop .NET 4 complaining on Windows when it tries to load in DLLs that haven't been marked as trusted in the operating system.
This is done by adding <loadFromRemoteSources enabled="true" /> to the execute *.config files.
This tells .NET 4 to trust the DLLs, which is safe in our case since we are not loading DLLs from locations that untrusted users may specify
Addresses http://opensimulator.org/mantis/view.php?id=6853 and http://opensimulator.org/mantis/view.php?id=6846
As far as I know, CAS policy checks have never been performed in Mono
2013-11-23 01:29:55 +00:00
Justin Clark-Casey (justincc)
ed1029712a Add line accidentally left out of recent non-root prim sit fix
Original commit is ff4e7de7
2013-11-23 01:18:07 +00:00
Justin Clark-Casey (justincc)
9bdd3dc7de Still send CameraEyeOffset in UDP SendSitReponse even if at offset is Vector3.Zero
As far as I can see it's valid to change the eye offset even if you aren't changing the at target.
2013-11-23 01:12:20 +00:00
Justin Clark-Casey (justincc)
9f4a548a49 Fix false positive test failure in TestRepeatSameDrawContainingImageReusingTexture() and TestRepeatSameDrawContainingImage() if localhost has a webserver set up.
Use 0.0.0.0 instead of localhost
2013-11-23 01:04:31 +00:00
Justin Clark-Casey (justincc)
ff4e7de776 Fix issue where sitting on non-root linked prims would send camera to wrong position in third-person and mouselook
We now specify sits as offsets from the root prim, as the viewer expects.
2013-11-23 00:53:09 +00:00
Eva Comaroski
c896b4179e Added admin_authenticate_user command 2013-11-20 00:09:32 +00:00
Justin Clark-Casey (justincc)
b44c69807d Fix bug where "show modules" would accidentally list all the shared modules again as "non-shared"
Addresses http://opensimulator.org/mantis/view.php?id=6860
2013-11-19 23:53:15 +00:00
Justin Clark-Casey (justincc)
f9984a9685 rename private field ACD.ViewerInternal to m_viewerInternal in line with conventions used elsewhere in code 2013-11-19 23:39:52 +00:00
Justin Clark-Casey (justincc)
b71952df49 Stop AgentCircuitData.Viewer.get() from throwing an error if no Viewer has been set.
Continue to return null instead.
2013-11-19 23:36:44 +00:00
Latif Khalifa
9ba5a7e190 Normalize viewer version string to accomodate new style version reporting in the viewers 2013-11-19 23:29:10 +00:00
Justin Clark-Casey (justincc)
f94d07f2e2 Add regression test to check that specifying a non-existent event raise a syntax error
This was the case before any of the recent changes
2013-11-16 03:02:57 +00:00
Justin Clark-Casey (justincc)
79c1ed8cb9 Add syntax checking for no_sensor() no-arg event 2013-11-16 03:00:03 +00:00
Justin Clark-Casey (justincc)
ec4d96acc9 refactor common code out of no argument LSL event regression tests 2013-11-16 02:58:06 +00:00
Justin Clark-Casey (justincc)
edd7e19463 If anything other than a single integer is specified for events that only take a single integer, generate a syntax error on LSL script compile rather than an exception later on.
This applies to events changed, collision, collision_start, collision_end, on_rez, run_time_permissions, sensor, touch, touch_start, touch_end
2013-11-16 02:50:14 +00:00
Justin Clark-Casey (justincc)
62006baaef Make state_exit, moving_end, moving_start, not_at_rot_target, not_at_target and timer LSL events generate a syntax error if inappropriately given arguments.
This matches behaviour seen on the LL grid and a previous change for state_entry.
These are all the events which should take no arguments
2013-11-16 01:30:23 +00:00
Justin Clark-Casey (justincc)
d728c1beb2 refactor LSL_EventTests.TestStateEntryEvent into single method to test compile 2013-11-16 01:25:25 +00:00
Justin Clark-Casey (justincc)
b58a474105 Ignore *.suo and *.user as these are user specific preference files from Visual Studio
http://stackoverflow.com/questions/72298/should-i-add-the-visual-studio-suo-and-user-files-to-source-control
2013-11-16 00:21:12 +00:00
Justin Clark-Casey (justincc)
92fbe675b5 minor: Add OpenSim.v11.suo to .gitignore file.
This is generated if a vs2010 OpenSim.sln is loaded into vs2012
As per http://opensimulator.org/mantis/view.php?id=6839
2013-11-16 00:05:49 +00:00
Justin Clark-Casey (justincc)
ecfb78dd16 minor: Use default(UUID) in rez attachment failure error logging rather than (UUID)null
Patch from http://opensimulator.org/mantis/view.php?id=6843
Thanks Kira.
2013-11-15 23:16:12 +00:00
Justin Clark-Casey (justincc)
346644016c If HGSuitcaseInventoryService.GetRootFolder() fails to create a suitcase folder when required, then don't try to store the null and perform other operations on it.
Patch from http://opensimulator.org/mantis/view.php?id=6844
Thanks Kira.
2013-11-15 23:10:59 +00:00
Robert Adams
604b39cea9 Merge branch 'master' into varregion 2013-11-15 14:56:13 -08:00
Justin Clark-Casey (justincc)
0595974a89 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-15 22:48:58 +00:00
dahlia
f63fd81a68 update libomv to 1538d3088e79ff0a9abea6905b487755b6890a85 in hope that it fixes some bulletsim issues on linux 2013-11-15 14:40:38 -08:00
Justin Clark-Casey (justincc)
7cab41f422 refactor: replace verbose checks with String.IsNullOrEmpty where applicable.
Thanks to Kira for this patch from http://opensimulator.org/mantis/view.php?id=6845
2013-11-15 21:45:08 +00:00
Justin Clark-Casey (justincc)
b4932bda2a If a local land ID is given to the "land show" command, then output to console the full details of that parcel.
Using "land show" without a land ID still outputs a summary of parcels in the region
2013-11-15 00:16:33 +00:00
Robert Adams
d67236c09d Merge branch 'master' into varregion 2013-11-13 16:10:25 -08:00
Justin Clark-Casey (justincc)
8114ae0f8b Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-13 23:27:25 +00:00
Justin Clark-Casey (justincc)
7da10850b0 Fix bug where removing a physical linkset would only decrement the Active Objects statistic by 1 instead of by the number of prims removed.
Unlike LL, OpenSimulator currently uses this stat to record the number of prims in the physics simulation, even when they are at rest.
Added regression test for this case.
2013-11-13 23:25:54 +00:00
justincc
869a23e223 Update OpenSim.32BitLaunch.exe and Robust.32BitLaunch.exe to .NET 4 versions.
Also fixes some issues in associated solution files
2013-11-13 01:07:14 +00:00
Justin Clark-Casey (justincc)
d71ebb7ec8 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-13 00:27:05 +00:00
Justin Clark-Casey (justincc)
4563e7e04a Get runprebuild.sh to generate a vs2010 for xbuild to work with .NET 4 rather than vs2008
At least since 2009, Monodevelop has been able to load vs2010 files as well
2013-11-13 00:25:41 +00:00
justincc
0f16612400 Fix runprebuild.bat on Windows 7 systems and later
MS changed Windows 7 "reg query" command to spit out fewer lines in its preamble
Annoyingly there is no option to print raw values and not this preamble.
So now using the Windows find command.
But this has the side effect of stopping this working with Cygwin as it uses its own GNU find command.
Might fix in the future but not simple since Windows find itself is in different locations
2013-11-13 00:00:55 +00:00
Robert Adams
e2a1fa806d varregion: extend TerrainModule to use the region size from RegionInfo
rather than using Constants.RegionSize. This allows loading and saving
of terrain heightmaps that match the size of non-legacy sized regions.
2013-11-10 21:12:17 -08:00
Robert Adams
c12e68e34d varregion: fix GetLandObject error return and initialization of square
land object bitmaps. This fixes creation of child presences and the
editing of parcels.
Also lots of commented out debugging messages.
2013-11-10 19:52:31 -08:00
Robert Adams
7061784cc6 Merge branch 'master' into varregion 2013-11-08 20:55:28 -08:00
Robert Adams
beeec1c467 varregion: elimination of Constants.RegionSize from all over OpenSimulator.
Routines in Util to compute region world coordinates from region coordinates
as well as the conversion to and from region handles. These routines have
replaced a lot of math scattered throughout the simulator.
Should be no functional changes.
2013-11-08 20:53:37 -08:00
Robert Adams
a7a837550e varregion: Massive work to LandManagementModule and LandObject to
handle variable sized regions. Many changes for both the region and parcels.
Most of the constant "4" (for the 4x4 parcel units) have been replaced
with symbols and math.
2013-11-08 20:51:09 -08:00
Justin Clark-Casey (justincc)
fd24147afa Add initial test for checking that specifying a parameter in LSL state_entry() generates a syntax error.
Same for other events to follow at a later date.
2013-11-09 00:36:05 +00:00
Justin Clark-Casey (justincc)
9a9abd37eb minor: remove the bit left in the readme which said .net 3.5 framework was required 2013-11-08 23:16:09 +00:00
Justin Clark-Casey (justincc)
ea9e96dd50 Update OpenSimulator to use .NET 4.0
This allows region modules to register script functions that have more than a couple of arguments.
It also allows OpenSimulator code to use the feature and syntax additions that came with .NET 4.0
Windows users will need to install Microsoft .NET 4 framework if they have not done so already.
Windows C# Express 2010 also becomes the minimum IDE for build, so runprebuild.bat now generates a 2010 solution and runprebuild2010.bat goes away
Official minimum mono version becomes 2.10.8.1.  OpenSimulator will probably work with 2.8 later but this is not guaranteed.
2013-11-08 21:13:05 +00:00
Justin Clark-Casey (justincc)
626a050159 minor: Make PID file example in Robust.HG.ini more meaningful as is now the case in OpenSim and vanilla ROBUST config files 2013-11-08 00:34:35 +00:00
Justin Clark-Casey (justincc)
5cef8bf64e Make admin_save_oar request submit a request ID and log this for tracking.
Previous behaviour of always logging 'name' is unhelpful since this actually an error message parameter which is only filled out if an error has occurred
2013-11-08 00:31:26 +00:00
dahlia
3b2721c957 update OpenMetaverse.dll to 7ae74674a09877119cbb4c80cbffea474e20da29
- addresses particle flags issue
2013-11-06 19:13:41 -08:00
Justin Clark-Casey (justincc)
52ff860f30 minor: Make PID file examples in OpenSim and Robust config somewhat more meaningful than just /tmp/my.pid 2013-11-06 23:27:19 +00:00
Robert Adams
f7bd0da026 Merge branch 'master' into varregion 2013-11-06 06:32:11 -08:00
dahlia
0b4577d5b0 add support for particle glow LSL functions 2013-11-05 23:48:44 -08:00
dahlia
709814c194 add support for particle blending LSL functions 2013-11-05 23:38:43 -08:00
dahlia
e1ce3907f2 Update libomv to 7e260ad419ebb1c24a5f1b123e11dd930e05f414. Thanks lkalif :) 2013-11-05 23:01:14 -08:00
dahlia
cd33972ed1 trigger a build to see if tests will work 2013-11-05 22:04:39 -08:00
Robert Adams
a75ce7423c Merge branch 'master' into varregion 2013-11-05 21:42:27 -08:00
Robert Adams
d0854e4ace varregion: properly sense size of terrain heightmap and store as
compressed 2D database blob if a varregion.
2013-11-05 21:33:02 -08:00
Latif Khalifa
26fd29622d Added sending (for now hard-coded) sim isze in SendMapBlockSplit() 2013-11-06 03:52:04 +01:00
Latif Khalifa
417836ac5e Updated libomv to 25ee208a 2013-11-05 2013-11-06 02:43:44 +01:00
Justin Clark-Casey (justincc)
8e1bf55e7b Add IncomingPacketsResentCount clientstack statistics
This records how many packets were indicated to be resends by clients
Not 100% reliable since clients can lie about resends, but usually would indicate if clients are not receiving UDP acks at all or in a manner they consider timely.
2013-11-06 01:02:20 +00:00
Justin Clark-Casey (justincc)
caf2abe311 Record individual region bot disconnects in pCampbot log 2013-11-05 23:32:26 +00:00
Justin Clark-Casey (justincc)
fb23f78928 minor: comment out "SetLastPosition" GridUserService debug message for now. 2013-11-05 23:18:09 +00:00
Justin Clark-Casey (justincc)
2d315ec207 Fix a race condition where pCampbot actions could continue even if a bot had disconnected. 2013-11-05 20:58:52 +00:00
Robert Adams
c931b16c1f Merge branch 'master' into varregion 2013-11-04 22:12:57 -08:00
Robert Adams
f2810bf03a varregion: add plumbing to pass region size from Scene down to the
physics engine.
Older physics engines will default to the legacy region size.
Update BulletSim to use the new region size information.
2013-11-04 22:10:54 -08:00
Robert Adams
cd1a23fc14 varregion: remove uses of region size constant. In particular, update scene
to check for border crossings based on the size of the region.
2013-11-04 22:09:52 -08:00
Robert Adams
ac94dc8a14 varregion: remove unused terrain serialization code in SQLite and PGSQL modules 2013-11-04 22:06:20 -08:00
Robert Adams
9bf363e9be varregion: send the proper terrain patch layer code for large terrain.
Code cleanups.
2013-11-03 08:14:51 -08:00
Robert Adams
79b031bd0c varregion: send region size in LLLoginResponse. 2013-11-02 15:42:26 -07:00
Robert Adams
6df7d4219d varregion: add linkage for region size in creations and conversions
of GridRegion. New variables for size and code to initialize same.
2013-11-02 15:40:48 -07:00
Robert Adams
f66737fe56 varregion: Enforce the configuration of square regions in RegionInfo.cs. 2013-11-02 15:36:16 -07:00
Justin Clark-Casey (justincc)
2b069a3b1e If the LSL state_entry() event definition contains any parameters, then generate syntax error as seen on the LL grid
This is done through the parser and so generates the same syntax error message if any parameters are wrongly specified for this event.
We were already enforcing event names in the parser.
This is only for state_entry so far as an initial test of the approach - appears to work correctly.
2013-11-02 00:39:12 +00:00
Robert Adams
92c06a5d0b varregion: fix lawn-mower terrain fill so it works for non-square regions.
Add some debugging logs on region creation to report region size.
2013-11-01 16:37:27 -07:00
Robert Adams
976530569a varregion: enforce multiple of 256 for region size when parameters fetched from user.
Output info and warning messages for non-legacy region sizes.
2013-11-01 16:06:19 -07:00
dahlia
7faf286d00 add null check for jpeg2000 sculpt image decode failure. Note: the j2kDecodeCache folder should be cleared after updating to this revision so that sculpts containing alpha can be re-decoded and successfully meshed. 2013-11-01 13:45:09 -07:00
Robert Adams
ff5885ab23 varregion: push TerrainData implementation up and down the database storage stack.
Implement both LoadTerrain and StoreTerrain for all DBs.
Move all database blob serialization/deserialization into TerrainData.
2013-11-01 11:35:31 -07:00
dahlia
ce94f990bb Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-01 01:42:43 -07:00
dahlia
f4ded3af63 discard alpha in 4-plane sculpt textures before generating physics proxy mesh 2013-11-01 01:40:56 -07:00
Justin Clark-Casey (justincc)
db32e5d304 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-11-01 02:05:12 +00:00
Justin Clark-Casey (justincc)
c6395240f0 For individual bots, seed random number generator with a random number from BotManager rather than Environment.Tickcount
Otherwise, since bots are now created all at once, a bunch will get exactly the same tickcount and hence number sequences
2013-11-01 02:04:04 +00:00
dahlia
cc73ef4eb9 add new particle system blending rule enumerations 2013-10-31 17:49:01 -07:00
Justin Clark-Casey (justincc)
cc7065f9ee minor: change "bot" pCampBot help cateogry to "Bots" 2013-11-01 00:04:18 +00:00
Justin Clark-Casey (justincc)
4c4a1cf715 Start counting resent packets in the places that I missed when the stat was first added a few commits ago 2013-10-31 23:59:22 +00:00
Justin Clark-Casey (justincc)
50794c9008 minor: remove mono compiler warnings in AvatarPickerSearchModule and UploadBakedTextureModule 2013-10-31 23:51:01 +00:00
Justin Clark-Casey (justincc)
3d5a7e9b19 Add OutgoingPacketsResentCount clientstack stat.
This allows one to monitor the total number of messages resent to clients over time.
A constantly increasing stat may indicate a general server network or overloading issue if a fairly high proportion of packets sent
A smaller constantly increasing stat may indicate a problem with a particular client-server connection, would need to check "show queues" in this case.
2013-10-31 23:45:52 +00:00
Justin Clark-Casey (justincc)
b7c57294cc Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-10-31 23:45:19 +00:00
dahlia
eb52d346c0 add new LSL constants associated with new "ribbon", "glow", and "blend" particle system functionality. Note that this does *not* complete required server side changes for implementing the new particle system 2013-10-31 16:13:03 -07:00
Justin Clark-Casey (justincc)
0e07fad2e1 minor: update pCampbot usage/help statement 2013-10-31 20:19:57 +00:00
Robert Adams
39777db8ef varregion: fix problem of X/Y dimensions swapped and incorrect terrain
compression base computation.
Complete replacement of float[] for terrain heightmap with TerrainData instance.
2013-10-31 09:24:06 -07:00
dahlia
46a4c32e27 update libomv to 5b4c1e8694479629f7cacd72dd6bc39a6b327f9c (git master as of time of this commit) 2013-10-30 22:01:34 -07:00
Justin Clark-Casey (justincc)
fdd1c63c3c Make "fcache status" command also display information on disk/mem cache hit rate that is currently only displayed if LogLevel >=1 in [AssetCache] config 2013-10-30 18:57:51 +00:00
Justin Clark-Casey (justincc)
28f36d8db5 Put fcache commands output to console, not log 2013-10-30 18:32:53 +00:00
Justin Clark-Casey (justincc)
edaf0a98d6 Give the caller AddMapTile a valid reason response if this failed due to blank response from server or connection failure.
Raise log lines which indicate problems to warning from debug
2013-10-29 23:37:22 +00:00
Justin Clark-Casey (justincc)
26c2d9e627 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-10-28 23:48:43 +00:00
Justin Clark-Casey (justincc)
39de7614ec Remove legacy sqlite lines added internally by OpenSimulator to the [Startup] section.
These are long unused but confusingly will be seen in the [Startup] section on a "config save".
2013-10-28 18:03:34 +00:00
Robert Adams
2be0347f50 Merge branch 'master' into varregion 2013-10-28 09:30:26 -07:00
Robert Adams
d23ef79f98 BulletSim: restore collision flags when clear collision cache.
THis fixes the extranious addition of objects to the collision cache
which created extra CPU overhead.
2013-10-26 21:30:51 -07:00
Robert Adams
93d5d66fbd BulletSim: update collision flags to make sure they fit in the shorts provided. 2013-10-26 21:20:19 -07:00
Justin Clark-Casey (justincc)
5be8f6632b minor: Fix commented out GridInfo service URL to be 8002 in Robust.ini.example rather than 9000 (already done in Robust.HG.ini.example) 2013-10-25 00:54:33 +01:00
Justin Clark-Casey (justincc)
df76e52310 minor: Add commented out code for apparent passing of texture IDs in ObjectProperties UDP replies to viewer
Not yet shown that this is used or resolves a bug where not all textures appear on objects with an "XML with textures" upload from singularity 1.8.3
Proper texture entries are actually present and appear properly on relog, but not on select from viewer until at least one face texture is changed.
2013-10-24 23:00:02 +01:00
Justin Clark-Casey (justincc)
31989bd51e Show texture ids for full object/part info console commmds 2013-10-24 21:29:57 +01:00
Justin Clark-Casey (justincc)
cccdfcb59e Comment out LLUDPServer.BroadcastPacket() to reduce code complexity. Appears to be a never used method. 2013-10-24 00:37:49 +01:00
Justin Clark-Casey (justincc)
5d61c4039d Only set the data present event if we actually queued an outoing packet (not if we sent immediately) 2013-10-24 00:33:14 +01:00
Robert Adams
511122834b BulletSim: change collision flags for groundplane to not interact with static objects.
Reorder collision flag setting code for terrain to fit pattern used elsewhere.
2013-10-23 16:07:03 -07:00
Justin Clark-Casey (justincc)
4830431eb0 Add current .NET windows framework requirement to README. 2013-10-22 01:02:40 +01:00
Robert Adams
a7e7bed660 BulletSim: update SOs and DLLs with version that enables compressed
AABB maps for Bvh meshes. This greatly reduces the memory usage for
large meshes and for mesh terrain in particular.
2013-10-19 11:44:27 -07:00
Kevin Cozens
84a149ecbf Call ScriptSleep() instead of llSleep() in routine for llEmail.
Signed-off-by: teravus <teravus@gmail.com>
2013-10-18 14:30:05 -05:00
Robert Adams
571a75f934 BulletSim: update lib32/libBulletSim.dylib to current BulletSim C++ API. 2013-10-18 09:15:08 -07:00
Oren Hurvitz
0094971186 After finishing to edit an attachment, let other avatars see the changes. (The changes weren't visible before because updates to attachments aren't sent while the attachment is selected.) 2013-10-17 23:10:16 +01:00
Justin Clark-Casey (justincc)
1bd89ac287 Readding Mono.Security.dll. This comes from http://pgfoundry.org/frs/download.php/3354/Npgsql2.0.12.0-bin-ms.net3.5sp1.zip
This is identical to what was previously there but need to record origin information
2013-10-17 22:31:15 +01:00
Justin Clark-Casey (justincc)
6221356712 Removing Mono.Security.dll temporarily so that it can be re-added with origin information 2013-10-17 22:28:58 +01:00
Fernando Oliveira
67ffb64764 Corrected estateID to EstateID on getEstates function at PGSQLEstateData.cs 2013-10-16 21:58:22 -05:00
Fernando Oliveira
f83343d302 * One More thing, add an appdomain data element to ensure that we don't duplicate the assembly resolving. 2013-10-16 21:20:11 -05:00
Fernando Oliveira
8fdf70b87e * Fixes mantis mantis 0006803 [PGSQL] - Simulator crashes - Mono.Security.dll missing. The root of the issue is that the Postgres driver relies on Mono.Security.dll from the mono project. Unfortunately, when using Mono, including the dll in the distribution causes conflicts. This solution puts Mono.Security.dll in bin/lib/NET/ and, if windows .NET is the runtime, informs the assembly loader to load bin/lib/NET/Mono.Security.dll when .NET is scanning for the Mono.Security namespace. On Mono, the included Mono.Security assembly is ignored. 2013-10-16 20:16:29 -05:00
Robert Adams
c581506058 varregion: update PGSQL driver for storing variable terrain size blobs. 2013-10-16 08:13:06 -07:00
Robert Adams
8937a2244d Merge branch 'master' into varregion 2013-10-16 07:53:44 -07:00
Robert Adams
97bc5263de varregion: move the compressed heighmap compression factor from
Constants into TerrainData.
Save compression factor with the terrain blob in the database.
2013-10-16 07:52:30 -07:00
Robert Adams
766a31431e BulletSim: implement the SL bug where VEHICLE_HOVER_UP_ONLY disables
the vehicle buoyancy if the vehicle is above its hover height.

This is a known misfeature of this vehicle flag which has been accepted
since it would break too many implementations. The problem is noticed
when creating a jetski-like vehicle that jumps over sand bars. A boat
normally is configured with neutral buoyancy and hovering at water
height. When it jumps the sandbar, it needs to have gravity applied
to get back to water level.
2013-10-15 17:02:22 -07:00
Oren Hurvitz
d0c1780839 Fixed rezzing coalesced objects from a prim's inventory
Previously only the first object in the Coalesced Object was rezzed. Now all the objects are rezzed.
2013-10-15 23:59:16 +01:00
Justin Clark-Casey (justincc)
acfe603a5f As discussed on many previous occasions, switch the default physics engine in OpenSimulator from OpenDynamicsEngine to BulletSim.
The BulletSim plugin is higher performance and has a better implementation of vehicles amongst other things.
Many thanks to Robert Adams for making this possible with the enormous amount of work that he has done on this plugin.
If you want to continue using ODE, set physics = OpenDynamicsEngine in the [Startup] section of OpenSim.ini
2013-10-15 23:24:49 +01:00
Justin Clark-Casey (justincc)
d82d6bb1ec Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-10-15 23:18:50 +01:00
Kevin Cozens
5ca7395e17 Added support for attachments to group notices when using Flotsam groups. 2013-10-15 23:07:49 +01:00
fernando
3e1ca2bd21 * Fixes mantis #6802 Simulator crashes whist loading (lighshare enabled)
* Please test
2013-10-15 11:55:08 -05:00
Oren Hurvitz
f106ba87ca Made terrain uploads thread-safe 2013-10-15 00:12:56 +01:00
Justin Clark-Casey (justincc)
a27c2432bb This is Npgsql2.0.12.0-bin-ms-net3.5sp1
From http://pgfoundry.org/frs/download.php/3354/Npgsql2.0.12.0-bin-ms.net3.5sp1.zip
This is identical to the version added in ff8a7682, removed and readded to check and record version
2013-10-14 23:59:49 +01:00
Justin Clark-Casey (justincc)
dbdcf2d995 Remove to re-add with version information for future reference 2013-10-14 23:58:12 +01:00
Michael Cerquoni
daf44cc65e fix missing " for variable SRV_IMServerURI in example file 2013-10-12 20:47:10 -04:00
Fernando Oliveira
ff8a768258 Fernando Oliveira's Postgress SQL Server Data Connector as a single commit.
* Added PostGreSQL support
* Added MySQL/MySQLXGroupData.cs
* PostgreSQL data access implementation
* PostgreSQL dll binarie and RegionStore.migrations
* Migrations Scripts from MSSQL to POSTGRES
* Postgres SQL Type fixes
* Postgres SQL Connection string
* Data type issues
* more fixes
* tests and +tests
* UUID x string - FIGHT!
* Fixed PG types to internal csharp types
* More data type fix (PostgreSQL fields are case sensitive) :(
* more field case sensitive fixes
* changed the migration files to be case sensitive for fields.
* fixed fields case
* finished converting, now search for hidden bugs.
* some more fixes
* bool type fixed
* more case fixes;
* creatorID case fixed
* case fields fixed
* fixed default now() for TMStamp fields with don't allow nulls.
* fix case sensitve for Region name and Estate name
* fixed case for names for search
* fix class name Error
* Bug fixed on select and migrations
* Un-Reverting my change due to Postgres issue with the ILIKE function
* Fixed some issued for Diva Distro
* Fixes for integration with Diva Distro
* Added System.Core to prebuild.xml for PG project
* Configured to make DIff for Push to OpenSim Project
* Diffs only to PostgreSQL mods.
2013-10-12 16:33:45 -05:00
teravus
2eade55471 * pushing test 2013-10-12 15:06:05 -05:00
Robert Adams
8b5e2f2cd2 BulletSim: Fix snap back from edge of region problem. Mantis 6794. 2013-10-11 13:29:43 -07:00
teravus
75f63ecfcd * Add a session concurrency option per key. Allows developer/config to specify number of concurrent requests on a service. 2013-10-09 22:21:25 -05:00
teravus
e7ea053c4a * Remove a test *cleanup* 2013-10-07 23:52:44 -05:00
teravus
1df58d04b1 * Move the BasicDOSProtector.cs to OpenSim.Framework (all useful classes belong there.....)
* Add an IsBlocked(string Key) method so it can be used more generically.   (think..   if we want to rate limit login failures, we could have a call in the Login Service to IsBlocked(uuid.ToString()) and ignore the connection if it returns true, if IsBlocked returns false, we could run the login information and if the login fails we could run the Process method to count the login failures.
2013-10-07 23:48:24 -05:00
teravus
75fdd6054d * Refactor
* Break out common BasicDOSProtector code into separate class.
2013-10-07 23:19:50 -05:00
teravus
f76cc6036e * Added a Basic DOS protection container/base object for the most common HTTP Server handlers. XMLRPC Handler, GenericHttpHandler and <Various>StreamHandler
* Applied the XmlRpcBasicDOSProtector.cs to the login service as both an example, and good practice.
* Applied the BaseStreamHandlerBasicDOSProtector.cs to the friends service as an example of the DOS Protector on StreamHandlers
* Added CircularBuffer, used for CPU and Memory friendly rate monitoring.
* DosProtector has 2 states, 1. Just Check for blocked users and check general velocity, 2. Track velocity per user,     It only jumps to 2 if it's getting a lot of requests, and state 1 is about as resource friendly as if it wasn't even there.
2013-10-07 21:35:55 -05:00
Robert Adams
86bf79aa2b Merge branch 'master' into varregion 2013-10-07 13:58:17 -07:00
Robert Adams
7416809077 varregion: plug in TerrainData class and modify TerrainModule and LLClientView to use same. This passes a terrain info class around rather than passing a one dimensional array thus allowing variable regions. Update the database storage for variable region sizes. This should be downward compatible (same format for 256x256 regions). 2013-10-07 13:57:40 -07:00
Robert Adams
25ae59b9eb varregion: remove scattered use of Constants.RegionSize by having routines reference RegionInfo.RegionWorldLoc?. 2013-10-07 13:57:30 -07:00
Robert Adams
9b150194f6 varregion: add new TerrainData and TerrainCompressor routines. TerrainCompressor needed to replace the one in libopenmetaverse that doesn't know about the larger terrain packets. 2013-10-07 13:57:16 -07:00
teravus
31246ecd04 * Added a unique and interesting WebSocket grid login processor by hijacking the LLSD login code. This sends the data through the normal login channels and spits out a JSON object back that mimics the login response. Feel free to comment on the best way to set this up as a config option. 2013-10-04 20:53:01 -05:00
teravus
85593d8d25 * Add an initial complete frame timeout to the WebSocket processor to make it easier to write WebSocket service code that is resistant to Denial of Service attacks. 2013-10-04 20:37:59 -05:00
Diva Canto
083eb7679b Added SimulatorFeatures/OpenSimExtras: say-range, whisper-range, shout-range, at the request of Singularity dev Liru-Dargon 2013-10-04 17:32:17 -07:00
Justin Clark-Casey (justincc)
44580e2233 Update an AssmblyVersion property that I missed to 0.8.0 2013-10-04 23:36:28 +01:00
Justin Clark-Casey (justincc)
42bdf44658 Bump OPenSimulator version and assembly versions up to 0.8.0 Dev 2013-10-04 23:33:47 +01:00
Justin Clark-Casey (justincc)
970249a3c7 Add OnChatToNPC and OnInstantMessageToNPC messages to NPCAvatar to allow region modules to directly subscribe to chat and messages received by NPCs
Currently still requires INPC from NPCModule.GetNPC() to be cast to an NPCAvatar.
2013-10-04 19:40:43 +01:00
Robert Adams
8c432c7c9b Merge branch 'varregion' of git://opensimulator.org/git/opensim into varregion 2013-09-28 07:35:30 -07:00
Robert Adams
8c1d80fdfd varregion: serious rework of TerrainChannel:
-- addition of varaible region size in X and Y
    -- internal storage of heightmap changed from double[] to short[]
    -- helper routines for handling internal structure while keeping existing API
    -- to and from XML that adds region size information (for downward compatibility,
        output in the legacy XML format if X and Y are 256)
Updated and commented Constants.RegionSize but didn't change the name for compatibility.
2013-09-28 07:33:56 -07:00
Robert Adams
aea5d3a842 Remove time based terrain storage in SQLite so revision number can be used
to denote terrain format revision.
Add terrain DB format revision codes to ISimulationDataStore.cs.
Setup so legacy compatible terrain storage and fetch is possible while
allowing future format extensions.
2013-09-28 07:33:55 -07:00
Robert Adams
fa1c688342 varregion: go back to using Constants.RegionSize so as not to break
external modules. People shouldn't use it but don't want to cause
too much breakage of legacy modules.
2013-09-28 07:33:54 -07:00
Robert Adams
139639d25e VarRegion: add RegionSize[XYZ] to RegionInfo.cs.
Update RegionInfo parameter and serialization routines to serialize
the region size if it is not the LegacyRegionSize.
2013-09-28 07:33:53 -07:00
Robert Adams
317c04fe17 VarRegion: change RegionInfo storage of region coordinates from region
count number to integer world coordinates.
Added new methods RegionWorldLoc[XY].
Refactored name of 'RegionLoc*' to 'LegacyRegionLoc*' throughout OpenSim.
Kept old 'RegionLoc*' entrypoint to RegionInfo for downward compatability
of external region management packages.
2013-09-28 07:33:52 -07:00
Justin Clark-Casey (justincc)
8996ac1a9c minor: Disable logging left active on regression test TestSameSimulatorIsolatedRegionsV2() 2013-09-27 22:33:42 +01:00
Justin Clark-Casey (justincc)
2cd95fac73 refactor: Rename Scene.AddNewClient() to AddNewAgent() to make it obvious in the code that this is symmetric with CloseAgent() 2013-09-27 22:27:39 +01:00
Justin Clark-Casey (justincc)
b16bc7b01c refactor: rename Scene.IncomingCloseAgent() to CloseAgent() in order to make it clear that all non-clientstack callers should be using this rather than RemoveClient() in order to step through the ScenePresence state machine properly.
Adds IScene.CloseAgent() to replace RemoveClient()
2013-09-27 19:14:21 +01:00
dahlia
b704de9bf8 minor code formatting for the sake of consistency and readability 2013-09-26 16:27:11 -07:00
Justin Clark-Casey (justincc)
585d0800dd minor: Make OpenSimDefaults.ini consistent (spacing and tabs to spaces) 2013-09-27 00:14:40 +01:00
Justin Clark-Casey (justincc)
70b51f12cd minor: Clean up tabbing and spacing issues in OpenSim.ini.example 2013-09-27 00:01:18 +01:00
Justin Clark-Casey (justincc)
d6d82dbd3c minor: correct attachment spelling mistake in log message in HGEntityTransferModule.OnIncomingSceneObject() 2013-09-26 20:13:29 +01:00
Robert Adams
fbc9072a5c varregion: serious rework of TerrainChannel:
-- addition of varaible region size in X and Y
    -- internal storage of heightmap changed from double[] to short[]
    -- helper routines for handling internal structure while keeping existing API
    -- to and from XML that adds region size information (for downward compatibility,
        output in the legacy XML format if X and Y are 256)
Updated and commented Constants.RegionSize but didn't change the name for compatibility.
2013-09-25 17:30:53 -07:00
Robert Adams
7fa64cce7d Remove time based terrain storage in SQLite so revision number can be used
to denote terrain format revision.
Add terrain DB format revision codes to ISimulationDataStore.cs.
Setup so legacy compatible terrain storage and fetch is possible while
allowing future format extensions.
2013-09-25 17:30:51 -07:00
Robert Adams
ab1474b5de varregion: go back to using Constants.RegionSize so as not to break
external modules. People shouldn't use it but don't want to cause
too much breakage of legacy modules.
2013-09-25 17:30:49 -07:00
Robert Adams
0765a83a8c VarRegion: add RegionSize[XYZ] to RegionInfo.cs.
Update RegionInfo parameter and serialization routines to serialize
the region size if it is not the LegacyRegionSize.
2013-09-25 17:30:47 -07:00
Robert Adams
96abbbb6fb VarRegion: change RegionInfo storage of region coordinates from region
count number to integer world coordinates.
Added new methods RegionWorldLoc[XY].
Refactored name of 'RegionLoc*' to 'LegacyRegionLoc*' throughout OpenSim.
Kept old 'RegionLoc*' entrypoint to RegionInfo for downward compatability
of external region management packages.
2013-09-25 17:30:45 -07:00
Justin Clark-Casey (justincc)
e24edada24 minor: Comment out windlight log message about sending scene data for now. 2013-09-26 00:39:32 +01:00
Justin Clark-Casey (justincc)
253f8de8cd minor: Add scene name to baked textures in cache log message 2013-09-26 00:33:50 +01:00
Justin Clark-Casey (justincc)
babfbe8d6d minor: log MaxOutgoingTransferVersion at EntityTransferModule startup 2013-09-26 00:31:33 +01:00
Justin Clark-Casey (justincc)
4664090b34 minor: correct spelling of Initialized in LSC connector version message 2013-09-25 22:59:57 +01:00
Justin Clark-Casey (justincc)
b22c92368f Move adding UUID.Zero -> Unknown User binding to UMM.Init() so that it's also called by HGUserManagementModule 2013-09-25 21:53:38 +01:00
Justin Clark-Casey (justincc)
32ddfc2740 Reinsert client.SceneAgent checks into LLUDPServer.HandleCompleteMovementIntoRegion() to fix race condition regression in commit 7dbc93c (Wed Sep 18 21:41:51 2013 +0100)
This check is necessary to close a race condition where the CompleteAgentMovement processing could proceed when the UseCircuitCode thread had added the client to the client manager but before the ScenePresence had registered to process the CompleteAgentMovement message.
This is most probably why the message appeared to get lost on a proportion of entity transfers.
A better long term solution may be to set the IClientAPI.SceneAgent property before the client is added to the manager.
2013-09-25 18:45:56 +01:00
Justin Clark-Casey (justincc)
732554be04 Reinsert 200ms sleep accidentally removed in commit 7dbc93c (Wed Sep 18 21:41:51 2013 +0100) 2013-09-25 18:29:14 +01:00
Justin Clark-Casey (justincc)
f384a6291e Instead of swallowing any socket begin/end receive exceptions, log them for debugging purposes.
This may reveal why on some teleports with current code, the UseCircuitCode message gets through but CompleteMovement disappears into the ether.
2013-09-25 00:02:17 +01:00
teravus
8de5c29e2c * The last two are the the patch that Aleric wanted pulled from his repo. * Added GregC to CONTRIBUTORS.txt, Aleric was already in there. * There's some controversy, Some people have suggested that this could be stored in dynamic attributes instead of the database.. Melanie was wanting to pull from the avination repo but was asked to wait on committing anything new until the release. The cherry-pick doesn't answer those questions. 2013-09-22 21:34:55 -05:00
Aleric Inglewood
7889e7757a Don't use 'Indented' formatting for RpcXml responses.
(cherry picked from commit 93abcde69043b175071e0bb752538d9730433f1d)
2013-09-22 21:10:01 -05:00
Aleric Inglewood
2dc92e7de1 Preserve attachment point & position when attachment is rezzed in world
Patch taken from
http://opensimulator.org/mantis/view.php?id=4905
originally by Greg C.

Fixed to apply to r/23314 commit
ba9daf849e
(cherry picked from commit 4ff9fbca441110cc2b93edc7286e0e9339e61cbe)
2013-09-22 21:10:01 -05:00
Justin Clark-Casey (justincc)
a37c59b43e minor: Recomment out log message uncommented in previous cbdfe969 2013-09-21 00:40:23 +01:00
Oren Hurvitz
cbdfe96905 When giving items between avatars in different simulators, only add the item to the receiving avatar's inventory once.
When a user gives an item, the user's client sends an InventoryOffered IM message to its simulator. This adds the item to the receiver's inventory. If the receiver isn't in the same simulator then XMLRPC is used to forward the IM to the correct simulator. The bug was that the receiving simulator handled the message by calling OnInstantMessage() again, which added a second copy of the item to the inventory. Instead, the receiving simulator should only notify the avatar that the item was offered.
2013-09-21 00:32:56 +01:00
Justin Clark-Casey (justincc)
4c0ec86176 minor: Add prefix to log message in LureModule 2013-09-21 00:14:57 +01:00
Justin Clark-Casey (justincc)
e2b3b7a2ae minor: Correct minor spelling mistake Reseting -> Resetting in HG Map module log message 2013-09-20 23:42:55 +01:00
Justin Clark-Casey (justincc)
8502517d80 Make UUID.Zero resolve to "Unknown User" in user cache.
This is to avoid massive numbers of 'no user found' logs when user IDs are missing for some reason.
UUID.Zero should not be used for any user ID.
2013-09-20 23:07:24 +01:00
Justin Clark-Casey (justincc)
c01db5fbdd Lock around read/write of ScenePresence.m_originRegionID to make sure that all threads are seeing the latest value and not a cached one.
There is a possibilty that some V2 teleport failures are due to the viewer triggered CompleteMovement thread not seeing the change of m_originRegionID by the UpdateAgent thread.
2013-09-20 22:41:53 +01:00
Justin Clark-Casey (justincc)
c6dea6ee78 Change some message log levels in Scene.IncomingUpdateChildAgent() for debugging purposes 2013-09-20 20:19:44 +01:00
Robert Adams
35a6361b24 BulletSim: reduce avatar walking stopped threshold.
Add parameter for setting the walking stopped threshold.

This fixes the slight jump when an avatar stops walking.
2013-09-20 09:58:45 -07:00
Robert Adams
07d7a5fd76 BulletSim: zero velocity when avatar not moving.
This fixes a movement jitter that happens when an avatar is standing on a
tilted surface.
2013-09-20 09:58:25 -07:00
Justin Clark-Casey (justincc)
c06a9ffe5c Make new regions PG by default instead of Mature.
This makes scripted object sounds and a few other things play by default instead of having to switch the viewer to adult
This reduces the support burden
2013-09-20 00:04:33 +01:00
Oren Hurvitz
f1267730ef UUID Gatherer: find assets used in Light Projection, Particle Systems, and Collision Sounds. 2013-09-19 23:01:06 +01:00
Justin Clark-Casey (justincc)
979b17165b For debug purposes, allow simulators to force use of earlier SIMULATION/0.1 teleport protocol even if SIMULATION/0.2 is available.
This is specified in the MaxOutgoingTransferVersion attribute of [EntityTransfer] in OpenSim.ini, see OpenSimDefaults.ini for more details.
Default remains "SIMULATION/0.2"
Primarily for http://opensimulator.org/mantis/view.php?id=6755
2013-09-19 22:45:50 +01:00
Justin Clark-Casey (justincc)
b6f10780c2 minor: Make SP.MakeRootAgent() private - no external code has any business calling this method 2013-09-19 21:44:30 +01:00
Justin Clark-Casey (justincc)
03b2b5b77b minor: Make log message at top of ScenePresence.CompleteMovement info level and comment out later log message in ScenePresence.MakeRootAgent()
Need an info message since this is currently important in detecting teleport issue when not at debug log level.
CompleteMovement message occurs before MakeRootAgent() one did
2013-09-19 20:59:27 +01:00
Justin Clark-Casey (justincc)
6bdef1f70b minor: Stop debug logging whenever an npc is moved, other npc log related formatting cleanups 2013-09-19 20:49:55 +01:00
Justin Clark-Casey (justincc)
3a9a8d2113 Revert "Also check user authorization if looking to upgrade from a child to a root agent."
This reverts commit c7ded0618c.
This proves not to be necessary - the necessary checks are already being done via QueryAccess() before cross or teleport
2013-09-19 20:26:26 +01:00
Justin Clark-Casey (justincc)
83c113896e Create regression TestCrossOnSameSimulatorNoRootDestPerm() to check that avatars are not allowed to cross into a neighbour where they are not authorized, even if a child agent was allowed. 2013-09-19 20:26:08 +01:00
Justin Clark-Casey (justincc)
997700c4aa minor: Make config-include .ini files more consistent
Chiefly tabs to spaces.
No actual setting changes
2013-09-18 23:49:27 +01:00
Justin Clark-Casey (justincc)
ac0a527976 Add [SimulationService] section to GridHypergrid.ini and StandaloneHypergrid.ini
This was already in Grid.ini and Standalone.ini
Default settings are same as previously, just introduce a debug ConnectorProtocolVersion parameter
2013-09-18 23:27:37 +01:00
Justin Clark-Casey (justincc)
8999f06025 minor: correct method name in comment 2013-09-18 23:13:31 +01:00
Justin Clark-Casey (justincc)
ddcbd4bb7d refactor: rename *ChildAgentDataUpdate() methods to *UpdateChildAgent()
verb-noun is consistent with other similar methods
2013-09-18 23:09:38 +01:00
Justin Clark-Casey (justincc)
3ce46adb2a minor: Make log message when Scene.IncomingChildAgentDateUpdate() more explicit that there is a problem if it still finds the agent to be a child if the sender wanted to wait till it became root
Add some comments about the mssage sequence, though much more data is at
http://opensimulator.org/wiki/Teleports
2013-09-18 22:56:00 +01:00
Justin Clark-Casey (justincc)
f4d82a56f4 Double the time spent waiting for a UseCircuitCode packet in LLUDPServer.HandleCompleteMovementIntoRegion()
This is to deal with one aspect of http://opensimulator.org/mantis/view.php?id=6755
With the V2 teleport arrangements, viewers appear to send the single UseCircuitCode and CompleteAgentMovement packets immediately after each other
Possibly, on occasion a poor network might drop the initial UseCircuitCode packet and by the time it retries, the CompleteAgementMovement has timed out and the teleport fails.
There's no apparant harm in doubling the wait time (most times only one wait will be performed) so trying this.
2013-09-18 22:09:46 +01:00
Justin Clark-Casey (justincc)
7dbc93c62a Change logging to provide more information on LLUDPServer.HandleCompleteMovementIntoRegion()
Add more information on which endpoint sent the packet when we have to wait and if we end up dropping the packet
Only check if the client is active - other checks are redundant since they can only failed if IsActve = false
2013-09-18 21:41:51 +01:00
Justin Clark-Casey (justincc)
1d2466889a Reinstate insertion of "Unknown UserUMMAU4" now, as naive removing may be generating too many repeating user requests from other sources.
Leaves in the dropping of the client GUN8 (now 9) uuid binding message, since this was the much more common case from the viewer-side and this can only affect viewers.
2013-09-17 01:20:55 +01:00
Justin Clark-Casey (justincc)
845d2b193a Comment out warning about no grid user found in UMM.TryGetUserNamesFromServices() for now 2013-09-17 00:54:53 +01:00
Justin Clark-Casey (justincc)
69ec85f491 Fix issue in recent 3f0fa9f7 where the code start adding unknown user cache entries with no name 2013-09-17 00:02:36 +01:00
Justin Clark-Casey (justincc)
2603a2891b Reinsert comments about possible race conditions when sending bulk inventory updates on non-flag clothing editing 2013-09-16 23:26:13 +01:00
Justin Clark-Casey (justincc)
f99dae03cb Fix bug where using PRIM_LINK_TARGET with only two remaining list items (e.g. link number then PRIM_ROTATION) would not return the parameter
Extended regression test for this case
2013-09-16 23:00:40 +01:00
Justin Clark-Casey (justincc)
60cf42cb8d Make llGetLinkPrimitiveParams() abort and return existing list of params when it encounters an invalid link number, rather than throwing an exception
Addresses http://opensimulator.org/mantis/view.php?id=6768
Thanks to talun for the patch on that commit - in the end I took a different approach that also deals with invalid PRIM_LINK_TARGET
However, not yet generating the same warning on invalid PRIM_LINK_TARGET as seen on LL grid
This commit also adds regression tests for some cases of llGetLinkPrimitiveParams()
2013-09-16 22:56:08 +01:00
Justin Clark-Casey (justincc)
3f0fa9f707 To avoid viewers (particularly on the Hypergrid) from permanently caching a UUID -> "Unknown User" binding, drop the binding request rather than replying with "Unknown User"
By not binding UUID -> "Unknown User", we leave open the possibility that the binding may be correctly resolved at a later time, which can still happen in some Hypergrid situations.
Observed behaviour of LL viewer 3.3.4 is that a dropped bind request is not retried until the next session.
2013-09-16 19:45:42 +01:00
Justin Clark-Casey (justincc)
53de6d94ea minor: replace spaces with tabs for see_into_region setting 2013-09-12 23:38:50 +01:00
Talun
07d6a0385f 6762: llList2Key fails to convert a string in a list to a key
llGetPrimitiveParams changed to return the sculpty key as an LSL_String so
that type checking in llList2Key will work
2013-09-12 23:23:52 +01:00
Robert Adams
2d7adcb22f BulletSim: update DLLs and SOs to disable Bullet's internal profiling.
This was accidentily left on. This version should make performance better
and fix the memory leak.
2013-09-12 13:07:18 -07:00
BlueWall
3c85afbb43 Allow setting the EntityTransfer-max_distance to 0 to override distance checks. This is to facilitate current viewer work fixing the distance limitations for teleporting. 2013-09-12 11:46:12 -04:00
Robert Adams
dacc20ee48 BulletSim: remove collision cache clearing logic for physical objects.
This fixes constraints from getting messed up when properties change.
2013-09-11 16:50:27 -07:00
Mic Bowman
b29e9d37e7 Change handling of the FetchInventoryDescendents2 capability configuration to allow
for external handlers.
2013-09-11 12:15:16 -07:00
Robert Adams
8bcf753127 BulletSim: update DLLs and SOs with ClearCollisionCache inteface calls
and constraint debugging messages.
2013-09-11 09:12:26 -07:00
Robert Adams
6e39cc316f BulletSim: add ClearCollisionProxyCache function to API.
Add proxy cache clearing when some properties are changed. This fixes
a problem where objects would stop colliding of they were moved
with setPosition mulitple times.
2013-09-11 09:12:24 -07:00
Robert Adams
e34385634b BulletSim: update DLLs and SOs for spring parameters and constraint
debugging dump code.
2013-09-11 09:12:22 -07:00
Robert Adams
c5eabb28b4 BulletSim: add LSL function and plumbing for setting a spring
equilibrium point in the physics engine constraint.
2013-09-11 09:12:19 -07:00
Robert Adams
5827b6e1aa BulletSim: add extended physics LSL constants for axis specification.
Add specific error warnings for mis-matched parameter types in extended
   physics functions.
2013-09-11 09:12:18 -07:00
Robert Adams
cf2cdc191d BulletSim: ability to specify groups of axis to modify in constraint parameters that control multiple axis. Add useLinearReferenceFrameA constraint parameter. 2013-09-11 09:12:16 -07:00
Robert Adams
7c54630a2d BulletSim: add axis parameter for specifying enable, damping, and stiffness for spring constraints. Renumber parameter ops since I can as no one is using them yet. 2013-09-11 09:12:14 -07:00
Robert Adams
30b3657a66 BulletSim: implementation of setting spring specific physical parameters. Add setting of linkset type to physChangeLinkParams. Lots of detail logging for setting of linkset constraint parameters. 2013-09-11 09:12:12 -07:00
Robert Adams
67195618d5 BulletSim: add requestor's ID to post taint detail log message. 2013-09-11 09:12:10 -07:00
Robert Adams
3dbf4a1002 BulletSim: remove chatty debug message from previous commit. 2013-09-11 09:12:09 -07:00
Robert Adams
e0b457d3c3 BulletSim: add position and rotation update for child prim physics update events. Normally, physics engines do not return updates for child prims so, under normal operation, this code should never execute. Will only be used when using flexible linkset linkages. 2013-09-11 09:12:07 -07:00
Robert Adams
d09c35f506 BulletSim: pass both root and child BSPhysObjects to Extension function. Update routines to use the new parameters list from above change. 2013-09-11 09:12:05 -07:00
Robert Adams
995314f91f BulletSim: add ID parameter to TaintedObject calls so logging will include LocalID of object which created the taint. 2013-09-11 09:12:03 -07:00
Robert Adams
4781297b4e BulletSim: Extension parameters passed through the classes made to pass just and array of objects rather than a mixture of parameters and array. Makes understanding and parsing what is being passed much easier. 2013-09-11 09:12:02 -07:00
Robert Adams
6d83f3f021 BulletSim: adjust avatar capsule height calculation to be closer to defined SL heights. Correct BSParam avatar height defaults to be what's in OpenSimDefaults.ini. 2013-09-11 09:12:00 -07:00
Robert Adams
e1120cb74d BulletSim: add extended physics function physGetLinkType(linkNum). Add implementation of physChangeLinkParams() in BSLinksetConstraint. 2013-09-11 09:11:58 -07:00
Robert Adams
8755aeb348 BulletSim: update DLLs and SOs with Bullet svn version 2644 (no major fixes) and with BulletSim implementing more of the constraint types and parameter settings. 2013-09-11 09:11:56 -07:00
Robert Adams
f6fdfd16f5 BulletSim: change ExtendedPhysics constants to 'const' so they can be used as case variables in switch statements. 2013-09-11 09:11:54 -07:00
Robert Adams
455d36c4c7 BulletSim: add physChangeLinkParams to set individual parameters on link constraints. Not fully functional. Remove double definition of ExtendedPhysics parameters by having BulletSim reference the optional module (addition to prebuild.xml and usings). 2013-09-11 09:11:52 -07:00
Robert Adams
b2a1348adc BulletSim: update C++ HACD parameters to values that handle enclosed hollow spaces better. This shouldn't affect many since this HACD routine is off by default. 2013-09-11 09:11:50 -07:00
Robert Adams
6aee08ac3c BulletSim: add physChangeLinkSpring to change linkset link to be a spring constraint. Add implementation to create spring constraint. Send up property updates for linkset children at the end of flexible linkset links. The simulator probably doesn't do the right thing yet. 2013-09-11 09:11:48 -07:00
Robert Adams
dff0fb5690 BulletSim: Linkset.Refresh() calls internal ScheduleRebuild() to recreate the linkset physics at next PostTaint time. Replace the existing calls to ScheduleRebuild to be calls to Refresh(). This allows external routines to make changes to parameters and then cause the linkset to rebuild. 2013-09-11 09:11:46 -07:00
Robert Adams
f3cc20050e BulletSim: initial implementation of physChangeLinkFixed that resets a linkset's link back to a fixed, non-moving connection. 2013-09-11 09:11:45 -07:00
Robert Adams
c6a6631efc BulletSim: move linkset extension operations into BSPrimLinkable where they should be. 2013-09-11 09:11:43 -07:00
Robert Adams
993bcec088 BulletSim: add unmanaged and XNA functions for hinge, slider and spring constraints. 2013-09-11 09:11:41 -07:00
Robert Adams
0971c7ae77 BulletSim: complete linkage of spring constraint into linkset constraint. 2013-09-11 09:11:39 -07:00
Robert Adams
9a7d0e489c BulletSim: add spring constraint to linkset constraint types. 2013-09-11 09:11:37 -07:00
Robert Adams
48ee73bfa7 BulletSim: add API and calls for spring constraint parameters. 2013-09-11 09:11:36 -07:00
Robert Adams
725751fd6c BulletSim: fixes for change linkset implementation of physical linksets. 2013-09-11 09:11:34 -07:00
Michael Cerquoni
663059ac5c chaning the default max_distance to 16383 as we actually start counting at zero, thank you dahlia for pointing this out. 2013-09-10 19:56:39 -04:00
Michael Cerquoni
ec5f17b2ce This extends the default max_distance for teleports to 16384, a big thank you to all of the viewer devs who made this possibe! 2013-09-10 18:35:02 -04:00
Robert Adams
b05cb3b2bf Change collision logic in SceneObjectPart so land_collision will happen.
The previous logic would generate land_collision_start and land_collision_end
but would not generate the land_collision itself.
2013-09-09 14:50:33 -07:00
BlueWall
a97f6f8668 Fix configuration/ini expansion issue. Thanks to smxy for testing. 2013-09-07 13:11:31 -04:00
Diva Canto
08874d6b9e Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-09-05 07:44:49 -07:00
Diva Canto
04619a9b13 Restore group membership check for HG users in QueryAccess. 2013-09-05 07:44:27 -07:00
Justin Clark-Casey (justincc)
b858be345a minor: add doc about DefaultHGRegion and some of the other GridService region settings (though not all as of yet) 2013-09-05 00:41:03 +01:00
Justin Clark-Casey (justincc)
dc74a50225 Stop "show client stats" from throwing an exception if somehow Scene.m_clientManager still retains a reference to a dead client.
Instead, "show client stats" now prints "Off!" so that exception is not thrown and we know which entries in ClientManager are in this state.
There's a race condition which could trigger this, but the window is extremely short and exceptions would not be thrown consistently (which is the behaviour observed).
It should otherwise be impossible for this condition to occur, so there may be a weakness in client manager IClientAPI removal.
2013-09-04 23:48:24 +01:00
Justin Clark-Casey (justincc)
c7ded0618c Also check user authorization if looking to upgrade from a child to a root agent.
Relevant if a child agent has been allowed into the region which should not be upgraded to a root agent.
2013-09-04 00:44:17 +01:00
Justin Clark-Casey (justincc)
5f0d54c209 For a Hypergrid user, delay estate access checks until NewUserConnection() so that they work.
This is necessary because the hypergrid groups checks (as referenced by estates) require an agent circuit to be present to construct the hypergrid ID.
However, this is not around until Scene.NewUserConnection(), as called by CreateAgent() in EntityTransferModule.
Therefore, if we're dealing with a hypergrid user, delay the check until NewUserConnection()/CreateAgent()
The entity transfer impact should be minimal since CreateAgent() is the next significant call after NewUserConnection()
However, to preserve the accuracy of query access we will only relax the check for HG users.
2013-09-04 00:42:23 +01:00
Justin Clark-Casey (justincc)
b781a23c44 In pCampbot PhysicsBehaviour.Close(), only cancel jumping if bot is connected 2013-09-03 19:58:27 +01:00
Justin Clark-Casey (justincc)
9c3c9b7f5f Make pCampbot "add behaviour" and "remove behaviour" console commands work for all bots if no bot number is given 2013-09-03 19:57:34 +01:00
Justin Clark-Casey (justincc)
76bd2e2d72 Consistently give responsibility for thread sleeping to behaviours rather than controlling from the main action loop
This is to avoid excessive and inconsistent delays between behaviours that currently need to embed sleeps in other actions (e.g. physics) and other behaviours.
Might need a more sophisticated approach in the long term.
2013-09-03 19:41:12 +01:00
Justin Clark-Casey (justincc)
3dbe7313d1 Add Close() method to IBehaviour to allow behaviours to cleanup when removed or bot it disconnected.
In this case, it is used to turn off jump when physics testing behaviour is removed.
2013-09-03 19:33:17 +01:00
Justin Clark-Casey (justincc)
1a2627031d Add pCampbot "remove behaviour" console command for removing bot behaviours during operation.
Doesn't currently work very well as stopping physics, for instance, can leave bot travelling in old direction
2013-09-03 19:05:54 +01:00
Justin Clark-Casey (justincc)
9bd6271570 Add ability to adjust pCampbot bot behaviours whilst running with "add behaviour <behaviour-name> <bot-number>" console commad 2013-09-03 18:51:55 +01:00
Justin Clark-Casey (justincc)
01cb8033a4 And fix break in "show bot" from commit 9c65207 2013-09-03 17:55:20 +01:00
Justin Clark-Casey (justincc)
a89c56dcf1 Fix build break from last commit 9c65207. Mono 2.4 lacks string.join(string, List<string>), or some auto casting is missing 2013-09-03 17:53:29 +01:00
Justin Clark-Casey (justincc)
9c65207936 Show behaviours of pCampbot bots in "show bots" and "show bot" console commands 2013-09-03 17:07:57 +01:00
Justin Clark-Casey (justincc)
431156f6c4 minor simplification of some unix date functions in Util. No functional change. 2013-09-03 00:17:50 +01:00
Justin Clark-Casey (justincc)
5f15ee95dc Fix logic errors in "show grid users online" console command which didn't actually filter out users shown continuously online for more than 5 days
Remove confusion in command output.
2013-09-03 00:16:43 +01:00
Justin Clark-Casey (justincc)
fc9f50d940 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-09-03 00:06:50 +01:00
Justin Clark-Casey (justincc)
4035badd20 Add experimental "show grid users online" console command to show grid users online from a standalone/robust instance.
This is not guaranteed to be accurate since users may be left "online" in certain situations.
For example, if a simulator crashes and they never login/logout again.
To counter this somewhat, only users continuously online for less than 5 days are shown.
2013-09-03 00:04:12 +01:00
BlueWall
9643915093 Remove test that gives issue on Windows, just let the try/catch do the work. 2013-09-02 16:28:40 -04:00
Justin Clark-Casey (justincc)
857f24a5e2 Fix bug where users teleporting to non-neighbour regions could continue to hear chat from their source region for some time after teleport completion.
This occurs on v2 teleport since the source region now waits 15 secs before closing the old child agent, which could still receive chat.
This commit introduces a ScenePresenceState.PreClose which is set before the wait, so that ChatModule can check for ScenePresenceState.Running.
This was theoretically also an issue on v1 teleport but since the pause before close was only 2 secs there, it was not noticed.
2013-09-02 19:15:10 +01:00
Justin Clark-Casey (justincc)
5ce5ce6edb Comment out warning about agent updating without valid session ID for now.
This causes extreme console spam if a simulator running latest master and one running 0.7.5 have adjacent regions occupied by avatars.
2013-09-02 17:45:38 +01:00
Justin Clark-Casey (justincc)
4cbadc3c49 Allow one to specify a DefaultHGRegion flag in [GridService] in order to allow different default regions for HG and direct grid logins.
This requires a new GridService.GetDefaultHypergridRegions() so ROBUST services require updating but not simulators.
This method still returns regions flagged with just DefaultRegion after any DefaultHGRegions, so if no DefaultHGRegions are specified
then existing configured defaults will still work.
Immediate use is for conference where we need to be able to specify different defaults
However, this is also generally useful to send experienced HG users to one default location and local users whose specified region fails (e.g. no "home" or "last") to another.
2013-09-02 17:27:45 +01:00
BlueWall
56f565b601 Profiles: Clean up some log entries caused when visiting HG avatar is using legacy profiles 2013-08-29 16:54:13 -04:00
BlueWall
a8c0e16e47 Initialization: move key expansion out to operate on all sources and not just environment variables 2013-08-29 14:35:56 -04:00
Robert Adams
aa521fb385 Do not add a port zero to end of the hypergrid gateway host name.
If the port is specified it is added but a ":0" is not added if the port is zero.
This enables the hypergrid address short form "hypergridGateway:regionName"
which is handled by the parser but failed because of this zero port addition.
2013-08-28 16:38:07 -07:00
Robert Adams
0882cf0fc3 BulletSim: add some protections for processing when shutting down.
Attempt to fix Mantis 6740 (http://opensimulator.org/mantis/view.php?id=6740).
2013-08-27 09:55:50 -07:00
Justin Clark-Casey (justincc)
0dd9a68eb7 Revert "Make HG logins fall back to fallback regions if the desired region fails."
This is very similar to my earlier revert in bcb8605f84 and fails for the same reasons.
Reverting this change because it causes a problem if access is denied to the user.
This reverts commit c7a8afbb8d.
2013-08-26 21:07:49 +01:00
Justin Clark-Casey (justincc)
1b2830b929 Revert "Added some more debug messages."
Fallback doesn't work at this level as the change of destination isn't communicated to the source region/viewer
Reverting because this introduces a bug when access does fail.
More detail in revert of main commit.

This reverts commit ec32c1d4b6.
2013-08-26 21:05:55 +01:00
Justin Clark-Casey (justincc)
60e4ce20b8 Fix exception thrown after a region has been restarted through scheduling.
This exception was very likely harmless since it occurred after the restart had taken place, but still misleading.
Thanks to SCGreyWolf for the code change suggestion in http://opensimulator.org/mantis/view.php?id=6747, though I did this in a slightly different way.
2013-08-25 20:17:04 +01:00
Justin Clark-Casey (justincc)
85824d2cd9 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-08-25 20:12:59 +01:00
Diva Canto
ec32c1d4b6 Added some more debug messages. 2013-08-24 09:59:05 -07:00
Diva Canto
f0c0376660 Potential fix for access control bug on login introduced with SeeIntoRegion commit. 2013-08-24 08:42:41 -07:00
Diva Canto
5cd7bc2848 Merge branch 'master' of ssh://opensimulator.org/var/git/opensim 2013-08-24 03:42:39 -07:00
Diva Canto
c7a8afbb8d Make HG logins fall back to fallback regions if the desired region fails. 2013-08-24 03:41:56 -07:00
Diva Canto
6a24515269 Whitespace fubar. 2013-08-24 03:40:44 -07:00
Robert Adams
c34e6f25b1 Fix a printing of exception error in InventoryArchiveModule that only
printed the error message and not the call stack.
2013-08-23 13:53:47 -07:00
Justin Clark-Casey (justincc)
1a623bb266 Rename pCampbot.ini -> pCampBot.ini (and example file) to be consistent with other capitalizations of pCampBot 2013-08-23 20:58:46 +01:00
Justin Clark-Casey (justincc)
0fbfef9649 minor: shortern warning messages in EntityTransferModule when UpdateAgent() fails 2013-08-23 01:21:03 +01:00
Justin Clark-Casey (justincc)
050617ae0e Make pCampbot "show bot" command take the bot number instead of the full bot name
Shorter and can do this because bot names are uniform
2013-08-23 01:13:19 +01:00
Justin Clark-Casey (justincc)
04f4dd3dc7 remove redundant return at end of HandleDeregisterRegion() 2013-08-23 01:04:03 +01:00
Justin Clark-Casey (justincc)
2be786709b Make it possible for the "deregister region id" command to accept more than one id 2013-08-23 01:03:27 +01:00
Justin Clark-Casey (justincc)
61c20bd06a Remove old and unused ScenePresence.RestoreInCurrentScene() 2013-08-23 00:53:42 +01:00
Justin Clark-Casey (justincc)
065c5839b5 Refactor: merge SceneGraph.AddScenePresence() into CreateAndAddChildScenePresence() since the former was only ever called from the latter
This allows us to remove dead code relating to adding root agents directly to the scenegraph, which never happens.
2013-08-23 00:49:13 +01:00
Justin Clark-Casey (justincc)
a9f9b0da9d minor: Correct typo on "debug stats record start" message 2013-08-23 00:13:31 +01:00
711 changed files with 78942 additions and 58351 deletions

7
.gitignore vendored
View File

@@ -10,6 +10,12 @@
*.pidb
*.dll.build
*.dll
# Ignore .user and .suo files as these are user preference specific
# http://stackoverflow.com/questions/72298/should-i-add-the-visual-studio-suo-and-user-files-to-source-control
*.suo
*.user
*.VisualState.xml
*/*/obj
*/*/*/obj
@@ -65,7 +71,6 @@ bin/crashes/
Examples/*.dll
OpenSim.build
OpenSim.sln
OpenSim.suo
OpenSim.userprefs
Prebuild/Prebuild.build
Prebuild/Prebuild.sln

View File

@@ -19,10 +19,14 @@ Prereqs:
From the distribution type:
* ./runprebuild.sh
* nant (or xbuild)
* nant (or !* xbuild)
* cd bin
* copy OpenSim.ini.example to OpenSim.ini and other appropriate files in bin/config-include
* run mono OpenSim.exe
!* xbuild option switches
!* clean: xbuild /target:clean
!* debug: (default) xbuild /property:Configuration=Debug
!* release: xbuild /property:Configuration=Release
# Using Monodevelop

View File

@@ -1,5 +1,4 @@
<<<>>>>The following people have contributed to OpenSim (Thank you
for your effort!)
The following people have contributed to OpenSim (Thank you for your effort!)
= Current OpenSim Developers (in very rough order of appearance) =
These folks represent the current core team for OpenSim, and are the
@@ -7,16 +6,18 @@ people that make the day to day of OpenSim happen.
* justincc (OSVW Consulting, justincc.org)
* chi11ken (Genkii)
* dahlia
* dahlia
* Melanie Thielker
* Diva (Crista Lopes, University of California, Irvine)
* Dan Lake (Intel)
* Dan Lake
* Marck
* Mic Bowman (Intel)
* Mic Bowman
* BlueWall (James Hughes)
* Nebadon Izumi (Michael Cerquoni, OSgrid)
* Snoopy Pfeffer
* Robert Adams (Intel)
* Robert Adams
* Oren Hurvitz (Kitely)
* Kevin Cozens
= Core Developers Following the White Rabbit =
Core developers who have temporarily (we hope) gone chasing the white rabbit.
@@ -61,11 +62,13 @@ where we are today.
These folks have contributed code patches or content to OpenSimulator to help make it
what it is today.
* aduffy70
* A_Biondi
* aduffy70
* Ai Austin
* alex_carnell
* Alan Webb (IBM)
* Aleric
* Alicia Raven
* Allen Kerensky
* BigFootAg
* BlueWall Slade
@@ -75,18 +78,21 @@ what it is today.
* Chris Yeoh (IBM)
* controlbreak
* coyled
* ctrlaltdavid (David Rowe)
* Daedius
* daTwitch
* Dev Random
* devalnor-#708
* dmiles (Daxtron Labs)
* Dong Jun Lan (IBM)
* DoranZemlja
* dr0b3rts
* dslake (Intel)
* dslake
* FredoChaplin
* Garmin Kawaguichi
* Gerhard
* Godfrey
* Greg C.
* Grumly57
* GuduleLapointe
* Ewe Loon
@@ -95,10 +101,12 @@ what it is today.
* Flyte Xevious
* Garmin Kawaguichi
* Gryc Ueusp
* H-H-H (ginge264)
* Hiro Lecker
* Iain Oliver
* Imaze Rhiano
* Intimidated
* Jak Daniels
* Jeremy Bongio (IBM)
* jhurliman
* John R Sohn (XenReborn)
@@ -106,25 +114,30 @@ what it is today.
* Jon Cundill
* Junta Kohime
* Kayne
* Kevin Cozens
* kinoc (Daxtron Labs)
* Kira
* Kitto Flora
* KittyLiu
* Kurt Taylor (IBM)
* Lani Global
* lillith_xue
* lkalif
* LuciusSirnah
* lulurun
* M.Igarashi
* maimedleech
* Mana Janus
* MarcelEdward
* Matt Lehmann
* Mic Bowman
* Michelle Argus
* Michael Cortez (The Flotsam Project, http://osflotsam.org/)
* Micheil Merlin
* Mike Osias (IBM)
* Mike Pitman (IBM)
* mikemig
* mikkopa/_someone - RealXtend
* Misterblue (Intel)
* Misterblue
* Mircea Kitsune
* mpallari
* MrMonkE
@@ -133,7 +146,6 @@ what it is today.
* nornalbion
* Omar Vera Ustariz (IBM)
* openlifegrid.com
* Oren Hurvitz (Kitely)
* otakup0pe
* Pixel Tomsen
* ralphos
@@ -142,6 +154,7 @@ what it is today.
* Richard Alimi (IBM)
* Rick Alther (IBM)
* Rob Smart (IBM)
* Roger Kirkman (zadark)
* rtomita
* Ruud Lathorp
* SachaMagne
@@ -170,23 +183,18 @@ what it is today.
* Zha Ewry
* ziah
= LSL Devs =
* Alondria
* CharlieO
* Tedd
* Melanie Thielker
= Testers =
* Ai Austin
* CharlieO (LSL)
* Ckrinke
* openlifegrid.com
This software uses components from the following developers:
* Sleepycat Software (Berkeley DB)
* Aurora-Sim (http://aurora-sim.org)

View File

@@ -56,8 +56,8 @@ namespace OpenSim.Groups
private IGroupsServicesConnector m_groupData = null;
// Config Options
private bool m_groupMessagingEnabled = false;
private bool m_debugEnabled = true;
private bool m_groupMessagingEnabled;
private bool m_debugEnabled;
/// <summary>
/// If enabled, module only tries to send group IMs to online users by querying cached presence information.
@@ -83,7 +83,6 @@ namespace OpenSim.Groups
private Dictionary<UUID, List<string>> m_groupsAgentsDroppedFromChatSession = new Dictionary<UUID, List<string>>();
private Dictionary<UUID, List<string>> m_groupsAgentsInvitedToChatSession = new Dictionary<UUID, List<string>>();
#region Region Module interfaceBase Members
public void Initialise(IConfigSource config)
@@ -111,9 +110,17 @@ namespace OpenSim.Groups
m_messageOnlineAgentsOnly = groupsConfig.GetBoolean("MessageOnlineUsersOnly", false);
if (m_messageOnlineAgentsOnly)
{
m_usersOnlineCache = new ExpiringCache<UUID, PresenceInfo[]>();
}
else
{
m_log.Error("[Groups.Messaging]: GroupsMessagingModule V2 requires MessageOnlineUsersOnly = true");
m_groupMessagingEnabled = false;
return;
}
m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true);
m_debugEnabled = groupsConfig.GetBoolean("MessagingDebugEnabled", m_debugEnabled);
m_log.InfoFormat(
"[Groups.Messaging]: GroupsMessagingModule enabled with MessageOnlineOnly = {0}, DebugEnabled = {1}",
@@ -133,6 +140,14 @@ namespace OpenSim.Groups
scene.EventManager.OnMakeChildAgent += OnMakeChildAgent;
scene.EventManager.OnIncomingInstantMessage += OnGridInstantMessage;
scene.EventManager.OnClientLogin += OnClientLogin;
scene.AddCommand(
"Debug",
this,
"debug groups messaging verbose",
"debug groups messaging verbose <true|false>",
"This setting turns on very verbose groups messaging debugging",
HandleDebugGroupsMessagingVerbose);
}
public void RegionLoaded(Scene scene)
@@ -172,10 +187,8 @@ namespace OpenSim.Groups
return;
}
if (m_presenceService == null)
m_presenceService = scene.PresenceService;
}
public void RemoveRegion(Scene scene)
@@ -222,6 +235,25 @@ namespace OpenSim.Groups
#endregion
private void HandleDebugGroupsMessagingVerbose(object modules, string[] args)
{
if (args.Length < 5)
{
MainConsole.Instance.Output("Usage: debug groups messaging verbose <true|false>");
return;
}
bool verbose = false;
if (!bool.TryParse(args[4], out verbose))
{
MainConsole.Instance.Output("Usage: debug groups messaging verbose <true|false>");
return;
}
m_debugEnabled = verbose;
MainConsole.Instance.OutputFormat("{0} verbose logging set to {1}", Name, m_debugEnabled);
}
/// <summary>
/// Not really needed, but does confirm that the group exists.
@@ -242,11 +274,23 @@ namespace OpenSim.Groups
return false;
}
}
public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
{
SendMessageToGroup(im, groupID, UUID.Zero, null);
}
public void SendMessageToGroup(
GridInstantMessage im, UUID groupID, UUID sendingAgentForGroupCalls, Func<GroupMembersData, bool> sendCondition)
{
int requestStartTick = Environment.TickCount;
UUID fromAgentID = new UUID(im.fromAgentID);
// Unlike current XmlRpcGroups, Groups V2 can accept UUID.Zero when a perms check for the requesting agent
// is not necessary.
List<GroupMembersData> groupMembers = m_groupData.GetGroupMembers(UUID.Zero.ToString(), groupID);
int groupMembersCount = groupMembers.Count;
PresenceInfo[] onlineAgents = null;
@@ -254,7 +298,7 @@ namespace OpenSim.Groups
// Sending to offline members is not an option.
string[] t1 = groupMembers.ConvertAll<string>(gmd => gmd.AgentID.ToString()).ToArray();
// We cache in order not to overwhlem the presence service on large grids with many groups. This does
// We cache in order not to overwhelm the presence service on large grids with many groups. This does
// mean that members coming online will not see all group members until after m_usersOnlineCacheExpirySeconds has elapsed.
// (assuming this is the same across all grid simulators).
if (!m_usersOnlineCache.TryGetValue(groupID, out onlineAgents))
@@ -273,8 +317,6 @@ namespace OpenSim.Groups
// "[Groups.Messaging]: SendMessageToGroup called for group {0} with {1} visible members, {2} online",
// groupID, groupMembersCount, groupMembers.Count());
int requestStartTick = Environment.TickCount;
im.imSessionID = groupID.Guid;
im.fromGroup = true;
IClientAPI thisClient = GetActiveClient(fromAgentID);
@@ -299,12 +341,27 @@ namespace OpenSim.Groups
if (clientsAlreadySent.Contains(member.AgentID))
continue;
clientsAlreadySent.Add(member.AgentID);
if (hasAgentDroppedGroupChatSession(member.AgentID.ToString(), groupID))
if (sendCondition != null)
{
if (!sendCondition(member))
{
if (m_debugEnabled)
m_log.DebugFormat(
"[Groups.Messaging]: Not sending to {0} as they do not fulfill send condition",
member.AgentID);
continue;
}
}
else if (hasAgentDroppedGroupChatSession(member.AgentID.ToString(), groupID))
{
// Don't deliver messages to people who have dropped this session
if (m_debugEnabled) m_log.DebugFormat("[Groups.Messaging]: {0} has dropped session, not delivering to them", member.AgentID);
if (m_debugEnabled)
m_log.DebugFormat("[Groups.Messaging]: {0} has dropped session, not delivering to them", member.AgentID);
continue;
}

View File

@@ -45,9 +45,6 @@ namespace OpenSim.Groups
[Extension(Path = "/OpenSim/RegionModules", NodeName = "RegionModule", Id = "GroupsModule")]
public class GroupsModule : ISharedRegionModule, IGroupsModule
{
/// <summary>
/// </summary>
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -104,7 +101,7 @@ namespace OpenSim.Groups
{
scene.RegisterModuleInterface<IGroupsModule>(this);
scene.AddCommand(
"debug",
"Debug",
this,
"debug groups verbose",
"debug groups verbose <true|false>",
@@ -466,6 +463,7 @@ namespace OpenSim.Groups
OnNewGroupNotice(GroupID, NoticeID);
}
// Send notice out to everyone that wants notices
foreach (GroupMembersData member in m_groupData.GetGroupMembers(GetRequestingAgentIDStr(remoteClient), GroupID))
{
@@ -498,12 +496,13 @@ namespace OpenSim.Groups
Util.ParseUniversalUserIdentifier(notice.noticeData.AttachmentOwnerID, out giver, out tmp, out tmp, out tmp, out tmp);
m_log.DebugFormat("[Groups]: Giving inventory from {0} to {1}", giver, remoteClient.AgentId);
string message;
InventoryItemBase itemCopy = ((Scene)(remoteClient.Scene)).GiveInventoryItem(remoteClient.AgentId,
giver, notice.noticeData.AttachmentItemID);
giver, notice.noticeData.AttachmentItemID, out message);
if (itemCopy == null)
{
remoteClient.SendAgentAlertMessage("Can't find item to give. Nothing given.", false);
remoteClient.SendAgentAlertMessage(message, false);
return;
}

View File

@@ -101,7 +101,7 @@ namespace OpenSim.Groups
Dictionary<string, object> sendData = new Dictionary<string, object>();
if (GroupID != UUID.Zero)
sendData["GroupID"] = GroupID.ToString();
if (GroupName != null && GroupName != string.Empty)
if (!string.IsNullOrEmpty(GroupName))
sendData["Name"] = GroupsDataUtils.Sanitize(GroupName);
sendData["RequestingAgentID"] = RequestingAgentID;
@@ -275,7 +275,7 @@ namespace OpenSim.Groups
//m_log.DebugFormat("[XXX]: reply was {0}", reply);
if (reply == string.Empty || reply == null)
if (string.IsNullOrEmpty(reply))
return null;
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -560,7 +560,7 @@ namespace OpenSim.Groups
// so we have the list of urls to send the notice to
// this may take a long time...
Util.FireAndForget(delegate
Util.RunThreadNoTimeout(delegate
{
foreach (string u in urls)
{
@@ -571,7 +571,7 @@ namespace OpenSim.Groups
hasAttachment, attType, attName, attItemID, AgentUUIForOutside(attOwnerID));
}
}
});
}, "AddGroupNotice", null);
return true;
}
@@ -623,10 +623,13 @@ namespace OpenSim.Groups
if (agent != null)
break;
}
if (agent == null) // oops
return AgentID.ToString();
if (agent != null)
return Util.ProduceUserUniversalIdentifier(agent);
// we don't know anything about this foreign user
// try asking the user management module, which may know more
return m_UserManagement.GetUserUUI(AgentID);
return Util.ProduceUserUniversalIdentifier(agent);
}
private string AgentUUIForOutside(string AgentIDStr)

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -158,7 +158,7 @@ namespace OpenSim.Groups
}
catch (Exception e)
{
m_log.DebugFormat("[Groups.RobustHGConnector]: Exception {0}", e.StackTrace);
m_log.Error(string.Format("[Groups.RobustHGConnector]: Exception {0} ", e.Message), e);
}
return FailureResult();

View File

@@ -30,7 +30,7 @@ using Mono.Addins;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.6.*")]
[assembly: AssemblyVersion("0.8.1.*")]
[assembly: Addin("OpenSim.Groups", "0.1")]
[assembly: AddinDependency("OpenSim", "0.5")]

View File

@@ -32,27 +32,47 @@ using System.Reflection;
using System.Text;
using OpenSim.Framework;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Server.Base;
using OpenMetaverse;
using log4net;
using Nini.Config;
namespace OpenSim.Groups
{
public class GroupsServiceRemoteConnector
public class GroupsServiceRemoteConnector
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private string m_ServerURI;
private IServiceAuth m_Auth;
private object m_Lock = new object();
public GroupsServiceRemoteConnector(string url)
public GroupsServiceRemoteConnector(IConfigSource config)
{
IConfig groupsConfig = config.Configs["Groups"];
string url = groupsConfig.GetString("GroupsServerURI", string.Empty);
if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
throw new Exception(string.Format("[Groups.RemoteConnector]: Malformed groups server URL {0}. Fix it or disable the Groups feature.", url));
m_ServerURI = url;
if (!m_ServerURI.EndsWith("/"))
m_ServerURI += "/";
m_log.DebugFormat("[Groups.RemoteConnector]: Groups server at {0}", m_ServerURI);
/// This is from BaseServiceConnector
string authType = Util.GetConfigVarFromSections<string>(config, "AuthType", new string[] { "Network", "Groups" }, "None");
switch (authType)
{
case "BasicHttpAuthentication":
m_Auth = new BasicHttpAuthentication(config, "Groups");
break;
}
///
m_log.DebugFormat("[Groups.RemoteConnector]: Groups server at {0}, authentication {1}",
m_ServerURI, (m_Auth == null ? "None" : m_Auth.GetType().ToString()));
}
public ExtendedGroupRecord CreateGroup(string RequestingAgentID, string name, string charter, bool showInList, UUID insigniaID, int membershipFee, bool openEnrollment,
@@ -106,7 +126,7 @@ namespace OpenSim.Groups
sendData["OP"] = "UPDATE";
Dictionary<string, object> ret = MakeRequest("PUTGROUP", sendData);
if (ret == null || (ret != null && ret["RESULT"].ToString() == "NULL"))
if (ret == null || (ret != null && (!ret.ContainsKey("RESULT") || ret["RESULT"].ToString() == "NULL")))
return null;
return GroupsDataUtils.GroupRecord((Dictionary<string, object>)ret["RESULT"]);
@@ -120,14 +140,14 @@ namespace OpenSim.Groups
Dictionary<string, object> sendData = new Dictionary<string, object>();
if (GroupID != UUID.Zero)
sendData["GroupID"] = GroupID.ToString();
if (GroupName != null && GroupName != string.Empty)
if (!string.IsNullOrEmpty(GroupName))
sendData["Name"] = GroupsDataUtils.Sanitize(GroupName);
sendData["RequestingAgentID"] = RequestingAgentID;
Dictionary<string, object> ret = MakeRequest("GETGROUP", sendData);
if (ret == null || (ret != null && ret["RESULT"].ToString() == "NULL"))
if (ret == null || (ret != null && (!ret.ContainsKey("RESULT") || ret["RESULT"].ToString() == "NULL")))
return null;
return GroupsDataUtils.GroupRecord((Dictionary<string, object>)ret["RESULT"]);
@@ -267,6 +287,7 @@ namespace OpenSim.Groups
if (ret["RESULT"].ToString() == "NULL")
return members;
foreach (object v in ((Dictionary<string, object>)ret["RESULT"]).Values)
{
ExtendedGroupMembersData m = GroupsDataUtils.GroupMembersData((Dictionary<string, object>)v);
@@ -357,6 +378,7 @@ namespace OpenSim.Groups
if (ret["RESULT"].ToString() == "NULL")
return roles;
foreach (object v in ((Dictionary<string, object>)ret["RESULT"]).Values)
{
GroupRolesData m = GroupsDataUtils.GroupRolesData((Dictionary<string, object>)v);
@@ -657,7 +679,8 @@ namespace OpenSim.Groups
lock (m_Lock)
reply = SynchronousRestFormsRequester.MakeRequest("POST",
m_ServerURI + "groups",
ServerUtils.BuildQueryString(sendData));
ServerUtils.BuildQueryString(sendData),
m_Auth);
if (reply == string.Empty)
return null;
@@ -667,7 +690,7 @@ namespace OpenSim.Groups
return replyData;
}
#endregion
#endregion
}
}
}

View File

@@ -72,12 +72,7 @@ namespace OpenSim.Groups
private void Init(IConfigSource config)
{
IConfig groupsConfig = config.Configs["Groups"];
string url = groupsConfig.GetString("GroupsServerURI", string.Empty);
if (!Uri.IsWellFormedUriString(url, UriKind.Absolute))
throw new Exception(string.Format("[Groups.RemoteConnector]: Malformed groups server URL {0}. Fix it or disable the Groups feature.", url));
m_GroupsService = new GroupsServiceRemoteConnector(url);
m_GroupsService = new GroupsServiceRemoteConnector(config);
m_Scenes = new List<Scene>();
}

View File

@@ -36,6 +36,7 @@ using OpenSim.Framework;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Server.Handlers.Base;
using log4net;
using OpenMetaverse;
@@ -52,14 +53,26 @@ namespace OpenSim.Groups
public GroupsServiceRobustConnector(IConfigSource config, IHttpServer server, string configName) :
base(config, server, configName)
{
string key = string.Empty;
if (configName != String.Empty)
m_ConfigName = configName;
m_log.DebugFormat("[Groups.RobustConnector]: Starting with config name {0}", m_ConfigName);
IConfig groupsConfig = config.Configs[m_ConfigName];
if (groupsConfig != null)
{
key = groupsConfig.GetString("SecretKey", string.Empty);
m_log.DebugFormat("[Groups.RobustConnector]: Starting with secret key {0}", key);
}
// else
// m_log.DebugFormat("[Groups.RobustConnector]: Unable to find {0} section in configuration", m_ConfigName);
m_GroupsService = new GroupsService(config);
server.AddStreamHandler(new GroupsServicePostHandler(m_GroupsService));
IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName);
server.AddStreamHandler(new GroupsServicePostHandler(m_GroupsService, auth));
}
}
@@ -69,8 +82,8 @@ namespace OpenSim.Groups
private GroupsService m_GroupsService;
public GroupsServicePostHandler(GroupsService service) :
base("POST", "/groups")
public GroupsServicePostHandler(GroupsService service, IServiceAuth auth) :
base("POST", "/groups", auth)
{
m_GroupsService = service;
}
@@ -96,7 +109,7 @@ namespace OpenSim.Groups
string method = request["METHOD"].ToString();
request.Remove("METHOD");
m_log.DebugFormat("[Groups.Handler]: {0}", method);
// m_log.DebugFormat("[Groups.Handler]: {0}", method);
switch (method)
{
case "PUTGROUP":
@@ -140,7 +153,7 @@ namespace OpenSim.Groups
}
catch (Exception e)
{
m_log.DebugFormat("[GROUPS HANDLER]: Exception {0}", e.StackTrace);
m_log.Error(string.Format("[GROUPS HANDLER]: Exception {0} ", e.Message), e);
}
return FailureResult();
@@ -652,7 +665,11 @@ namespace OpenSim.Groups
GroupInviteInfo invite = m_GroupsService.GetAgentToGroupInvite(request["RequestingAgentID"].ToString(),
new UUID(request["InviteID"].ToString()));
result["RESULT"] = GroupsDataUtils.GroupInviteInfo(invite);
if (invite != null)
result["RESULT"] = GroupsDataUtils.GroupInviteInfo(invite);
else
result["RESULT"] = "NULL";
return Util.UTF8NoBomEncoding.GetBytes(ServerUtils.BuildXmlResponse(result));
}
@@ -784,6 +801,14 @@ namespace OpenSim.Groups
string xmlString = ServerUtils.BuildXmlResponse(result);
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
}
private byte[] FailureResult(string reason)
{
Dictionary<string, object> result = new Dictionary<string, object>();
NullResult(result, reason);
string xmlString = ServerUtils.BuildXmlResponse(result);
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
}
#endregion
}
}

View File

@@ -66,7 +66,7 @@ namespace OpenSim.OfflineIM
if (serviceLocation == string.Empty)
m_OfflineIMService = new OfflineIMService(config);
else
m_OfflineIMService = new OfflineIMServiceRemoteConnector(serviceLocation);
m_OfflineIMService = new OfflineIMServiceRemoteConnector(config);
m_ForwardOfflineGroupMessages = cnf.GetBoolean("ForwardOfflineGroupMessages", m_ForwardOfflineGroupMessages);
m_log.DebugFormat("[OfflineIM.V2]: Offline messages enabled by {0}", Name);
@@ -226,10 +226,6 @@ namespace OpenSim.OfflineIM
return;
}
Scene scene = FindScene(new UUID(im.fromAgentID));
if (scene == null)
scene = m_SceneList[0];
string reason = string.Empty;
bool success = m_OfflineIMService.StoreMessage(im, out reason);
@@ -261,6 +257,11 @@ namespace OpenSim.OfflineIM
return m_OfflineIMService.StoreMessage(im, out reason);
}
public void DeleteMessages(UUID userID)
{
m_OfflineIMService.DeleteMessages(userID);
}
#endregion
}
}

View File

@@ -30,7 +30,7 @@ using Mono.Addins;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.6.*")]
[assembly: AssemblyVersion("0.8.1.*")]
[assembly: Addin("OpenSim.OfflineIM", "0.1")]
[assembly: AddinDependency("OpenSim", "0.5")]

View File

@@ -32,6 +32,7 @@ using System.Reflection;
using System.Text;
using OpenSim.Framework;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
@@ -46,6 +47,7 @@ namespace OpenSim.OfflineIM
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private string m_ServerURI = string.Empty;
private IServiceAuth m_Auth;
private object m_Lock = new object();
public OfflineIMServiceRemoteConnector(string url)
@@ -65,6 +67,18 @@ namespace OpenSim.OfflineIM
m_ServerURI = cnf.GetString("OfflineMessageURL", string.Empty);
/// This is from BaseServiceConnector
string authType = Util.GetConfigVarFromSections<string>(config, "AuthType", new string[] { "Network", "Messaging" }, "None");
switch (authType)
{
case "BasicHttpAuthentication":
m_Auth = new BasicHttpAuthentication(config, "Messaging");
break;
}
///
m_log.DebugFormat("[OfflineIM.V2.RemoteConnector]: Offline IM server at {0} with auth {1}",
m_ServerURI, (m_Auth == null ? "None" : m_Auth.GetType().ToString()));
}
#region IOfflineIMService
@@ -82,8 +96,13 @@ namespace OpenSim.OfflineIM
if (!ret.ContainsKey("RESULT"))
return ims;
if (ret["RESULT"].ToString() == "NULL")
string result = ret["RESULT"].ToString();
if (result == "NULL" || result.ToLower() == "false")
{
string reason = ret.ContainsKey("REASON") ? ret["REASON"].ToString() : "Unknown error";
m_log.DebugFormat("[OfflineIM.V2.RemoteConnector]: GetMessages for {0} failed: {1}", principalID, reason);
return ims;
}
foreach (object v in ((Dictionary<string, object>)ret["RESULT"]).Values)
{
@@ -110,13 +129,21 @@ namespace OpenSim.OfflineIM
string result = ret["RESULT"].ToString();
if (result == "NULL" || result.ToLower() == "false")
{
reason = ret["REASON"].ToString();
reason = ret.ContainsKey("REASON") ? ret["REASON"].ToString() : "Unknown error";
return false;
}
return true;
}
public void DeleteMessages(UUID userID)
{
Dictionary<string, object> sendData = new Dictionary<string, object>();
sendData["UserID"] = userID;
MakeRequest("DELETE", sendData);
}
#endregion
@@ -130,7 +157,8 @@ namespace OpenSim.OfflineIM
lock (m_Lock)
reply = SynchronousRestFormsRequester.MakeRequest("POST",
m_ServerURI + "/offlineim",
ServerUtils.BuildQueryString(sendData));
ServerUtils.BuildQueryString(sendData),
m_Auth);
Dictionary<string, object> replyData = ServerUtils.ParseXmlResponse(
reply);

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -36,6 +36,7 @@ using OpenSim.Framework;
using OpenSim.Server.Base;
using OpenSim.Services.Interfaces;
using OpenSim.Framework.Servers.HttpServer;
using OpenSim.Framework.ServiceAuth;
using OpenSim.Server.Handlers.Base;
using log4net;
using OpenMetaverse;
@@ -59,7 +60,9 @@ namespace OpenSim.OfflineIM
m_OfflineIMService = new OfflineIMService(config);
server.AddStreamHandler(new OfflineIMServicePostHandler(m_OfflineIMService));
IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName);
server.AddStreamHandler(new OfflineIMServicePostHandler(m_OfflineIMService, auth));
}
}
@@ -69,8 +72,8 @@ namespace OpenSim.OfflineIM
private IOfflineIMService m_OfflineIMService;
public OfflineIMServicePostHandler(IOfflineIMService service) :
base("POST", "/offlineim")
public OfflineIMServicePostHandler(IOfflineIMService service, IServiceAuth auth) :
base("POST", "/offlineim", auth)
{
m_OfflineIMService = service;
}
@@ -96,19 +99,20 @@ namespace OpenSim.OfflineIM
string method = request["METHOD"].ToString();
request.Remove("METHOD");
m_log.DebugFormat("[OfflineIM.V2.Handler]: {0}", method);
switch (method)
{
case "GET":
return HandleGet(request);
case "STORE":
return HandleStore(request);
case "DELETE":
return HandleDelete(request);
}
m_log.DebugFormat("[OFFLINE IM HANDLER]: unknown method request: {0}", method);
}
catch (Exception e)
{
m_log.DebugFormat("[OFFLINE IM HANDLER]: Exception {0}", e.StackTrace);
m_log.Error(string.Format("[OFFLINE IM HANDLER]: Exception {0} ", e.Message), e);
}
return FailureResult();
@@ -159,6 +163,21 @@ namespace OpenSim.OfflineIM
return Util.UTF8NoBomEncoding.GetBytes(xmlString);
}
byte[] HandleDelete(Dictionary<string, object> request)
{
if (!request.ContainsKey("UserID"))
{
return FailureResult();
}
else
{
UUID userID = new UUID(request["UserID"].ToString());
m_OfflineIMService.DeleteMessages(userID);
return SuccessResult();
}
}
#region Helpers
private void NullResult(Dictionary<string, object> result, string reason)

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -91,7 +91,7 @@ namespace OpenSim.OfflineIM
{
reason = string.Empty;
// TODO Check limits
// Check limits
UUID principalID = new UUID(im.toAgentID);
long count = m_Database.GetCount("PrincipalID", principalID.ToString());
if (count >= MAX_IM)
@@ -100,32 +100,36 @@ namespace OpenSim.OfflineIM
return false;
}
string imXml = string.Empty;
string imXml;
using (MemoryStream mstream = new MemoryStream())
{
XmlWriterSettings settings = new XmlWriterSettings();
settings.Encoding = Encoding.UTF8;
settings.Encoding = Util.UTF8NoBomEncoding;
using (XmlWriter writer = XmlWriter.Create(mstream, settings))
{
m_serializer.Serialize(writer, im);
writer.Flush();
mstream.Position = 0;
using (StreamReader sreader = new StreamReader(mstream))
{
imXml = sreader.ReadToEnd();
}
}
imXml = Util.UTF8NoBomEncoding.GetString(mstream.ToArray());
}
OfflineIMData data = new OfflineIMData();
data.PrincipalID = principalID;
data.FromID = new UUID(im.fromAgentID);
data.Data = new Dictionary<string, string>();
data.Data["Message"] = imXml;
return m_Database.Store(data);
}
public void DeleteMessages(UUID userID)
{
m_Database.Delete("PrincipalID", userID.ToString());
m_Database.Delete("FromID", userID.ToString());
}
}
}

View File

@@ -39,6 +39,7 @@ using OpenSim.Region.CoreModules.Avatar.InstantMessage;
using OpenSim.Region.CoreModules.Scripting.DynamicTexture;
using OpenSim.Region.CoreModules.Scripting.LoadImageURL;
using OpenSim.Region.CoreModules.Scripting.XMLRPC;
using OpenSim.Services.Interfaces;
namespace OpenSim.ApplicationPlugins.LoadRegions
{
@@ -130,7 +131,7 @@ namespace OpenSim.ApplicationPlugins.LoadRegions
createdScenes.Add(scene);
if (changed)
regionsToLoad[i].EstateSettings.Save();
m_openSim.EstateDataService.StoreEstateSettings(regionsToLoad[i].EstateSettings);
}
foreach (IScene scene in createdScenes)

View File

@@ -62,4 +62,4 @@ using System.Runtime.InteropServices;
// by using the '*' as shown below:
// [assembly: AssemblyVersion("0.7.6.*")]
[assembly : AssemblyVersion("0.7.6.*")]
[assembly : AssemblyVersion("0.8.1.*")]

View File

@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.6.*")]
[assembly: AssemblyVersion("0.8.1.*")]

View File

@@ -32,6 +32,7 @@ using log4net;
using Mono.Addins;
using Nini.Config;
using OpenSim;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
@@ -45,6 +46,12 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
LogManager.GetLogger(
MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Controls whether we load modules from Mono.Addins.
/// </summary>
/// <remarks>For debug purposes. Defaults to true.</remarks>
public bool LoadModulesFromAddins { get; set; }
// Config access
private OpenSimBase m_openSim;
@@ -61,6 +68,11 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
private List<ISharedRegionModule> m_sharedInstances =
new List<ISharedRegionModule>();
public RegionModulesControllerPlugin()
{
LoadModulesFromAddins = true;
}
#region IApplicationPlugin implementation
public void Initialise (OpenSimBase openSim)
@@ -69,6 +81,9 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
m_openSim.ApplicationRegistry.RegisterInterface<IRegionModulesController>(this);
m_log.DebugFormat("[REGIONMODULES]: Initializing...");
if (!LoadModulesFromAddins)
return;
// Who we are
string id = AddinManager.CurrentAddin.Id;
@@ -88,40 +103,8 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
Dictionary<RuntimeAddin, IList<int>> loadedModules = new Dictionary<RuntimeAddin, IList<int>>();
// Scan modules and load all that aren't disabled
foreach (TypeExtensionNode node in
AddinManager.GetExtensionNodes("/OpenSim/RegionModules"))
{
IList<int> loadedModuleData;
if (!loadedModules.ContainsKey(node.Addin))
loadedModules.Add(node.Addin, new List<int> { 0, 0, 0 });
loadedModuleData = loadedModules[node.Addin];
if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null)
{
if (CheckModuleEnabled(node, modulesConfig))
{
m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type);
m_sharedModules.Add(node);
loadedModuleData[0]++;
}
}
else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null)
{
if (CheckModuleEnabled(node, modulesConfig))
{
m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type);
m_nonSharedModules.Add(node);
loadedModuleData[1]++;
}
}
else
{
m_log.WarnFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type);
loadedModuleData[2]++;
}
}
foreach (TypeExtensionNode node in AddinManager.GetExtensionNodes("/OpenSim/RegionModules"))
AddNode(node, modulesConfig, loadedModules);
foreach (KeyValuePair<RuntimeAddin, IList<int>> loadedModuleData in loadedModules)
{
@@ -194,6 +177,41 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
#region IPlugin implementation
private void AddNode(
TypeExtensionNode node, IConfig modulesConfig, Dictionary<RuntimeAddin, IList<int>> loadedModules)
{
IList<int> loadedModuleData;
if (!loadedModules.ContainsKey(node.Addin))
loadedModules.Add(node.Addin, new List<int> { 0, 0, 0 });
loadedModuleData = loadedModules[node.Addin];
if (node.Type.GetInterface(typeof(ISharedRegionModule).ToString()) != null)
{
if (CheckModuleEnabled(node, modulesConfig))
{
m_log.DebugFormat("[REGIONMODULES]: Found shared region module {0}, class {1}", node.Id, node.Type);
m_sharedModules.Add(node);
loadedModuleData[0]++;
}
}
else if (node.Type.GetInterface(typeof(INonSharedRegionModule).ToString()) != null)
{
if (CheckModuleEnabled(node, modulesConfig))
{
m_log.DebugFormat("[REGIONMODULES]: Found non-shared region module {0}, class {1}", node.Id, node.Type);
m_nonSharedModules.Add(node);
loadedModuleData[1]++;
}
}
else
{
m_log.WarnFormat("[REGIONMODULES]: Found unknown type of module {0}, class {1}", node.Id, node.Type);
loadedModuleData[2]++;
}
}
// We don't do that here
//
public void Initialise ()
@@ -215,6 +233,7 @@ namespace OpenSim.ApplicationPlugins.RegionModulesController
m_sharedInstances[0].Close();
m_sharedInstances.RemoveAt(0);
}
m_sharedModules.Clear();
m_nonSharedModules.Clear();
}

View File

@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.6.*")]
[assembly: AssemblyVersion("0.8.1.*")]

View File

@@ -28,6 +28,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Xml;
using System.Net;
@@ -51,6 +52,7 @@ using OpenSim.Services.Interfaces;
using PresenceInfo = OpenSim.Services.Interfaces.PresenceInfo;
using GridRegion = OpenSim.Services.Interfaces.GridRegion;
using PermissionMask = OpenSim.Framework.PermissionMask;
using RegionInfo = OpenSim.Framework.RegionInfo;
namespace OpenSim.ApplicationPlugins.RemoteController
{
@@ -145,6 +147,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
availableMethods["admin_create_user_email"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcCreateUserMethod);
availableMethods["admin_exists_user"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcUserExistsMethod);
availableMethods["admin_update_user"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcUpdateUserAccountMethod);
availableMethods["admin_authenticate_user"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAuthenticateUserMethod);
// Region state management
availableMethods["admin_load_xml"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcLoadXMLMethod);
@@ -159,6 +162,9 @@ namespace OpenSim.ApplicationPlugins.RemoteController
availableMethods["admin_acl_list"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcAccessListList);
availableMethods["admin_estate_reload"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcEstateReload);
// Land management
availableMethods["admin_reset_land"] = (req, ep) => InvokeXmlRpcMethod(req, ep, XmlRpcResetLand);
// Either enable full remote functionality or just selected features
string enabledMethods = m_config.GetString("enabled_methods", "all");
@@ -691,7 +697,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
region.EstateSettings.EstateName = (string) requestData["estate_name"];
region.EstateSettings.EstateOwner = userID;
// Persistence does not seem to effect the need to save a new estate
region.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(region.EstateSettings);
if (!m_application.EstateDataService.LinkRegion(region.RegionID, (int) region.EstateSettings.EstateID))
throw new Exception("Failed to join estate.");
@@ -721,7 +727,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
// If an access specification was provided, use it.
// Otherwise accept the default.
newScene.RegionInfo.EstateSettings.PublicAccess = GetBoolean(requestData, "public", m_publicAccess);
newScene.RegionInfo.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(newScene.RegionInfo.EstateSettings);
// enable voice on newly created region if
// requested by either the XmlRpc request or the
@@ -907,7 +913,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
scene.RegionInfo.EstateSettings.PublicAccess =
GetBoolean(requestData,"public", scene.RegionInfo.EstateSettings.PublicAccess);
if (scene.RegionInfo.Persistent)
scene.RegionInfo.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(scene.RegionInfo.EstateSettings);
if (requestData.ContainsKey("enable_voice"))
{
@@ -1019,7 +1025,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
// Set home position
GridRegion home = scene.GridService.GetRegionByPosition(scopeID,
(int)(regionXLocation * Constants.RegionSize), (int)(regionYLocation * Constants.RegionSize));
(int)Util.RegionToWorldLoc(regionXLocation), (int)Util.RegionToWorldLoc(regionYLocation));
if (null == home)
{
m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", firstName, lastName);
@@ -1249,7 +1255,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
if ((null != regionXLocation) && (null != regionYLocation))
{
GridRegion home = scene.GridService.GetRegionByPosition(scopeID,
(int)(regionXLocation * Constants.RegionSize), (int)(regionYLocation * Constants.RegionSize));
(int)Util.RegionToWorldLoc((uint)regionXLocation), (int)Util.RegionToWorldLoc((uint)regionYLocation));
if (null == home) {
m_log.WarnFormat("[RADMIN]: Unable to set home region for updated user account {0} {1}", firstName, lastName);
} else {
@@ -1280,6 +1286,139 @@ namespace OpenSim.ApplicationPlugins.RemoteController
}
}
/// <summary>
/// Authenticate an user.
/// <summary>
/// <param name="request">incoming XML RPC request</param>
/// <remarks>
/// XmlRpcAuthenticateUserMethod takes the following XMLRPC
/// parameters
/// <list type="table">
/// <listheader><term>parameter name</term><description>description</description></listheader>
/// <item><term>password</term>
/// <description>admin password as set in OpenSim.ini</description></item>
/// <item><term>user_firstname</term>
/// <description>avatar's first name</description></item>
/// <item><term>user_lastname</term>
/// <description>avatar's last name</description></item>
/// <item><term>user_password</term>
/// <description>MD5 hash of avatar's password</description></item>
/// <item><term>token_lifetime</term>
/// <description>the lifetime of the returned token (upper bounded to 30s)</description></item>
/// </list>
///
/// XmlRpcAuthenticateUserMethod returns
/// <list type="table">
/// <listheader><term>name</term><description>description</description></listheader>
/// <item><term>success</term>
/// <description>true or false</description></item>
/// <item><term>token</term>
/// <description>the authentication token sent by OpenSim</description></item>
/// <item><term>error</term>
/// <description>error message if success is false</description></item>
/// </list>
/// </remarks>
private void XmlRpcAuthenticateUserMethod(XmlRpcRequest request, XmlRpcResponse response,
IPEndPoint remoteClient)
{
m_log.Info("[RADMIN]: AuthenticateUser: new request");
var responseData = (Hashtable)response.Value;
var requestData = (Hashtable)request.Params[0];
lock (m_requestLock)
{
try
{
CheckStringParameters(requestData, responseData, new[]
{
"user_firstname",
"user_lastname",
"user_password",
"token_lifetime"
});
var firstName = (string)requestData["user_firstname"];
var lastName = (string)requestData["user_lastname"];
var password = (string)requestData["user_password"];
var scene = m_application.SceneManager.CurrentOrFirstScene;
if (scene.Equals(null))
{
m_log.Debug("scene does not exist");
throw new Exception("Scene does not exist.");
}
var scopeID = scene.RegionInfo.ScopeID;
var account = scene.UserAccountService.GetUserAccount(scopeID, firstName, lastName);
if (account.Equals(null) || account.PrincipalID.Equals(UUID.Zero))
{
m_log.DebugFormat("avatar {0} {1} does not exist", firstName, lastName);
throw new Exception(String.Format("avatar {0} {1} does not exist", firstName, lastName));
}
if (String.IsNullOrEmpty(password))
{
m_log.DebugFormat("[RADMIN]: AuthenticateUser: no password provided for {0} {1}", firstName,
lastName);
throw new Exception(String.Format("no password provided for {0} {1}", firstName,
lastName));
}
int lifetime;
if (int.TryParse((string)requestData["token_lifetime"], NumberStyles.Integer, CultureInfo.InvariantCulture, out lifetime) == false)
{
m_log.DebugFormat("[RADMIN]: AuthenticateUser: no token lifetime provided for {0} {1}", firstName,
lastName);
throw new Exception(String.Format("no token lifetime provided for {0} {1}", firstName,
lastName));
}
// Upper bound on lifetime set to 30s.
if (lifetime > 30)
{
m_log.DebugFormat("[RADMIN]: AuthenticateUser: token lifetime longer than 30s for {0} {1}", firstName,
lastName);
throw new Exception(String.Format("token lifetime longer than 30s for {0} {1}", firstName,
lastName));
}
var authModule = scene.RequestModuleInterface<IAuthenticationService>();
if (authModule == null)
{
m_log.Debug("[RADMIN]: AuthenticateUser: no authentication module loded");
throw new Exception("no authentication module loaded");
}
var token = authModule.Authenticate(account.PrincipalID, password, lifetime);
if (String.IsNullOrEmpty(token))
{
m_log.DebugFormat("[RADMIN]: AuthenticateUser: authentication failed for {0} {1}", firstName,
lastName);
throw new Exception(String.Format("authentication failed for {0} {1}", firstName,
lastName));
}
m_log.DebugFormat("[RADMIN]: AuthenticateUser: account for user {0} {1} identified with token {2}",
firstName, lastName, token);
responseData["token"] = token;
responseData["success"] = true;
}
catch (Exception e)
{
responseData["success"] = false;
responseData["error"] = e.Message;
throw e;
}
m_log.Info("[RADMIN]: AuthenticateUser: request complete");
}
}
/// <summary>
/// Load an OAR file into a region..
/// <summary>
@@ -1348,8 +1487,11 @@ namespace OpenSim.ApplicationPlugins.RemoteController
}
IRegionArchiverModule archiver = scene.RequestModuleInterface<IRegionArchiverModule>();
Dictionary<string, object> archiveOptions = new Dictionary<string,object>();
if (mergeOar) archiveOptions.Add("merge", null);
if (skipAssets) archiveOptions.Add("skipAssets", null);
if (archiver != null)
archiver.DearchiveRegion(filename, mergeOar, skipAssets, Guid.Empty);
archiver.DearchiveRegion(filename, Guid.Empty, archiveOptions);
else
throw new Exception("Archiver module not present for scene");
@@ -1408,7 +1550,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
/// </remarks>
private void XmlRpcSaveOARMethod(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
{
m_log.Info("[RADMIN]: Received Save OAR Administrator Request");
m_log.Info("[RADMIN]: Received Save OAR Request");
Hashtable responseData = (Hashtable)response.Value;
Hashtable requestData = (Hashtable)request.Params[0];
@@ -1454,8 +1596,14 @@ namespace OpenSim.ApplicationPlugins.RemoteController
if (archiver != null)
{
Guid requestId = Guid.NewGuid();
scene.EventManager.OnOarFileSaved += RemoteAdminOarSaveCompleted;
archiver.ArchiveRegion(filename, options);
m_log.InfoFormat(
"[RADMIN]: Submitting save OAR request for {0} to file {1}, request ID {2}",
scene.Name, filename, requestId);
archiver.ArchiveRegion(filename, requestId, options);
lock (m_saveOarLock)
Monitor.Wait(m_saveOarLock,5000);
@@ -1476,12 +1624,16 @@ namespace OpenSim.ApplicationPlugins.RemoteController
throw e;
}
m_log.Info("[RADMIN]: Save OAR Administrator Request complete");
m_log.Info("[RADMIN]: Save OAR Request complete");
}
private void RemoteAdminOarSaveCompleted(Guid uuid, string name)
{
m_log.DebugFormat("[RADMIN]: File processing complete for {0}", name);
if (name != "")
m_log.ErrorFormat("[RADMIN]: Saving of OAR file with request ID {0} failed with message {1}", uuid, name);
else
m_log.DebugFormat("[RADMIN]: Saved OAR file for request {0}", uuid);
lock (m_saveOarLock)
Monitor.Pulse(m_saveOarLock);
}
@@ -1643,7 +1795,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
scene.RegionInfo.EstateSettings.EstateAccess = new UUID[]{};
if (scene.RegionInfo.Persistent)
scene.RegionInfo.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(scene.RegionInfo.EstateSettings);
m_log.Info("[RADMIN]: Access List Clear Request complete");
}
@@ -1689,7 +1841,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
}
scene.RegionInfo.EstateSettings.EstateAccess = accessControlList.ToArray();
if (scene.RegionInfo.Persistent)
scene.RegionInfo.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(scene.RegionInfo.EstateSettings);
}
responseData["added"] = addedUsers;
@@ -1738,7 +1890,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
}
scene.RegionInfo.EstateSettings.EstateAccess = accessControlList.ToArray();
if (scene.RegionInfo.Persistent)
scene.RegionInfo.EstateSettings.Save();
m_application.EstateDataService.StoreEstateSettings(scene.RegionInfo.EstateSettings);
}
responseData["removed"] = removedUsers;
@@ -1914,6 +2066,56 @@ namespace OpenSim.ApplicationPlugins.RemoteController
responseData["success"] = true;
}
private void XmlRpcResetLand(XmlRpcRequest request, XmlRpcResponse response, IPEndPoint remoteClient)
{
Hashtable requestData = (Hashtable)request.Params[0];
Hashtable responseData = (Hashtable)response.Value;
string musicURL = string.Empty;
UUID groupID = UUID.Zero;
uint flags = 0;
bool set_group = false, set_music = false, set_flags = false;
if (requestData.Contains("group") && requestData["group"] != null)
set_group = UUID.TryParse(requestData["group"].ToString(), out groupID);
if (requestData.Contains("music") && requestData["music"] != null)
{
musicURL = requestData["music"].ToString();
set_music = true;
}
if (requestData.Contains("flags") && requestData["flags"] != null)
set_flags = UInt32.TryParse(requestData["flags"].ToString(), out flags);
m_log.InfoFormat("[RADMIN]: Received Reset Land Request group={0} musicURL={1} flags={2}",
(set_group ? groupID.ToString() : "unchanged"),
(set_music ? musicURL : "unchanged"),
(set_flags ? flags.ToString() : "unchanged"));
m_application.SceneManager.ForEachScene(delegate(Scene s)
{
List<ILandObject> parcels = s.LandChannel.AllParcels();
foreach (ILandObject p in parcels)
{
if (set_music)
p.LandData.MusicURL = musicURL;
if (set_group)
p.LandData.GroupID = groupID;
if (set_flags)
p.LandData.Flags = flags;
s.LandChannel.UpdateLandObject(p.LandData.LocalID, p.LandData);
}
}
);
responseData["success"] = true;
m_log.Info("[RADMIN]: Reset Land Request complete");
}
/// <summary>
/// Parse a float with the given parameter name from a request data hash table.
/// </summary>
@@ -2089,7 +2291,6 @@ namespace OpenSim.ApplicationPlugins.RemoteController
{
account.ServiceURLs = new Dictionary<string, object>();
account.ServiceURLs["HomeURI"] = string.Empty;
account.ServiceURLs["GatekeeperURI"] = string.Empty;
account.ServiceURLs["InventoryServerURI"] = string.Empty;
account.ServiceURLs["AssetServerURI"] = string.Empty;
}
@@ -2617,15 +2818,13 @@ namespace OpenSim.ApplicationPlugins.RemoteController
/// </summary>
private void ApplyNextOwnerPermissions(InventoryItemBase item)
{
if (item.InvType == (int)InventoryType.Object && (item.CurrentPermissions & 7) != 0)
if (item.InvType == (int)InventoryType.Object)
{
if ((item.CurrentPermissions & ((uint)PermissionMask.Copy >> 13)) == 0)
item.CurrentPermissions &= ~(uint)PermissionMask.Copy;
if ((item.CurrentPermissions & ((uint)PermissionMask.Transfer >> 13)) == 0)
item.CurrentPermissions &= ~(uint)PermissionMask.Transfer;
if ((item.CurrentPermissions & ((uint)PermissionMask.Modify >> 13)) == 0)
item.CurrentPermissions &= ~(uint)PermissionMask.Modify;
uint perms = item.CurrentPermissions;
PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref perms);
item.CurrentPermissions = perms;
}
item.CurrentPermissions &= item.NextPermissions;
item.BasePermissions &= item.NextPermissions;
item.EveryOnePermissions &= item.NextPermissions;
@@ -2737,7 +2936,7 @@ namespace OpenSim.ApplicationPlugins.RemoteController
// Set home position
GridRegion home = scene.GridService.GetRegionByPosition(scopeID,
(int)(regionXLocation * Constants.RegionSize), (int)(regionYLocation * Constants.RegionSize));
(int)Util.RegionToWorldLoc(regionXLocation), (int)Util.RegionToWorldLoc(regionYLocation));
if (null == home) {
m_log.WarnFormat("[RADMIN]: Unable to set home region for newly created user account {0} {1}", names[0], names[1]);
} else {

View File

@@ -50,8 +50,7 @@ namespace OpenSim.Framework.Capabilities
public class Caps
{
// private static readonly ILog m_log =
// LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private string m_httpListenerHostName;
private uint m_httpListenPort;
@@ -152,6 +151,10 @@ namespace OpenSim.Framework.Capabilities
public void RegisterPollHandler(string capName, PollServiceEventArgs pollServiceHandler)
{
// m_log.DebugFormat(
// "[CAPS]: Registering handler with name {0}, url {1} for {2}",
// capName, pollServiceHandler.Url, m_agentID, m_regionName);
m_pollServiceHandlers.Add(capName, pollServiceHandler);
m_httpListener.AddPollServiceHTTPHandler(pollServiceHandler.Url, pollServiceHandler);

View File

@@ -56,12 +56,15 @@ namespace OpenSim.Capabilities.Handlers
public const string DefaultFormat = "x-j2c";
// TODO: Change this to a config option
const string REDIRECT_URL = null;
private string m_RedirectURL = null;
public GetTextureHandler(string path, IAssetService assService, string name, string description)
public GetTextureHandler(string path, IAssetService assService, string name, string description, string redirectURL)
: base("GET", path, name, description)
{
m_assetService = assService;
m_RedirectURL = redirectURL;
if (m_RedirectURL != null && !m_RedirectURL.EndsWith("/"))
m_RedirectURL += "/";
}
protected override byte[] ProcessRequest(string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse)
@@ -85,7 +88,7 @@ namespace OpenSim.Capabilities.Handlers
// m_log.DebugFormat("[GETTEXTURE]: Received request for texture id {0}", textureID);
string[] formats;
if (format != null && format != string.Empty)
if (!string.IsNullOrEmpty(format))
{
formats = new string[1] { format.ToLower() };
}
@@ -134,7 +137,7 @@ namespace OpenSim.Capabilities.Handlers
if (format != DefaultFormat)
fullID = fullID + "-" + format;
if (!String.IsNullOrEmpty(REDIRECT_URL))
if (!String.IsNullOrEmpty(m_RedirectURL))
{
// Only try to fetch locally cached textures. Misses are redirected
texture = m_assetService.GetCached(fullID);
@@ -150,8 +153,9 @@ namespace OpenSim.Capabilities.Handlers
}
else
{
string textureUrl = REDIRECT_URL + textureID.ToString();
string textureUrl = m_RedirectURL + "?texture_id="+ textureID.ToString();
m_log.Debug("[GETTEXTURE]: Redirecting texture request to " + textureUrl);
httpResponse.StatusCode = (int)OSHttpStatusCode.RedirectMovedPermanently;
httpResponse.RedirectLocation = textureUrl;
return true;
}

View File

@@ -62,8 +62,10 @@ namespace OpenSim.Capabilities.Handlers
if (m_AssetService == null)
throw new Exception(String.Format("Failed to load AssetService from {0}; config is {1}", assetService, m_ConfigName));
string rurl = serverConfig.GetString("GetTextureRedirectURL");
;
server.AddStreamHandler(
new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService, "GetTexture", null));
new GetTextureHandler("/CAPS/GetTexture/" /*+ UUID.Random() */, m_AssetService, "GetTexture", null, rurl));
}
}
}

View File

@@ -52,7 +52,7 @@ namespace OpenSim.Capabilities.Handlers.GetTexture.Tests
// Overkill - we only really need the asset service, not a whole scene.
Scene scene = new SceneHelpers().SetupScene();
GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService, "TestGetTexture", null);
GetTextureHandler handler = new GetTextureHandler(null, scene.AssetService, "TestGetTexture", null, null);
TestOSHttpRequest req = new TestOSHttpRequest();
TestOSHttpResponse resp = new TestOSHttpResponse();
req.Url = new Uri("http://localhost/?texture_id=00000000-0000-1111-9999-000000000012");

View File

@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
// Build Number
// Revision
//
[assembly: AssemblyVersion("0.7.6.*")]
[assembly: AssemblyVersion("0.8.1.*")]

View File

@@ -238,7 +238,15 @@ namespace OpenSim.Capabilities.Handlers
if (folderID != UUID.Zero)
{
contents = m_InventoryService.GetFolderContent(agentID, folderID);
InventoryCollection fetchedContents = m_InventoryService.GetFolderContent(agentID, folderID);
if (fetchedContents == null)
{
m_log.WarnFormat("[WEB FETCH INV DESC HANDLER]: Could not get contents of folder {0} for user {1}", folderID, agentID);
return contents;
}
contents = fetchedContents;
InventoryFolderBase containingFolder = new InventoryFolderBase();
containingFolder.ID = folderID;
containingFolder.Owner = agentID;

View File

@@ -37,9 +37,8 @@ namespace OpenSim.Data
public abstract class AssetDataBase : IAssetDataPlugin
{
public abstract AssetBase GetAsset(UUID uuid);
public abstract void StoreAsset(AssetBase asset);
public abstract bool ExistsAsset(UUID uuid);
public abstract bool[] AssetsExist(UUID[] uuids);
public abstract List<AssetMetadata> FetchAssetMetadataSet(int start, int count);

View File

@@ -35,7 +35,7 @@ namespace OpenSim.Data
{
AssetBase GetAsset(UUID uuid);
void StoreAsset(AssetBase asset);
bool ExistsAsset(UUID uuid);
bool[] AssetsExist(UUID[] uuids);
List<AssetMetadata> FetchAssetMetadataSet(int start, int count);
void Initialise(string connect);
bool Delete(string id);

View File

@@ -29,7 +29,7 @@ using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Framework;
namespace OpenSim.Region.Framework.Interfaces
namespace OpenSim.Data
{
public interface IEstateDataStore
{

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -34,6 +34,7 @@ namespace OpenSim.Data
public class OfflineIMData
{
public UUID PrincipalID;
public UUID FromID;
public Dictionary<string, string> Data;
}

View File

@@ -48,6 +48,8 @@ namespace OpenSim.Data
bool UpdateAvatarProperties(ref UserProfileProperties props, ref string result);
bool UpdateAvatarInterests(UserProfileProperties up, ref string result);
bool GetClassifiedInfo(ref UserClassifiedAdd ad, ref string result);
bool UpdateUserPreferences(ref UserPreferences pref, ref string result);
bool GetUserPreferences(ref UserPreferences pref, ref string result);
bool GetUserAppData(ref UserAppData props, ref string result);
bool SetUserAppData(UserAppData props, ref string result);
OSDArray GetUserImageAssets(UUID avatarId);

View File

@@ -54,12 +54,12 @@ namespace OpenSim.Data
/// <summary>
/// Return the x-coordinate of this region.
/// </summary>
public int coordX { get { return posX / (int)Constants.RegionSize; } }
public int coordX { get { return (int)Util.WorldToRegionLoc((uint)posX); } }
/// <summary>
/// Return the y-coordinate of this region.
/// </summary>
public int coordY { get { return posY / (int)Constants.RegionSize; } }
public int coordY { get { return (int)Util.WorldToRegionLoc((uint)posY); } }
public Dictionary<string, object> Data;
}
@@ -81,6 +81,7 @@ namespace OpenSim.Data
bool Delete(UUID regionID);
List<RegionData> GetDefaultRegions(UUID scopeID);
List<RegionData> GetDefaultHypergridRegions(UUID scopeID);
List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y);
List<RegionData> GetHyperlinks(UUID scopeID);
}

View File

@@ -39,7 +39,7 @@ namespace OpenSim.Data
{
AssetBase GetAsset(UUID uuid);
void StoreAsset(AssetBase asset);
bool ExistsAsset(UUID uuid);
bool[] AssetsExist(UUID[] uuids);
List<AssetMetadata> FetchAssetMetadataSet(int start, int count);
void Initialise(string connect);
bool Delete(string id);

View File

@@ -48,9 +48,57 @@ namespace OpenSim.Data
public ulong everyonePowers;
public ulong ownersPowers;
public Dictionary<UUID, XGroupMember> members = new Dictionary<UUID, XGroupMember>();
public Dictionary<UUID, XGroupNotice> notices = new Dictionary<UUID, XGroupNotice>();
public XGroup Clone()
{
return (XGroup)MemberwiseClone();
XGroup clone = (XGroup)MemberwiseClone();
clone.members = new Dictionary<UUID, XGroupMember>();
clone.notices = new Dictionary<UUID, XGroupNotice>();
foreach (KeyValuePair<UUID, XGroupMember> kvp in members)
clone.members[kvp.Key] = kvp.Value.Clone();
foreach (KeyValuePair<UUID, XGroupNotice> kvp in notices)
clone.notices[kvp.Key] = kvp.Value.Clone();
return clone;
}
}
public class XGroupMember
{
public UUID agentID;
public UUID groupID;
public UUID roleID;
public bool acceptNotices = true;
public bool listInProfile = true;
public XGroupMember Clone()
{
return (XGroupMember)MemberwiseClone();
}
}
public class XGroupNotice
{
public UUID groupID;
public UUID noticeID;
public uint timestamp;
public string fromName;
public string subject;
public string message;
public byte[] binaryBucket;
public bool hasAttachment;
public int assetType;
public XGroupNotice Clone()
{
XGroupNotice clone = (XGroupNotice)MemberwiseClone();
clone.binaryBucket = (byte[])binaryBucket.Clone();
return clone;
}
}
@@ -58,14 +106,13 @@ namespace OpenSim.Data
/// Early stub interface for groups data, not final.
/// </summary>
/// <remarks>
/// Currently in-use only for regression test purposes. Needs to be filled out over time.
/// Currently in-use only for regression test purposes.
/// </remarks>
public interface IXGroupData
{
bool StoreGroup(XGroup group);
XGroup[] GetGroups(string field, string val);
XGroup[] GetGroups(string[] fields, string[] vals);
bool DeleteGroups(string field, string val);
bool DeleteGroups(string[] fields, string[] vals);
XGroup GetGroup(UUID groupID);
Dictionary<UUID, XGroup> GetGroups();
bool DeleteGroup(UUID groupID);
}
}

View File

@@ -160,18 +160,18 @@ namespace OpenSim.Data.MSSQL
@temporary, @create_time, @access_time, @creatorid, @asset_flags, @data)";
string assetName = asset.Name;
if (asset.Name.Length > 64)
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
{
assetName = asset.Name.Substring(0, 64);
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
m_log.WarnFormat(
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
}
string assetDescription = asset.Description;
if (asset.Description.Length > 64)
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
{
assetDescription = asset.Description.Substring(0, 64);
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
m_log.WarnFormat(
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
@@ -225,17 +225,38 @@ namespace OpenSim.Data.MSSQL
// }
/// <summary>
/// Check if asset exist in m_database
/// Check if the assets exist in the database.
/// </summary>
/// <param name="uuid"></param>
/// <returns>true if exist.</returns>
override public bool ExistsAsset(UUID uuid)
/// <param name="uuids">The assets' IDs</param>
/// <returns>For each asset: true if it exists, false otherwise</returns>
public override bool[] AssetsExist(UUID[] uuids)
{
if (GetAsset(uuid) != null)
if (uuids.Length == 0)
return new bool[0];
HashSet<UUID> exist = new HashSet<UUID>();
string ids = "'" + string.Join("','", uuids) + "'";
string sql = string.Format("SELECT id FROM assets WHERE id IN ({0})", ids);
using (SqlConnection conn = new SqlConnection(m_connectionString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
return true;
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
UUID id = DBGuid.FromDB(reader["id"]);
exist.Add(id);
}
}
}
return false;
bool[] results = new bool[uuids.Length];
for (int i = 0; i < uuids.Length; i++)
results[i] = exist.Contains(uuids[i]);
return results;
}
/// <summary>

View File

@@ -1,4 +1,4 @@
/*
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
@@ -55,7 +55,7 @@ namespace OpenSim.Data.MSSQL
return Delete(principalID.ToString(), friend);
}
public bool Delete(string principalID, string friend)
public override bool Delete(string principalID, string friend)
{
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
using (SqlCommand cmd = new SqlCommand())

View File

@@ -315,6 +315,11 @@ namespace OpenSim.Data.MSSQL
return Get((int)RegionFlags.DefaultRegion, scopeID);
}
public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
{
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
}
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
{
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);

View File

@@ -49,6 +49,7 @@ namespace OpenSim.Data.MSSQL
// private static FileSystemDataStore Instance = new FileSystemDataStore();
private static readonly ILog _Log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static string LogHeader = "[REGION DB MSSQL]";
/// <summary>
/// The database manager
@@ -351,7 +352,7 @@ IF EXISTS (SELECT UUID FROM prims WHERE UUID = @UUID)
ScriptAccessPin = @ScriptAccessPin, AllowedDrop = @AllowedDrop, DieAtEdge = @DieAtEdge, SalePrice = @SalePrice,
SaleType = @SaleType, ColorR = @ColorR, ColorG = @ColorG, ColorB = @ColorB, ColorA = @ColorA, ParticleSystem = @ParticleSystem,
ClickAction = @ClickAction, Material = @Material, CollisionSound = @CollisionSound, CollisionSoundVolume = @CollisionSoundVolume, PassTouches = @PassTouches,
LinkNumber = @LinkNumber, MediaURL = @MediaURL, DynAttrs = @DynAttrs,
LinkNumber = @LinkNumber, MediaURL = @MediaURL, AttachedPosX = @AttachedPosX, AttachedPosY = @AttachedPosY, AttachedPosZ = @AttachedPosZ, DynAttrs = @DynAttrs,
PhysicsShapeType = @PhysicsShapeType, Density = @Density, GravityModifier = @GravityModifier, Friction = @Friction, Restitution = @Restitution
WHERE UUID = @UUID
END
@@ -367,7 +368,7 @@ ELSE
PayPrice, PayButton1, PayButton2, PayButton3, PayButton4, LoopedSound, LoopedSoundGain, TextureAnimation, OmegaX,
OmegaY, OmegaZ, CameraEyeOffsetX, CameraEyeOffsetY, CameraEyeOffsetZ, CameraAtOffsetX, CameraAtOffsetY, CameraAtOffsetZ,
ForceMouselook, ScriptAccessPin, AllowedDrop, DieAtEdge, SalePrice, SaleType, ColorR, ColorG, ColorB, ColorA,
ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber, MediaURL, DynAttrs,
ParticleSystem, ClickAction, Material, CollisionSound, CollisionSoundVolume, PassTouches, LinkNumber, MediaURL, AttachedPosX, AttachedPosY, AttachedPosZ, DynAttrs,
PhysicsShapeType, Density, GravityModifier, Friction, Restitution
) VALUES (
@UUID, @CreationDate, @Name, @Text, @Description, @SitName, @TouchName, @ObjectFlags, @OwnerMask, @NextOwnerMask, @GroupMask,
@@ -378,7 +379,7 @@ ELSE
@PayPrice, @PayButton1, @PayButton2, @PayButton3, @PayButton4, @LoopedSound, @LoopedSoundGain, @TextureAnimation, @OmegaX,
@OmegaY, @OmegaZ, @CameraEyeOffsetX, @CameraEyeOffsetY, @CameraEyeOffsetZ, @CameraAtOffsetX, @CameraAtOffsetY, @CameraAtOffsetZ,
@ForceMouselook, @ScriptAccessPin, @AllowedDrop, @DieAtEdge, @SalePrice, @SaleType, @ColorR, @ColorG, @ColorB, @ColorA,
@ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber, @MediaURL, @DynAttrs,
@ParticleSystem, @ClickAction, @Material, @CollisionSound, @CollisionSoundVolume, @PassTouches, @LinkNumber, @MediaURL, @AttachedPosX, @AttachedPosY, @AttachedPosZ, @DynAttrs,
@PhysicsShapeType, @Density, @GravityModifier, @Friction, @Restitution
)
END";
@@ -530,43 +531,53 @@ ELSE
/// <returns></returns>
public double[,] LoadTerrain(UUID regionID)
{
double[,] terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize];
terrain.Initialize();
double[,] ret = null;
TerrainData terrData = LoadTerrain(regionID, (int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionHeight);
if (terrData != null)
ret = terrData.GetDoubles();
return ret;
}
// Returns 'null' if region not found
public TerrainData LoadTerrain(UUID regionID, int pSizeX, int pSizeY, int pSizeZ)
{
TerrainData terrData = null;
string sql = "select top 1 RegionUUID, Revision, Heightfield from terrain where RegionUUID = @RegionUUID order by Revision desc";
using (SqlConnection conn = new SqlConnection(m_connectionString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
// MySqlParameter param = new MySqlParameter();
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
int rev;
if (reader.Read())
// MySqlParameter param = new MySqlParameter();
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
conn.Open();
using (SqlDataReader reader = cmd.ExecuteReader())
{
MemoryStream str = new MemoryStream((byte[])reader["Heightfield"]);
BinaryReader br = new BinaryReader(str);
for (int x = 0; x < (int)Constants.RegionSize; x++)
int rev;
if (reader.Read())
{
for (int y = 0; y < (int)Constants.RegionSize; y++)
{
terrain[x, y] = br.ReadDouble();
}
rev = (int)reader["Revision"];
byte[] blob = (byte[])reader["Heightfield"];
terrData = TerrainData.CreateFromDatabaseBlobFactory(pSizeX, pSizeY, pSizeZ, rev, blob);
}
rev = (int)reader["Revision"];
else
{
_Log.Info("[REGION DB]: No terrain found for region");
return null;
}
_Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
}
else
{
_Log.Info("[REGION DB]: No terrain found for region");
return null;
}
_Log.Info("[REGION DB]: Loaded terrain revision r" + rev);
}
}
return terrain;
return terrData;
}
// Legacy entry point for when terrain was always a 256x256 hieghtmap
public void StoreTerrain(double[,] ter, UUID regionID)
{
StoreTerrain(new HeightmapTerrainData(ter), regionID);
}
/// <summary>
@@ -574,10 +585,8 @@ ELSE
/// </summary>
/// <param name="terrain">terrain map data.</param>
/// <param name="regionID">regionID.</param>
public void StoreTerrain(double[,] terrain, UUID regionID)
public void StoreTerrain(TerrainData terrData, UUID regionID)
{
int revision = Util.UnixTimeSinceEpoch();
//Delete old terrain map
string sql = "delete from terrain where RegionUUID=@RegionUUID";
using (SqlConnection conn = new SqlConnection(m_connectionString))
@@ -590,17 +599,23 @@ ELSE
sql = "insert into terrain(RegionUUID, Revision, Heightfield) values(@RegionUUID, @Revision, @Heightfield)";
int terrainDBRevision;
Array terrainDBblob;
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
using (SqlConnection conn = new SqlConnection(m_connectionString))
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
cmd.Parameters.Add(_Database.CreateParameter("@Revision", revision));
cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", serializeTerrain(terrain)));
conn.Open();
cmd.ExecuteNonQuery();
using (SqlCommand cmd = new SqlCommand(sql, conn))
{
cmd.Parameters.Add(_Database.CreateParameter("@RegionUUID", regionID));
cmd.Parameters.Add(_Database.CreateParameter("@Revision", terrainDBRevision));
cmd.Parameters.Add(_Database.CreateParameter("@Heightfield", terrainDBblob));
conn.Open();
cmd.ExecuteNonQuery();
}
}
_Log.Info("[REGION DB]: Stored terrain revision r " + revision);
_Log.InfoFormat("{0} Stored terrain revision r={1}", LogHeader, terrainDBRevision);
}
/// <summary>
@@ -1344,30 +1359,6 @@ VALUES
#region Private Methods
/// <summary>
/// Serializes the terrain data for storage in DB.
/// </summary>
/// <param name="val">terrain data</param>
/// <returns></returns>
private static Array serializeTerrain(double[,] val)
{
MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) * sizeof(double));
BinaryWriter bw = new BinaryWriter(str);
// TODO: COMPATIBILITY - Add byte-order conversions
for (int x = 0; x < (int)Constants.RegionSize; x++)
for (int y = 0; y < (int)Constants.RegionSize; y++)
{
double height = val[x, y];
if (height == 0.0)
height = double.Epsilon;
bw.Write(height);
}
return str.ToArray();
}
/// <summary>
/// Stores new regionsettings.
/// </summary>
@@ -1695,6 +1686,12 @@ VALUES
if (!(primRow["MediaURL"] is System.DBNull))
prim.MediaUrl = (string)primRow["MediaURL"];
if (!(primRow["AttachedPosX"] is System.DBNull))
prim.AttachedPos = new Vector3(
Convert.ToSingle(primRow["AttachedPosX"]),
Convert.ToSingle(primRow["AttachedPosY"]),
Convert.ToSingle(primRow["AttachedPosZ"]));
if (!(primRow["DynAttrs"] is System.DBNull))
prim.DynAttrs = DAMap.FromXml((string)primRow["DynAttrs"]);
else
@@ -2099,7 +2096,10 @@ VALUES
parameters.Add(_Database.CreateParameter("PassTouches", 0));
parameters.Add(_Database.CreateParameter("LinkNumber", prim.LinkNum));
parameters.Add(_Database.CreateParameter("MediaURL", prim.MediaUrl));
parameters.Add(_Database.CreateParameter("AttachedPosX", prim.AttachedPos.X));
parameters.Add(_Database.CreateParameter("AttachedPosY", prim.AttachedPos.Y));
parameters.Add(_Database.CreateParameter("AttachedPosZ", prim.AttachedPos.Z));
if (prim.DynAttrs.CountNamespaces > 0)
parameters.Add(_Database.CreateParameter("DynAttrs", prim.DynAttrs.ToXml()));
else

View File

@@ -278,7 +278,7 @@ namespace OpenSim.Data.MSSQL
// m_log.DebugFormat("[MYSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
// Util.PrintCallStack();
string sql = "update inventoryfolders set version=version+1 where folderID = ?folderID";
string sql = "update inventoryfolders set version=version+1 where folderID = @folderID";
using (SqlConnection conn = new SqlConnection(m_ConnectionString))
{

View File

@@ -61,5 +61,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly : AssemblyVersion("0.7.6.*")]
[assembly : AssemblyVersion("0.8.1.*")]

View File

@@ -331,4 +331,12 @@ ALTER TABLE dbo.estate_map ADD CONSTRAINT
COMMIT
:VERSION 10
BEGIN transaction
ALTER TABLE estate_settings ADD AllowLandmark tinyint NOT NULL default 1;
ALTER TABLE estate_settings ADD AllowParcelChanges tinyint NOT NULL default 1;
ALTER TABLE estate_settings ADD AllowSetHome tinyint NOT NULL default 1;
COMMIT;

View File

@@ -1,4 +1,4 @@
:VERSION 1
:VERSION 1
BEGIN TRANSACTION
@@ -26,6 +26,14 @@ COMMIT
BEGIN TRANSACTION
ALTER TABLE Presence ADD LastSeen DateTime
ALTER TABLE Presence ADD LastSeen DateTime;
COMMIT
COMMIT
:VERSION 3
BEGIN TRANSACTION
CREATE INDEX RegionID ON Presence(RegionID);
COMMIT

View File

@@ -1161,10 +1161,22 @@ COMMIT
BEGIN TRANSACTION
ALTER TABLE prims ADD `PhysicsShapeType` tinyint(4) NOT NULL default '0';
ALTER TABLE prims ADD `Density` double NOT NULL default '1000';
ALTER TABLE prims ADD `GravityModifier` double NOT NULL default '1';
ALTER TABLE prims ADD `Friction` double NOT NULL default '0.6';
ALTER TABLE prims ADD `Restitution` double NOT NULL default '0.5';
ALTER TABLE prims ADD PhysicsShapeType tinyint NOT NULL default 0;
ALTER TABLE prims ADD Density float NOT NULL default 1000;
ALTER TABLE prims ADD GravityModifier float NOT NULL default 1;
ALTER TABLE prims ADD Friction float NOT NULL default 0.6;
ALTER TABLE prims ADD Restitution float NOT NULL default 0.5;
COMMIT
:VERSION 40 #---------------- Save Attachment info
BEGIN TRANSACTION
ALTER TABLE prims ADD AttachedPosX float(53) default 0.0;
ALTER TABLE prims ADD AttachedPosY float(53) default 0.0;
ALTER TABLE prims ADD AttachedPosZ float(53) default 0.0;
ALTER TABLE primshapes ADD LastAttachPoint int not null default 0;
COMMIT

View File

@@ -171,18 +171,18 @@ namespace OpenSim.Data.MySQL
dbcon))
{
string assetName = asset.Name;
if (asset.Name.Length > 64)
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
{
assetName = asset.Name.Substring(0, 64);
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
m_log.WarnFormat(
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
}
string assetDescription = asset.Description;
if (asset.Description.Length > 64)
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
{
assetDescription = asset.Description.Substring(0, 64);
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
m_log.WarnFormat(
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
@@ -257,46 +257,44 @@ namespace OpenSim.Data.MySQL
}
/// <summary>
/// Check if the asset exists in the database
/// Check if the assets exist in the database.
/// </summary>
/// <param name="uuid">The asset UUID</param>
/// <returns>true if it exists, false otherwise.</returns>
override public bool ExistsAsset(UUID uuid)
/// <param name="uuidss">The assets' IDs</param>
/// <returns>For each asset: true if it exists, false otherwise</returns>
public override bool[] AssetsExist(UUID[] uuids)
{
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
if (uuids.Length == 0)
return new bool[0];
bool assetExists = false;
HashSet<UUID> exist = new HashSet<UUID>();
string ids = "'" + string.Join("','", uuids) + "'";
string sql = string.Format("SELECT id FROM assets WHERE id IN ({0})", ids);
lock (m_dbLock)
{
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{
dbcon.Open();
using (MySqlCommand cmd = new MySqlCommand("SELECT id FROM assets WHERE id=?id", dbcon))
using (MySqlCommand cmd = new MySqlCommand(sql, dbcon))
{
cmd.Parameters.AddWithValue("?id", uuid.ToString());
try
using (MySqlDataReader dbReader = cmd.ExecuteReader())
{
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
while (dbReader.Read())
{
if (dbReader.Read())
{
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
assetExists = true;
}
UUID id = DBGuid.FromDB(dbReader["id"]);
exist.Add(id);
}
}
catch (Exception e)
{
m_log.Error(
string.Format("[ASSETS DB]: MySql failure fetching asset {0}. Exception ", uuid), e);
}
}
}
}
return assetExists;
bool[] results = new bool[uuids.Length];
for (int i = 0; i < uuids.Length; i++)
results[i] = exist.Contains(uuids[i]);
return results;
}
/// <summary>

View File

@@ -145,7 +145,11 @@ namespace OpenSim.Data.MySQL
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("?RegionID", regionID.ToString());
return DoLoad(cmd, regionID, create);
EstateSettings e = DoLoad(cmd, regionID, create);
if (!create && e.EstateID == 0) // Not found
return null;
return e;
}
}
@@ -427,7 +431,10 @@ namespace OpenSim.Data.MySQL
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("?EstateID", estateID);
return DoLoad(cmd, UUID.Zero, false);
EstateSettings e = DoLoad(cmd, UUID.Zero, false);
if (e.EstateID != estateID)
return null;
return e;
}
}

View File

@@ -47,7 +47,7 @@ namespace OpenSim.Data.MySQL
return Delete(principalID.ToString(), friend);
}
public bool Delete(string principalID, string friend)
public override bool Delete(string principalID, string friend)
{
using (MySqlCommand cmd = new MySqlCommand())
{

View File

@@ -86,11 +86,11 @@ namespace OpenSim.Data.MySQL
public GroupData[] RetrieveGroups(string pattern)
{
if (string.IsNullOrEmpty(pattern))
pattern = "1 ORDER BY Name LIMIT 100";
pattern = "1";
else
pattern = string.Format("Name LIKE '%{0}%' ORDER BY Name LIMIT 100", pattern);
pattern = string.Format("Name LIKE '%{0}%'", MySqlHelper.EscapeString(pattern));
return m_Groups.Get(pattern);
return m_Groups.Get(string.Format("ShowInList=1 AND ({0}) ORDER BY Name LIMIT 100", pattern));
}
public bool DeleteGroup(UUID groupID)

View File

@@ -310,6 +310,11 @@ namespace OpenSim.Data.MySQL
return Get((int)RegionFlags.DefaultRegion, scopeID);
}
public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
{
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
}
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
{
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);

View File

@@ -48,6 +48,7 @@ namespace OpenSim.Data.MySQL
public class MySQLSimulationData : ISimulationDataStore
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static string LogHeader = "[REGION DB MYSQL]";
private string m_connectionString;
private object m_dbLock = new object();
@@ -91,7 +92,7 @@ namespace OpenSim.Data.MySQL
}
catch (Exception e)
{
m_log.Error("[REGION DB]: MySQL error in ExecuteReader: " + e.Message);
m_log.ErrorFormat("{0} MySQL error in ExecuteReader: {1}", LogHeader, e);
throw;
}
@@ -173,7 +174,8 @@ namespace OpenSim.Data.MySQL
"ParticleSystem, ClickAction, Material, " +
"CollisionSound, CollisionSoundVolume, " +
"PassTouches, " +
"LinkNumber, MediaURL, KeyframeMotion, " +
"LinkNumber, MediaURL, AttachedPosX, " +
"AttachedPosY, AttachedPosZ, KeyframeMotion, " +
"PhysicsShapeType, Density, GravityModifier, " +
"Friction, Restitution, DynAttrs " +
") values (" + "?UUID, " +
@@ -208,7 +210,8 @@ namespace OpenSim.Data.MySQL
"?ColorB, ?ColorA, ?ParticleSystem, " +
"?ClickAction, ?Material, ?CollisionSound, " +
"?CollisionSoundVolume, ?PassTouches, " +
"?LinkNumber, ?MediaURL, ?KeyframeMotion, " +
"?LinkNumber, ?MediaURL, ?AttachedPosX, " +
"?AttachedPosY, ?AttachedPosZ, ?KeyframeMotion, " +
"?PhysicsShapeType, ?Density, ?GravityModifier, " +
"?Friction, ?Restitution, ?DynAttrs)";
@@ -227,7 +230,7 @@ namespace OpenSim.Data.MySQL
"PathTaperX, PathTaperY, PathTwist, " +
"PathTwistBegin, ProfileBegin, ProfileEnd, " +
"ProfileCurve, ProfileHollow, Texture, " +
"ExtraParams, State, Media) " +
"ExtraParams, State, LastAttachPoint, Media) " +
"values (?UUID, " +
"?Shape, ?ScaleX, ?ScaleY, ?ScaleZ, " +
"?PCode, ?PathBegin, ?PathEnd, " +
@@ -239,7 +242,7 @@ namespace OpenSim.Data.MySQL
"?PathTwistBegin, ?ProfileBegin, " +
"?ProfileEnd, ?ProfileCurve, " +
"?ProfileHollow, ?Texture, ?ExtraParams, " +
"?State, ?Media)";
"?State, ?LastAttachPoint, ?Media)";
FillShapeCommand(cmd, prim);
@@ -570,10 +573,14 @@ namespace OpenSim.Data.MySQL
}
}
// Legacy entry point for when terrain was always a 256x256 hieghtmap
public void StoreTerrain(double[,] ter, UUID regionID)
{
m_log.Info("[REGION DB]: Storing terrain");
StoreTerrain(new HeightmapTerrainData(ter), regionID);
}
public void StoreTerrain(TerrainData terrData, UUID regionID)
{
lock (m_dbLock)
{
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
@@ -587,11 +594,18 @@ namespace OpenSim.Data.MySQL
ExecuteNonQuery(cmd);
cmd.CommandText = "insert into terrain (RegionUUID, " +
"Revision, Heightfield) values (?RegionUUID, " +
"1, ?Heightfield)";
cmd.Parameters.AddWithValue("Heightfield", SerializeTerrain(ter));
int terrainDBRevision;
Array terrainDBblob;
terrData.GetDatabaseBlob(out terrainDBRevision, out terrainDBblob);
m_log.InfoFormat("{0} Storing terrain. X={1}, Y={2}, rev={3}",
LogHeader, terrData.SizeX, terrData.SizeY, terrainDBRevision);
cmd.CommandText = "insert into terrain (RegionUUID, Revision, Heightfield)"
+ "values (?RegionUUID, ?Revision, ?Heightfield)";
cmd.Parameters.AddWithValue("Revision", terrainDBRevision);
cmd.Parameters.AddWithValue("Heightfield", terrainDBblob);
ExecuteNonQuery(cmd);
}
@@ -599,9 +613,20 @@ namespace OpenSim.Data.MySQL
}
}
// Legacy region loading
public double[,] LoadTerrain(UUID regionID)
{
double[,] terrain = null;
double[,] ret = null;
TerrainData terrData = LoadTerrain(regionID, (int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionHeight);
if (terrData != null)
ret = terrData.GetDoubles();
return ret;
}
// Returns 'null' if region not found
public TerrainData LoadTerrain(UUID regionID, int pSizeX, int pSizeY, int pSizeZ)
{
TerrainData terrData = null;
lock (m_dbLock)
{
@@ -621,32 +646,15 @@ namespace OpenSim.Data.MySQL
while (reader.Read())
{
int rev = Convert.ToInt32(reader["Revision"]);
terrain = new double[(int)Constants.RegionSize, (int)Constants.RegionSize];
terrain.Initialize();
using (MemoryStream mstr = new MemoryStream((byte[])reader["Heightfield"]))
{
using (BinaryReader br = new BinaryReader(mstr))
{
for (int x = 0; x < (int)Constants.RegionSize; x++)
{
for (int y = 0; y < (int)Constants.RegionSize; y++)
{
terrain[x, y] = br.ReadDouble();
}
}
}
m_log.InfoFormat("[REGION DB]: Loaded terrain revision r{0}", rev);
}
byte[] blob = (byte[])reader["Heightfield"];
terrData = TerrainData.CreateFromDatabaseBlobFactory(pSizeX, pSizeY, pSizeZ, rev, blob);
}
}
}
}
}
return terrain;
return terrData;
}
public void RemoveLandObject(UUID globalID)
@@ -687,7 +695,7 @@ namespace OpenSim.Data.MySQL
"MusicURL, PassHours, PassPrice, SnapshotUUID, " +
"UserLocationX, UserLocationY, UserLocationZ, " +
"UserLookAtX, UserLookAtY, UserLookAtZ, " +
"AuthbuyerID, OtherCleanTime, MediaType, MediaDescription, " +
"AuthbuyerID, OtherCleanTime, Dwell, MediaType, MediaDescription, " +
"MediaSize, MediaLoop, ObscureMusic, ObscureMedia) values (" +
"?UUID, ?RegionUUID, " +
"?LocalLandID, ?Bitmap, ?Name, ?Description, " +
@@ -698,7 +706,7 @@ namespace OpenSim.Data.MySQL
"?MusicURL, ?PassHours, ?PassPrice, ?SnapshotUUID, " +
"?UserLocationX, ?UserLocationY, ?UserLocationZ, " +
"?UserLookAtX, ?UserLookAtY, ?UserLookAtZ, " +
"?AuthbuyerID, ?OtherCleanTime, ?MediaType, ?MediaDescription, "+
"?AuthbuyerID, ?OtherCleanTime, ?Dwell, ?MediaType, ?MediaDescription, "+
"CONCAT(?MediaWidth, ',', ?MediaHeight), ?MediaLoop, ?ObscureMusic, ?ObscureMedia)";
FillLandCommand(cmd, parcel.LandData, parcel.RegionUUID);
@@ -1303,7 +1311,16 @@ namespace OpenSim.Data.MySQL
if (!(row["MediaURL"] is System.DBNull))
prim.MediaUrl = (string)row["MediaURL"];
if (!(row["AttachedPosX"] is System.DBNull))
{
prim.AttachedPos = new Vector3(
(float)(double)row["AttachedPosX"],
(float)(double)row["AttachedPosY"],
(float)(double)row["AttachedPosZ"]
);
}
if (!(row["DynAttrs"] is System.DBNull))
prim.DynAttrs = DAMap.FromXml((string)row["DynAttrs"]);
else
@@ -1467,6 +1484,7 @@ namespace OpenSim.Data.MySQL
UUID.TryParse((string)row["AuthBuyerID"], out authedbuyer);
UUID.TryParse((string)row["SnapshotUUID"], out snapshotID);
newData.OtherCleanTime = Convert.ToInt32(row["OtherCleanTime"]);
newData.Dwell = Convert.ToSingle(row["Dwell"]);
newData.AuthBuyerID = authedbuyer;
newData.SnapshotID = snapshotID;
@@ -1513,30 +1531,6 @@ namespace OpenSim.Data.MySQL
return entry;
}
/// <summary>
///
/// </summary>
/// <param name="val"></param>
/// <returns></returns>
private static Array SerializeTerrain(double[,] val)
{
MemoryStream str = new MemoryStream(((int)Constants.RegionSize * (int)Constants.RegionSize) *sizeof (double));
BinaryWriter bw = new BinaryWriter(str);
// TODO: COMPATIBILITY - Add byte-order conversions
for (int x = 0; x < (int)Constants.RegionSize; x++)
for (int y = 0; y < (int)Constants.RegionSize; y++)
{
double height = val[x, y];
if (height == 0.0)
height = double.Epsilon;
bw.Write(height);
}
return str.ToArray();
}
/// <summary>
/// Fill the prim command with prim values
/// </summary>
@@ -1673,6 +1667,12 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("LinkNumber", prim.LinkNum);
cmd.Parameters.AddWithValue("MediaURL", prim.MediaUrl);
if (prim.AttachedPos != null)
{
cmd.Parameters.AddWithValue("AttachedPosX", (double)prim.AttachedPos.X);
cmd.Parameters.AddWithValue("AttachedPosY", (double)prim.AttachedPos.Y);
cmd.Parameters.AddWithValue("AttachedPosZ", (double)prim.AttachedPos.Z);
}
if (prim.KeyframeMotion != null)
cmd.Parameters.AddWithValue("KeyframeMotion", prim.KeyframeMotion.Serialize());
@@ -1816,6 +1816,7 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("UserLookAtZ", land.UserLookAt.Z);
cmd.Parameters.AddWithValue("AuthBuyerID", land.AuthBuyerID);
cmd.Parameters.AddWithValue("OtherCleanTime", land.OtherCleanTime);
cmd.Parameters.AddWithValue("Dwell", land.Dwell);
cmd.Parameters.AddWithValue("MediaDescription", land.MediaDescription);
cmd.Parameters.AddWithValue("MediaType", land.MediaType);
cmd.Parameters.AddWithValue("MediaWidth", land.MediaWidth);
@@ -1823,7 +1824,6 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("MediaLoop", land.MediaLoop);
cmd.Parameters.AddWithValue("ObscureMusic", land.ObscureMusic);
cmd.Parameters.AddWithValue("ObscureMedia", land.ObscureMedia);
}
/// <summary>
@@ -1879,6 +1879,7 @@ namespace OpenSim.Data.MySQL
s.ExtraParams = (byte[])row["ExtraParams"];
s.State = (byte)(int)row["State"];
s.LastAttachPoint = (byte)(int)row["LastAttachPoint"];
if (!(row["Media"] is System.DBNull))
s.Media = PrimitiveBaseShape.MediaList.FromXml((string)row["Media"]);
@@ -1925,6 +1926,7 @@ namespace OpenSim.Data.MySQL
cmd.Parameters.AddWithValue("Texture", s.TextureEntry);
cmd.Parameters.AddWithValue("ExtraParams", s.ExtraParams);
cmd.Parameters.AddWithValue("State", s.State);
cmd.Parameters.AddWithValue("LastAttachPoint", s.LastAttachPoint);
cmd.Parameters.AddWithValue("Media", null == s.Media ? null : s.Media.ToXml());
}

View File

@@ -546,6 +546,10 @@ namespace OpenSim.Data.MySQL
reader.Read();
notes.Notes = OSD.FromString((string)reader["notes"]);
}
else
{
notes.Notes = OSD.FromString("");
}
}
}
}
@@ -630,8 +634,6 @@ namespace OpenSim.Data.MySQL
{
if(reader.HasRows)
{
m_log.DebugFormat("[PROFILES_DATA]" +
": Getting data for {0}.", props.UserId);
reader.Read();
props.WebUrl = (string)reader["profileURL"];
UUID.TryParse((string)reader["profileImage"], out props.ImageId);
@@ -647,9 +649,6 @@ namespace OpenSim.Data.MySQL
}
else
{
m_log.DebugFormat("[PROFILES_DATA]" +
": No data for {0}", props.UserId);
props.WebUrl = string.Empty;
props.ImageId = UUID.Zero;
props.AboutText = string.Empty;
@@ -736,7 +735,6 @@ namespace OpenSim.Data.MySQL
string query = string.Empty;
query += "UPDATE userprofile SET ";
query += "profilePartner=?profilePartner, ";
query += "profileURL=?profileURL, ";
query += "profileImage=?image, ";
query += "profileAboutText=?abouttext,";
@@ -752,7 +750,6 @@ namespace OpenSim.Data.MySQL
using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
{
cmd.Parameters.AddWithValue("?profileURL", props.WebUrl);
cmd.Parameters.AddWithValue("?profilePartner", props.PartnerId.ToString());
cmd.Parameters.AddWithValue("?image", props.ImageId.ToString());
cmd.Parameters.AddWithValue("?abouttext", props.AboutText);
cmd.Parameters.AddWithValue("?firstlifeimage", props.FirstLifeImageId.ToString());
@@ -897,7 +894,7 @@ namespace OpenSim.Data.MySQL
}
#region User Preferences
public OSDArray GetUserPreferences(UUID avatarId)
public bool GetUserPreferences(ref UserPreferences pref, ref string result)
{
string query = string.Empty;
@@ -914,31 +911,32 @@ namespace OpenSim.Data.MySQL
dbcon.Open();
using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
{
cmd.Parameters.AddWithValue("?Id", avatarId.ToString());
cmd.Parameters.AddWithValue("?Id", pref.UserId.ToString());
using (MySqlDataReader reader = cmd.ExecuteReader())
{
if(reader.HasRows)
{
reader.Read();
OSDMap record = new OSDMap();
record.Add("imviaemail",OSD.FromString((string)reader["imviaemail"]));
record.Add("visible",OSD.FromString((string)reader["visible"]));
record.Add("email",OSD.FromString((string)reader["email"]));
data.Add(record);
bool.TryParse((string)reader["imviaemail"], out pref.IMViaEmail);
bool.TryParse((string)reader["visible"], out pref.Visible);
pref.EMail = (string)reader["email"];
}
else
{
dbcon.Close();
dbcon.Open();
query = "INSERT INTO usersettings VALUES ";
query += "(?uuid,'false','false', ?Email)";
using (MySqlCommand put = new MySqlCommand(query, dbcon))
{
query = "INSERT INTO usersettings VALUES ";
query += "(?Id,'false','false', '')";
lock(Lock)
{
put.ExecuteNonQuery();
}
put.Parameters.AddWithValue("?Email", pref.EMail);
put.Parameters.AddWithValue("?uuid", pref.UserId.ToString());
put.ExecuteNonQuery();
}
}
}
@@ -949,17 +947,19 @@ namespace OpenSim.Data.MySQL
{
m_log.DebugFormat("[PROFILES_DATA]" +
": Get preferences exception {0}", e.Message);
result = e.Message;
return false;
}
return data;
return true;
}
public bool UpdateUserPreferences(bool emailIm, bool visible, UUID avatarId )
public bool UpdateUserPreferences(ref UserPreferences pref, ref string result)
{
string query = string.Empty;
query += "UPDATE userpsettings SET ";
query += "UPDATE usersettings SET ";
query += "imviaemail=?ImViaEmail, ";
query += "visible=?Visible,";
query += "visible=?Visible ";
query += "WHERE useruuid=?uuid";
try
@@ -969,14 +969,11 @@ namespace OpenSim.Data.MySQL
dbcon.Open();
using (MySqlCommand cmd = new MySqlCommand(query, dbcon))
{
cmd.Parameters.AddWithValue("?ImViaEmail", emailIm.ToString().ToLower ());
cmd.Parameters.AddWithValue("?WantText", visible.ToString().ToLower ());
cmd.Parameters.AddWithValue("?uuid", avatarId.ToString());
lock(Lock)
{
cmd.ExecuteNonQuery();
}
cmd.Parameters.AddWithValue("?ImViaEmail", pref.IMViaEmail.ToString().ToLower());
cmd.Parameters.AddWithValue("?Visible", pref.Visible.ToString().ToLower());
cmd.Parameters.AddWithValue("?uuid", pref.UserId.ToString());
cmd.ExecuteNonQuery();
}
}
}
@@ -984,6 +981,7 @@ namespace OpenSim.Data.MySQL
{
m_log.DebugFormat("[PROFILES_DATA]" +
": AgentInterestsUpdate exception {0}", e.Message);
result = e.Message;
return false;
}
return true;

View File

@@ -210,18 +210,18 @@ namespace OpenSim.Data.MySQL
using (MySqlTransaction transaction = dbcon.BeginTransaction())
{
string assetName = asset.Name;
if (asset.Name.Length > 64)
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
{
assetName = asset.Name.Substring(0, 64);
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
m_log.WarnFormat(
"[XASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
}
string assetDescription = asset.Description;
if (asset.Description.Length > 64)
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
{
assetDescription = asset.Description.Substring(0, 64);
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
m_log.WarnFormat(
"[XASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
@@ -346,7 +346,7 @@ namespace OpenSim.Data.MySQL
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
catch (Exception)
{
m_log.ErrorFormat(
"[XASSET MYSQL DB]: Failure updating access_time for asset {0} with name {1}",
@@ -397,45 +397,43 @@ namespace OpenSim.Data.MySQL
}
/// <summary>
/// Check if the asset exists in the database
/// Check if the assets exist in the database.
/// </summary>
/// <param name="uuid">The asset UUID</param>
/// <returns>true if it exists, false otherwise.</returns>
public bool ExistsAsset(UUID uuid)
/// <param name="uuids">The asset UUID's</param>
/// <returns>For each asset: true if it exists, false otherwise</returns>
public bool[] AssetsExist(UUID[] uuids)
{
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
if (uuids.Length == 0)
return new bool[0];
bool assetExists = false;
HashSet<UUID> exists = new HashSet<UUID>();
string ids = "'" + string.Join("','", uuids) + "'";
string sql = string.Format("SELECT ID FROM assets WHERE ID IN ({0})", ids);
lock (m_dbLock)
{
using (MySqlConnection dbcon = new MySqlConnection(m_connectionString))
{
dbcon.Open();
using (MySqlCommand cmd = new MySqlCommand("SELECT ID FROM XAssetsMeta WHERE ID=?ID", dbcon))
using (MySqlCommand cmd = new MySqlCommand(sql, dbcon))
{
cmd.Parameters.AddWithValue("?ID", uuid.ToString());
try
using (MySqlDataReader dbReader = cmd.ExecuteReader())
{
using (MySqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
while (dbReader.Read())
{
if (dbReader.Read())
{
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
assetExists = true;
}
UUID id = DBGuid.FromDB(dbReader["ID"]);
exists.Add(id);
}
}
catch (Exception e)
{
m_log.Error(string.Format("[XASSETS DB]: MySql failure fetching asset {0}", uuid), e);
}
}
}
}
return assetExists;
bool[] results = new bool[uuids.Length];
for (int i = 0; i < uuids.Length; i++)
results[i] = exists.Contains(uuids[i]);
return results;
}

View File

@@ -61,5 +61,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly : AssemblyVersion("0.7.6.*")]
[assembly : AssemblyVersion("0.8.1.*")]

View File

@@ -1,4 +1,4 @@
:VERSION 1 # --------------------------
:VERSION 1 # --------------------------
BEGIN;
@@ -21,4 +21,22 @@ INSERT INTO `im_offline` SELECT * from `diva_im_offline`;
DROP TABLE `diva_im_offline`;
DELETE FROM `migrations` WHERE name='diva_im_Store';
COMMIT;
COMMIT;
:VERSION 3 # --------------------------
BEGIN;
ALTER TABLE `im_offline`
ADD `FromID` char(36) NOT NULL default '' AFTER `PrincipalID`,
ADD KEY `FromID` (`FromID`);
COMMIT;
:VERSION 4 # --------------------------
BEGIN;
ALTER TABLE im_offline CONVERT TO CHARACTER SET utf8;
COMMIT;

View File

@@ -1,4 +1,4 @@
:VERSION 1 # --------------------------
:VERSION 1 # --------------------------
BEGIN;
@@ -21,3 +21,11 @@ BEGIN;
ALTER TABLE `Presence` ADD COLUMN LastSeen timestamp;
COMMIT;
:VERSION 3 # --------------------------
BEGIN;
CREATE INDEX RegionID ON Presence(RegionID);
COMMIT;

View File

@@ -930,3 +930,13 @@ BEGIN;
ALTER TABLE prims ADD COLUMN `KeyframeMotion` blob;
COMMIT;
:VERSION 49 #--------------------- Save attachment info
BEGIN;
ALTER TABLE prims ADD COLUMN AttachedPosX double default 0;
ALTER TABLE prims ADD COLUMN AttachedPosY double default 0;
ALTER TABLE prims ADD COLUMN AttachedPosZ double default 0;
ALTER TABLE primshapes ADD COLUMN LastAttachPoint int(4) not null default '0';
COMMIT;

View File

@@ -81,3 +81,13 @@ CREATE TABLE IF NOT EXISTS `userdata` (
commit;
:VERSION 3 # -------------------------------
begin;
CREATE TABLE IF NOT EXISTS `usersettings` (
`useruuid` varchar(36) NOT NULL,
`imviaemail` enum('true','false') NOT NULL,
`visible` enum('true','false') NOT NULL,
`email` varchar(254) NOT NULL,
PRIMARY KEY (`useruuid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
commit;

View File

@@ -42,7 +42,7 @@ namespace OpenSim.Data.Null
// private string m_connectionString;
private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
// private Dictionary<uint, EstateSettings> m_knownEstates = new Dictionary<uint, EstateSettings>();
private EstateSettings m_estate = null;
private EstateSettings GetEstate()

View File

@@ -40,7 +40,7 @@ namespace OpenSim.Data.Null
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private static NullPresenceData Instance;
public static NullPresenceData Instance;
Dictionary<UUID, PresenceData> m_presenceData = new Dictionary<UUID, PresenceData>();

View File

@@ -239,6 +239,11 @@ namespace OpenSim.Data.Null
return Get((int)RegionFlags.DefaultRegion, scopeID);
}
public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
{
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
}
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
{
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);

View File

@@ -132,15 +132,33 @@ namespace OpenSim.Data.Null
return new List<SceneObjectGroup>();
}
Dictionary<UUID, double[,]> m_terrains = new Dictionary<UUID, double[,]>();
public void StoreTerrain(double[,] ter, UUID regionID)
Dictionary<UUID, TerrainData> m_terrains = new Dictionary<UUID, TerrainData>();
public void StoreTerrain(TerrainData ter, UUID regionID)
{
if (m_terrains.ContainsKey(regionID))
m_terrains.Remove(regionID);
m_terrains.Add(regionID, ter);
}
// Legacy. Just don't do this.
public void StoreTerrain(double[,] ter, UUID regionID)
{
TerrainData terrData = new HeightmapTerrainData(ter);
StoreTerrain(terrData, regionID);
}
// Legacy. Just don't do this.
// Returns 'null' if region not found
public double[,] LoadTerrain(UUID regionID)
{
if (m_terrains.ContainsKey(regionID))
{
return m_terrains[regionID].GetDoubles();
}
return null;
}
public TerrainData LoadTerrain(UUID regionID, int pSizeX, int pSizeY, int pSizeZ)
{
if (m_terrains.ContainsKey(regionID))
{

View File

@@ -38,7 +38,7 @@ using OpenSim.Data;
namespace OpenSim.Data.Null
{
public class NullXGroupData : NullGenericDataHandler, IXGroupData
public class NullXGroupData : IXGroupData
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
@@ -56,35 +56,31 @@ namespace OpenSim.Data.Null
return true;
}
public XGroup[] GetGroups(string field, string val)
public XGroup GetGroup(UUID groupID)
{
return GetGroups(new string[] { field }, new string[] { val });
XGroup group = null;
lock (m_groups)
m_groups.TryGetValue(groupID, out group);
return group;
}
public XGroup[] GetGroups(string[] fields, string[] vals)
public Dictionary<UUID, XGroup> GetGroups()
{
Dictionary<UUID, XGroup> groupsClone = new Dictionary<UUID, XGroup>();
lock (m_groups)
foreach (XGroup group in m_groups.Values)
groupsClone[group.groupID] = group.Clone();
return groupsClone;
}
public bool DeleteGroup(UUID groupID)
{
lock (m_groups)
{
List<XGroup> origGroups = Get<XGroup>(fields, vals, m_groups.Values.ToList());
return origGroups.Select(g => g.Clone()).ToArray();
}
}
public bool DeleteGroups(string field, string val)
{
return DeleteGroups(new string[] { field }, new string[] { val });
}
public bool DeleteGroups(string[] fields, string[] vals)
{
lock (m_groups)
{
XGroup[] groupsToDelete = GetGroups(fields, vals);
Array.ForEach(groupsToDelete, g => m_groups.Remove(g.groupID));
}
return true;
return m_groups.Remove(groupID);
}
}
}

View File

@@ -61,5 +61,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly : AssemblyVersion("0.7.6.*")]
[assembly : AssemblyVersion("0.8.1.*")]

View File

@@ -0,0 +1,316 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Data;
using System.Reflection;
using System.Collections.Generic;
using OpenMetaverse;
using log4net;
using OpenSim.Framework;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for the Asset server
/// </summary>
public class PGSQLAssetData : AssetDataBase
{
private const string _migrationStore = "AssetStore";
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private long m_ticksToEpoch;
/// <summary>
/// Database manager
/// </summary>
private PGSQLManager m_database;
private string m_connectionString;
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
#region IPlugin Members
override public void Dispose() { }
/// <summary>
/// <para>Initialises asset interface</para>
/// </summary>
// [Obsolete("Cannot be default-initialized!")]
override public void Initialise()
{
m_log.Info("[PGSQLAssetData]: " + Name + " cannot be default-initialized!");
throw new PluginNotInitialisedException(Name);
}
/// <summary>
/// Initialises asset interface
/// </summary>
/// <para>
/// a string instead of file, if someone writes the support
/// </para>
/// <param name="connectionString">connect string</param>
override public void Initialise(string connectionString)
{
m_ticksToEpoch = new System.DateTime(1970, 1, 1).Ticks;
m_database = new PGSQLManager(connectionString);
m_connectionString = connectionString;
//New migration to check for DB changes
m_database.CheckMigration(_migrationStore);
}
/// <summary>
/// Database provider version.
/// </summary>
override public string Version
{
get { return m_database.getVersion(); }
}
/// <summary>
/// The name of this DB provider.
/// </summary>
override public string Name
{
get { return "PGSQL Asset storage engine"; }
}
#endregion
#region IAssetDataPlugin Members
/// <summary>
/// Fetch Asset from m_database
/// </summary>
/// <param name="assetID">the asset UUID</param>
/// <returns></returns>
override public AssetBase GetAsset(UUID assetID)
{
string sql = "SELECT * FROM assets WHERE id = :id";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("id", assetID));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
AssetBase asset = new AssetBase(
DBGuid.FromDB(reader["id"]),
(string)reader["name"],
Convert.ToSByte(reader["assetType"]),
reader["creatorid"].ToString()
);
// Region Main
asset.Description = (string)reader["description"];
asset.Local = Convert.ToBoolean(reader["local"]);
asset.Temporary = Convert.ToBoolean(reader["temporary"]);
asset.Flags = (AssetFlags)(Convert.ToInt32(reader["asset_flags"]));
asset.Data = (byte[])reader["data"];
return asset;
}
return null; // throw new Exception("No rows to return");
}
}
}
/// <summary>
/// Create asset in m_database
/// </summary>
/// <param name="asset">the asset</param>
override public void StoreAsset(AssetBase asset)
{
string sql =
@"UPDATE assets set name = :name, description = :description, " + "\"assetType\" " + @" = :assetType,
local = :local, temporary = :temporary, creatorid = :creatorid, data = :data
WHERE id=:id;
INSERT INTO assets
(id, name, description, " + "\"assetType\" " + @", local,
temporary, create_time, access_time, creatorid, asset_flags, data)
Select :id, :name, :description, :assetType, :local,
:temporary, :create_time, :access_time, :creatorid, :asset_flags, :data
Where not EXISTS(SELECT * FROM assets WHERE id=:id)
";
string assetName = asset.Name;
if (asset.Name.Length > AssetBase.MAX_ASSET_NAME)
{
assetName = asset.Name.Substring(0, AssetBase.MAX_ASSET_NAME);
m_log.WarnFormat(
"[ASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
}
string assetDescription = asset.Description;
if (asset.Description.Length > AssetBase.MAX_ASSET_DESC)
{
assetDescription = asset.Description.Substring(0, AssetBase.MAX_ASSET_DESC);
m_log.WarnFormat(
"[ASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
}
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
command.Parameters.Add(m_database.CreateParameter("id", asset.FullID));
command.Parameters.Add(m_database.CreateParameter("name", assetName));
command.Parameters.Add(m_database.CreateParameter("description", assetDescription));
command.Parameters.Add(m_database.CreateParameter("assetType", asset.Type));
command.Parameters.Add(m_database.CreateParameter("local", asset.Local));
command.Parameters.Add(m_database.CreateParameter("temporary", asset.Temporary));
command.Parameters.Add(m_database.CreateParameter("access_time", now));
command.Parameters.Add(m_database.CreateParameter("create_time", now));
command.Parameters.Add(m_database.CreateParameter("asset_flags", (int)asset.Flags));
command.Parameters.Add(m_database.CreateParameter("creatorid", asset.Metadata.CreatorID));
command.Parameters.Add(m_database.CreateParameter("data", asset.Data));
conn.Open();
try
{
command.ExecuteNonQuery();
}
catch(Exception e)
{
m_log.Error("[ASSET DB]: Error storing item :" + e.Message + " sql "+sql);
}
}
}
// Commented out since currently unused - this probably should be called in GetAsset()
// private void UpdateAccessTime(AssetBase asset)
// {
// using (AutoClosingSqlCommand cmd = m_database.Query("UPDATE assets SET access_time = :access_time WHERE id=:id"))
// {
// int now = (int)((System.DateTime.Now.Ticks - m_ticksToEpoch) / 10000000);
// cmd.Parameters.AddWithValue(":id", asset.FullID.ToString());
// cmd.Parameters.AddWithValue(":access_time", now);
// try
// {
// cmd.ExecuteNonQuery();
// }
// catch (Exception e)
// {
// m_log.Error(e.ToString());
// }
// }
// }
/// <summary>
/// Check if the assets exist in the database.
/// </summary>
/// <param name="uuids">The assets' IDs</param>
/// <returns>For each asset: true if it exists, false otherwise</returns>
public override bool[] AssetsExist(UUID[] uuids)
{
if (uuids.Length == 0)
return new bool[0];
HashSet<UUID> exist = new HashSet<UUID>();
string ids = "'" + string.Join("','", uuids) + "'";
string sql = string.Format("SELECT id FROM assets WHERE id IN ({0})", ids);
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
UUID id = DBGuid.FromDB(reader["id"]);
exist.Add(id);
}
}
}
bool[] results = new bool[uuids.Length];
for (int i = 0; i < uuids.Length; i++)
results[i] = exist.Contains(uuids[i]);
return results;
}
/// <summary>
/// Returns a list of AssetMetadata objects. The list is a subset of
/// the entire data set offset by <paramref name="start" /> containing
/// <paramref name="count" /> elements.
/// </summary>
/// <param name="start">The number of results to discard from the total data set.</param>
/// <param name="count">The number of rows the returned list should contain.</param>
/// <returns>A list of AssetMetadata objects.</returns>
public override List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
{
List<AssetMetadata> retList = new List<AssetMetadata>(count);
string sql = @" SELECT id, name, description, " + "\"assetType\"" + @", temporary, creatorid
FROM assets
order by id
limit :stop
offset :start;";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("start", start));
cmd.Parameters.Add(m_database.CreateParameter("stop", start + count - 1));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
AssetMetadata metadata = new AssetMetadata();
metadata.FullID = DBGuid.FromDB(reader["id"]);
metadata.Name = (string)reader["name"];
metadata.Description = (string)reader["description"];
metadata.Type = Convert.ToSByte(reader["assetType"]);
metadata.Temporary = Convert.ToBoolean(reader["temporary"]);
metadata.CreatorID = (string)reader["creatorid"];
retList.Add(metadata);
}
}
}
return retList;
}
public override bool Delete(string id)
{
return false;
}
#endregion
}
}

View File

@@ -0,0 +1,254 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using OpenMetaverse;
using OpenSim.Framework;
using System.Reflection;
using System.Text;
using System.Data;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
public class PGSQLAuthenticationData : IAuthenticationData
{
private string m_Realm;
private List<string> m_ColumnNames = null;
private int m_LastExpire = 0;
private string m_ConnectionString;
private PGSQLManager m_database;
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
public PGSQLAuthenticationData(string connectionString, string realm)
{
m_Realm = realm;
m_ConnectionString = connectionString;
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, "AuthStore");
m_database = new PGSQLManager(m_ConnectionString);
m.Update();
}
}
public AuthenticationData Get(UUID principalID)
{
AuthenticationData ret = new AuthenticationData();
ret.Data = new Dictionary<string, object>();
string sql = string.Format("select * from {0} where uuid = :principalID", m_Realm);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
conn.Open();
using (NpgsqlDataReader result = cmd.ExecuteReader())
{
if (result.Read())
{
ret.PrincipalID = principalID;
if (m_ColumnNames == null)
{
m_ColumnNames = new List<string>();
DataTable schemaTable = result.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
m_ColumnNames.Add(row["ColumnName"].ToString());
}
foreach (string s in m_ColumnNames)
{
if (s == "UUID"||s == "uuid")
continue;
ret.Data[s] = result[s].ToString();
}
return ret;
}
}
}
return null;
}
public bool Store(AuthenticationData data)
{
if (data.Data.ContainsKey("UUID"))
data.Data.Remove("UUID");
if (data.Data.ContainsKey("uuid"))
data.Data.Remove("uuid");
/*
Dictionary<string, object> oAuth = new Dictionary<string, object>();
foreach (KeyValuePair<string, object> oDado in data.Data)
{
if (oDado.Key != oDado.Key.ToLower())
{
oAuth.Add(oDado.Key.ToLower(), oDado.Value);
}
}
foreach (KeyValuePair<string, object> oDado in data.Data)
{
if (!oAuth.ContainsKey(oDado.Key.ToLower())) {
oAuth.Add(oDado.Key.ToLower(), oDado.Value);
}
}
*/
string[] fields = new List<string>(data.Data.Keys).ToArray();
StringBuilder updateBuilder = new StringBuilder();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
updateBuilder.AppendFormat("update {0} set ", m_Realm);
bool first = true;
foreach (string field in fields)
{
if (!first)
updateBuilder.Append(", ");
updateBuilder.AppendFormat("\"{0}\" = :{0}",field);
first = false;
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
}
updateBuilder.Append(" where uuid = :principalID");
cmd.CommandText = updateBuilder.ToString();
cmd.Connection = conn;
cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
conn.Open();
if (cmd.ExecuteNonQuery() < 1)
{
StringBuilder insertBuilder = new StringBuilder();
insertBuilder.AppendFormat("insert into {0} (uuid, \"", m_Realm);
insertBuilder.Append(String.Join("\", \"", fields));
insertBuilder.Append("\") values (:principalID, :");
insertBuilder.Append(String.Join(", :", fields));
insertBuilder.Append(")");
cmd.CommandText = insertBuilder.ToString();
if (cmd.ExecuteNonQuery() < 1)
{
return false;
}
}
}
return true;
}
public bool SetDataItem(UUID principalID, string item, string value)
{
string sql = string.Format("update {0} set {1} = :{1} where uuid = :UUID", m_Realm, item);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
}
return false;
}
public bool SetToken(UUID principalID, string token, int lifetime)
{
if (System.Environment.TickCount - m_LastExpire > 30000)
DoExpire();
string sql = "insert into tokens (uuid, token, validity) values (:principalID, :token, :lifetime)";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
cmd.Parameters.Add(m_database.CreateParameter("token", token));
cmd.Parameters.Add(m_database.CreateParameter("lifetime", DateTime.Now.AddMinutes(lifetime)));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
{
return true;
}
}
return false;
}
public bool CheckToken(UUID principalID, string token, int lifetime)
{
if (System.Environment.TickCount - m_LastExpire > 30000)
DoExpire();
DateTime validDate = DateTime.Now.AddMinutes(lifetime);
string sql = "update tokens set validity = :validDate where uuid = :principalID and token = :token and validity > (CURRENT_DATE + CURRENT_TIME)";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
cmd.Parameters.Add(m_database.CreateParameter("token", token));
cmd.Parameters.Add(m_database.CreateParameter("validDate", validDate));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
{
return true;
}
}
return false;
}
private void DoExpire()
{
DateTime currentDateTime = DateTime.Now;
string sql = "delete from tokens where validity < :currentDateTime";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
conn.Open();
cmd.Parameters.Add(m_database.CreateParameter("currentDateTime", currentDateTime));
cmd.ExecuteNonQuery();
}
m_LastExpire = System.Environment.TickCount;
}
}
}

View File

@@ -0,0 +1,72 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Threading;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for Avatar Storage
/// </summary>
public class PGSQLAvatarData : PGSQLGenericTableHandler<AvatarBaseData>,
IAvatarData
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public PGSQLAvatarData(string connectionString, string realm) :
base(connectionString, realm, "Avatar")
{
}
public bool Delete(UUID principalID, string name)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format("DELETE FROM {0} where \"PrincipalID\" = :PrincipalID and \"Name\" = :Name", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
cmd.Parameters.Add(m_database.CreateParameter("Name", name));
cmd.Connection = conn;
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
return false;
}
}
}
}

View File

@@ -0,0 +1,602 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using System.Data;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
public class PGSQLEstateStore : IEstateDataStore
{
private const string _migrationStore = "EstateStore";
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
private PGSQLManager _Database;
private string m_connectionString;
private FieldInfo[] _Fields;
private Dictionary<string, FieldInfo> _FieldMap = new Dictionary<string, FieldInfo>();
#region Public methods
public PGSQLEstateStore()
{
}
public PGSQLEstateStore(string connectionString)
{
Initialise(connectionString);
}
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
/// <summary>
/// Initialises the estatedata class.
/// </summary>
/// <param name="connectionString">connectionString.</param>
public void Initialise(string connectionString)
{
if (!string.IsNullOrEmpty(connectionString))
{
m_connectionString = connectionString;
_Database = new PGSQLManager(connectionString);
}
//Migration settings
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, "EstateStore");
m.Update();
}
//Interesting way to get parameters! Maybe implement that also with other types
Type t = typeof(EstateSettings);
_Fields = t.GetFields(BindingFlags.NonPublic |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
foreach (FieldInfo f in _Fields)
{
if (f.Name.Substring(0, 2) == "m_")
_FieldMap[f.Name.Substring(2)] = f;
}
}
/// <summary>
/// Loads the estate settings.
/// </summary>
/// <param name="regionID">region ID.</param>
/// <returns></returns>
public EstateSettings LoadEstateSettings(UUID regionID, bool create)
{
EstateSettings es = new EstateSettings();
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";
bool insertEstate = false;
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(_Database.CreateParameter("RegionID", regionID));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
foreach (string name in FieldList)
{
FieldInfo f = _FieldMap[name];
object v = reader[name];
if (f.FieldType == typeof(bool))
{
f.SetValue(es, v);
}
else if (f.FieldType == typeof(UUID))
{
UUID estUUID = UUID.Zero;
UUID.TryParse(v.ToString(), out estUUID);
f.SetValue(es, estUUID);
}
else if (f.FieldType == typeof(string))
{
f.SetValue(es, v.ToString());
}
else if (f.FieldType == typeof(UInt32))
{
f.SetValue(es, Convert.ToUInt32(v));
}
else if (f.FieldType == typeof(Single))
{
f.SetValue(es, Convert.ToSingle(v));
}
else
f.SetValue(es, v);
}
}
else
{
insertEstate = true;
}
}
}
if (insertEstate && create)
{
DoCreate(es);
LinkRegion(regionID, (int)es.EstateID);
}
LoadBanList(es);
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
//Set event
es.OnSave += StoreEstateSettings;
return es;
}
public EstateSettings CreateNewEstate()
{
EstateSettings es = new EstateSettings();
es.OnSave += StoreEstateSettings;
DoCreate(es);
LoadBanList(es);
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
return es;
}
private void DoCreate(EstateSettings es)
{
List<string> names = new List<string>(FieldList);
names.Remove("EstateID");
string sql = string.Format("insert into estate_settings (\"{0}\") values ( :{1} )", String.Join("\",\"", names.ToArray()), String.Join(", :", names.ToArray()));
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand insertCommand = new NpgsqlCommand(sql, conn))
{
insertCommand.CommandText = sql;
foreach (string name in names)
{
insertCommand.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
}
//NpgsqlParameter idParameter = new NpgsqlParameter("ID", SqlDbType.Int);
//idParameter.Direction = ParameterDirection.Output;
//insertCommand.Parameters.Add(idParameter);
conn.Open();
es.EstateID = 100;
if (insertCommand.ExecuteNonQuery() > 0)
{
insertCommand.CommandText = "Select cast(lastval() as int) as ID ;";
using (NpgsqlDataReader result = insertCommand.ExecuteReader())
{
if (result.Read())
{
es.EstateID = (uint)result.GetInt32(0);
}
}
}
}
//TODO check if this is needed??
es.Save();
}
/// <summary>
/// Stores the estate settings.
/// </summary>
/// <param name="es">estate settings</param>
public void StoreEstateSettings(EstateSettings es)
{
List<string> names = new List<string>(FieldList);
names.Remove("EstateID");
string sql = string.Format("UPDATE estate_settings SET ");
foreach (string name in names)
{
sql += "\"" + name + "\" = :" + name + ", ";
}
sql = sql.Remove(sql.LastIndexOf(","));
sql += " WHERE \"EstateID\" = :EstateID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
foreach (string name in names)
{
cmd.Parameters.Add(_Database.CreateParameter("" + name, _FieldMap[name].GetValue(es)));
}
cmd.Parameters.Add(_Database.CreateParameter("EstateID", es.EstateID));
conn.Open();
cmd.ExecuteNonQuery();
}
SaveBanList(es);
SaveUUIDList(es.EstateID, "estate_managers", es.EstateManagers);
SaveUUIDList(es.EstateID, "estate_users", es.EstateAccess);
SaveUUIDList(es.EstateID, "estate_groups", es.EstateGroups);
}
#endregion
#region Private methods
private string[] FieldList
{
get { return new List<string>(_FieldMap.Keys).ToArray(); }
}
private void LoadBanList(EstateSettings es)
{
es.ClearBans();
string sql = "select \"bannedUUID\" from estateban where \"EstateID\" = :EstateID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
NpgsqlParameter idParameter = new NpgsqlParameter("EstateID", DbType.Int32);
idParameter.Value = es.EstateID;
cmd.Parameters.Add(idParameter);
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
EstateBan eb = new EstateBan();
eb.BannedUserID = new UUID((Guid)reader["bannedUUID"]); //uuid;
eb.BannedHostAddress = "0.0.0.0";
eb.BannedHostIPMask = "0.0.0.0";
es.AddBan(eb);
}
}
}
}
private UUID[] LoadUUIDList(uint estateID, string table)
{
List<UUID> uuids = new List<UUID>();
string sql = string.Format("select uuid from {0} where \"EstateID\" = :EstateID", table);
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(_Database.CreateParameter("EstateID", estateID));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
uuids.Add(new UUID((Guid)reader["uuid"])); //uuid);
}
}
}
return uuids.ToArray();
}
private void SaveBanList(EstateSettings es)
{
//Delete first
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "delete from estateban where \"EstateID\" = :EstateID";
cmd.Parameters.AddWithValue("EstateID", (int)es.EstateID);
cmd.ExecuteNonQuery();
//Insert after
cmd.CommandText = "insert into estateban (\"EstateID\", \"bannedUUID\",\"bannedIp\", \"bannedIpHostMask\", \"bannedNameMask\") values ( :EstateID, :bannedUUID, '','','' )";
cmd.Parameters.AddWithValue("bannedUUID", Guid.Empty);
foreach (EstateBan b in es.EstateBans)
{
cmd.Parameters["bannedUUID"].Value = b.BannedUserID.Guid;
cmd.ExecuteNonQuery();
}
}
}
}
private void SaveUUIDList(uint estateID, string table, UUID[] data)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = conn.CreateCommand())
{
cmd.Parameters.AddWithValue("EstateID", (int)estateID);
cmd.CommandText = string.Format("delete from {0} where \"EstateID\" = :EstateID", table);
cmd.ExecuteNonQuery();
cmd.CommandText = string.Format("insert into {0} (\"EstateID\", uuid) values ( :EstateID, :uuid )", table);
cmd.Parameters.AddWithValue("uuid", Guid.Empty);
foreach (UUID uuid in data)
{
cmd.Parameters["uuid"].Value = uuid.Guid; //.ToString(); //TODO check if this works
cmd.ExecuteNonQuery();
}
}
}
}
public EstateSettings LoadEstateSettings(int estateID)
{
EstateSettings es = new EstateSettings();
string sql = "select estate_settings.\"" + String.Join("\",estate_settings.\"", FieldList) + "\" from estate_settings where \"EstateID\" = :EstateID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("EstateID", (int)estateID);
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
foreach (string name in FieldList)
{
FieldInfo f = _FieldMap[name];
object v = reader[name];
if (f.FieldType == typeof(bool))
{
f.SetValue(es, Convert.ToInt32(v) != 0);
}
else if (f.FieldType == typeof(UUID))
{
f.SetValue(es, new UUID((Guid)v)); // uuid);
}
else if (f.FieldType == typeof(string))
{
f.SetValue(es, v.ToString());
}
else if (f.FieldType == typeof(UInt32))
{
f.SetValue(es, Convert.ToUInt32(v));
}
else if (f.FieldType == typeof(Single))
{
f.SetValue(es, Convert.ToSingle(v));
}
else
f.SetValue(es, v);
}
}
}
}
}
LoadBanList(es);
es.EstateManagers = LoadUUIDList(es.EstateID, "estate_managers");
es.EstateAccess = LoadUUIDList(es.EstateID, "estate_users");
es.EstateGroups = LoadUUIDList(es.EstateID, "estate_groups");
//Set event
es.OnSave += StoreEstateSettings;
return es;
}
public List<EstateSettings> LoadEstateSettingsAll()
{
List<EstateSettings> allEstateSettings = new List<EstateSettings>();
List<int> allEstateIds = GetEstatesAll();
foreach (int estateId in allEstateIds)
allEstateSettings.Add(LoadEstateSettings(estateId));
return allEstateSettings;
}
public List<int> GetEstates(string search)
{
List<int> result = new List<int>();
string sql = "select \"EstateID\" from estate_settings where lower(\"EstateName\") = lower(:EstateName)";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("EstateName", search);
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
result.Add(Convert.ToInt32(reader["EstateID"]));
}
reader.Close();
}
}
}
return result;
}
public List<int> GetEstatesAll()
{
List<int> result = new List<int>();
string sql = "select \"EstateID\" from estate_settings";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
result.Add(Convert.ToInt32(reader["EstateID"]));
}
reader.Close();
}
}
}
return result;
}
public List<int> GetEstatesByOwner(UUID ownerID)
{
List<int> result = new List<int>();
string sql = "select \"estateID\" from estate_settings where \"EstateOwner\" = :EstateOwner";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("EstateOwner", ownerID);
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
result.Add(Convert.ToInt32(reader["EstateID"]));
}
reader.Close();
}
}
}
return result;
}
public bool LinkRegion(UUID regionID, int estateID)
{
string deleteSQL = "delete from estate_map where \"RegionID\" = :RegionID";
string insertSQL = "insert into estate_map values (:RegionID, :EstateID)";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
NpgsqlTransaction transaction = conn.BeginTransaction();
try
{
using (NpgsqlCommand cmd = new NpgsqlCommand(deleteSQL, conn))
{
cmd.Transaction = transaction;
cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
cmd.ExecuteNonQuery();
}
using (NpgsqlCommand cmd = new NpgsqlCommand(insertSQL, conn))
{
cmd.Transaction = transaction;
cmd.Parameters.AddWithValue("RegionID", regionID.Guid);
cmd.Parameters.AddWithValue("EstateID", estateID);
int ret = cmd.ExecuteNonQuery();
if (ret != 0)
transaction.Commit();
else
transaction.Rollback();
return (ret != 0);
}
}
catch (Exception ex)
{
m_log.Error("[REGION DB]: LinkRegion failed: " + ex.Message);
transaction.Rollback();
}
}
return false;
}
public List<UUID> GetRegions(int estateID)
{
List<UUID> result = new List<UUID>();
string sql = "select \"RegionID\" from estate_map where \"EstateID\" = :EstateID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.AddWithValue("EstateID", estateID);
using (IDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
result.Add(DBGuid.FromDB(reader["RegionID"]));
}
reader.Close();
}
}
}
return result;
}
public bool DeleteEstate(int estateID)
{
// TODO: Implementation!
return false;
}
#endregion
}
}

View File

@@ -0,0 +1,111 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using OpenMetaverse;
using OpenSim.Framework;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A database interface class to a user profile storage system
/// </summary>
public class PGSqlFramework
{
private static readonly log4net.ILog m_log =
log4net.LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
protected string m_connectionString;
protected object m_dbLock = new object();
protected PGSqlFramework(string connectionString)
{
m_connectionString = connectionString;
InitializeMonoSecurity();
}
public void InitializeMonoSecurity()
{
if (!Util.IsPlatformMono)
{
if (AppDomain.CurrentDomain.GetData("MonoSecurityPostgresAdded") == null)
{
AppDomain.CurrentDomain.SetData("MonoSecurityPostgresAdded", "true");
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandlerMonoSec);
}
}
}
private System.Reflection.Assembly ResolveEventHandlerMonoSec(object sender, ResolveEventArgs args)
{
Assembly MyAssembly = null;
if (args.Name.Substring(0, args.Name.IndexOf(",")) == "Mono.Security")
{
MyAssembly = Assembly.LoadFrom("lib/NET/Mono.Security.dll");
}
//Return the loaded assembly.
return MyAssembly;
}
//////////////////////////////////////////////////////////////
//
// All non queries are funneled through one connection
// to increase performance a little
//
protected int ExecuteNonQuery(NpgsqlCommand cmd)
{
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
cmd.Connection = dbcon;
try
{
return cmd.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error(e.Message, e);
return 0;
}
}
}
}
}
}

View File

@@ -0,0 +1,116 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using OpenMetaverse;
using OpenSim.Framework;
using System.Reflection;
using System.Text;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
public class PGSQLFriendsData : PGSQLGenericTableHandler<FriendsData>, IFriendsData
{
public PGSQLFriendsData(string connectionString, string realm)
: base(connectionString, realm, "FriendsStore")
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, "FriendsStore");
m.Update();
}
}
public override bool Delete(string principalID, string friend)
{
UUID princUUID = UUID.Zero;
bool ret = UUID.TryParse(principalID, out princUUID);
if (ret)
return Delete(princUUID, friend);
else
return false;
}
public bool Delete(UUID principalID, string friend)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where \"PrincipalID\" = :PrincipalID and \"Friend\" = :Friend", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID.ToString()));
cmd.Parameters.Add(m_database.CreateParameter("Friend", friend));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
return true;
}
}
public FriendsData[] GetFriends(string principalID)
{
UUID princUUID = UUID.Zero;
bool ret = UUID.TryParse(principalID, out princUUID);
if (ret)
return GetFriends(princUUID);
else
return new FriendsData[0];
}
public FriendsData[] GetFriends(UUID principalID)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
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);
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID.ToString()));
cmd.Connection = conn;
conn.Open();
return DoQuery(cmd);
}
}
public FriendsData[] GetFriends(Guid principalID)
{
return GetFriends(principalID);
}
}
}

View File

@@ -0,0 +1,537 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using System.Text;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
public class PGSQLGenericTableHandler<T> : PGSqlFramework where T : class, new()
{
private static readonly ILog m_log =
LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected string m_ConnectionString;
protected PGSQLManager m_database; //used for parameter type translation
protected Dictionary<string, FieldInfo> m_Fields =
new Dictionary<string, FieldInfo>();
protected Dictionary<string, string> m_FieldTypes = new Dictionary<string, string>();
protected List<string> m_ColumnNames = null;
protected string m_Realm;
protected FieldInfo m_DataField = null;
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
public PGSQLGenericTableHandler(string connectionString,
string realm, string storeName)
: base(connectionString)
{
m_Realm = realm;
m_ConnectionString = connectionString;
if (storeName != String.Empty)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, storeName);
m.Update();
}
}
m_database = new PGSQLManager(m_ConnectionString);
Type t = typeof(T);
FieldInfo[] fields = t.GetFields(BindingFlags.Public |
BindingFlags.Instance |
BindingFlags.DeclaredOnly);
LoadFieldTypes();
if (fields.Length == 0)
return;
foreach (FieldInfo f in fields)
{
if (f.Name != "Data")
m_Fields[f.Name] = f;
else
m_DataField = f;
}
}
private void LoadFieldTypes()
{
m_FieldTypes = new Dictionary<string, string>();
string query = string.Format(@"select column_name,data_type
from INFORMATION_SCHEMA.COLUMNS
where table_name = lower('{0}');
", m_Realm);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
{
conn.Open();
using (NpgsqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
// query produces 0 to many rows of single column, so always add the first item in each row
m_FieldTypes.Add((string)rdr[0], (string)rdr[1]);
}
}
}
}
private void CheckColumnNames(NpgsqlDataReader reader)
{
if (m_ColumnNames != null)
return;
m_ColumnNames = new List<string>();
DataTable schemaTable = reader.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
{
if (row["ColumnName"] != null &&
(!m_Fields.ContainsKey(row["ColumnName"].ToString())))
m_ColumnNames.Add(row["ColumnName"].ToString());
}
}
// TODO GET CONSTRAINTS FROM POSTGRESQL
private List<string> GetConstraints()
{
List<string> constraints = new List<string>();
string query = string.Format(@"SELECT kcu.column_name
FROM information_schema.table_constraints tc
LEFT JOIN information_schema.key_column_usage kcu
ON tc.constraint_catalog = kcu.constraint_catalog
AND tc.constraint_schema = kcu.constraint_schema
AND tc.constraint_name = kcu.constraint_name
LEFT JOIN information_schema.referential_constraints rc
ON tc.constraint_catalog = rc.constraint_catalog
AND tc.constraint_schema = rc.constraint_schema
AND tc.constraint_name = rc.constraint_name
LEFT JOIN information_schema.constraint_column_usage ccu
ON rc.unique_constraint_catalog = ccu.constraint_catalog
AND rc.unique_constraint_schema = ccu.constraint_schema
AND rc.unique_constraint_name = ccu.constraint_name
where tc.table_name = lower('{0}')
and lower(tc.constraint_type) in ('primary key')
and kcu.column_name is not null
;", m_Realm);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
{
conn.Open();
using (NpgsqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
// query produces 0 to many rows of single column, so always add the first item in each row
constraints.Add((string)rdr[0]);
}
}
return constraints;
}
}
public virtual T[] Get(string field, string key)
{
return Get(new string[] { field }, new string[] { key });
}
public virtual T[] Get(string[] fields, string[] keys)
{
if (fields.Length != keys.Length)
return new T[0];
List<string> terms = new List<string>();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
for (int i = 0; i < fields.Length; i++)
{
if ( m_FieldTypes.ContainsKey(fields[i]) )
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i]]));
else
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
terms.Add(" \"" + fields[i] + "\" = :" + fields[i]);
}
string where = String.Join(" AND ", terms.ToArray());
string query = String.Format("SELECT * FROM {0} WHERE {1}",
m_Realm, where);
cmd.Connection = conn;
cmd.CommandText = query;
conn.Open();
return DoQuery(cmd);
}
}
protected T[] DoQuery(NpgsqlCommand cmd)
{
List<T> result = new List<T>();
if (cmd.Connection == null)
{
cmd.Connection = new NpgsqlConnection(m_connectionString);
}
if (cmd.Connection.State == ConnectionState.Closed)
{
cmd.Connection.Open();
}
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader == null)
return new T[0];
CheckColumnNames(reader);
while (reader.Read())
{
T row = new T();
foreach (string name in m_Fields.Keys)
{
if (m_Fields[name].GetValue(row) is bool)
{
int v = Convert.ToInt32(reader[name]);
m_Fields[name].SetValue(row, v != 0 ? true : false);
}
else if (m_Fields[name].GetValue(row) is UUID)
{
UUID uuid = UUID.Zero;
UUID.TryParse(reader[name].ToString(), out uuid);
m_Fields[name].SetValue(row, uuid);
}
else if (m_Fields[name].GetValue(row) is int)
{
int v = Convert.ToInt32(reader[name]);
m_Fields[name].SetValue(row, v);
}
else
{
m_Fields[name].SetValue(row, reader[name]);
}
}
if (m_DataField != null)
{
Dictionary<string, string> data =
new Dictionary<string, string>();
foreach (string col in m_ColumnNames)
{
data[col] = reader[col].ToString();
if (data[col] == null)
data[col] = String.Empty;
}
m_DataField.SetValue(row, data);
}
result.Add(row);
}
return result.ToArray();
}
}
public virtual T[] Get(string where)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
string query = String.Format("SELECT * FROM {0} WHERE {1}",
m_Realm, where);
cmd.Connection = conn;
cmd.CommandText = query;
//m_log.WarnFormat("[PGSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
conn.Open();
return DoQuery(cmd);
}
}
public virtual T[] Get(string where, NpgsqlParameter parameter)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
string query = String.Format("SELECT * FROM {0} WHERE {1}",
m_Realm, where);
cmd.Connection = conn;
cmd.CommandText = query;
//m_log.WarnFormat("[PGSQLGenericTable]: SELECT {0} WHERE {1}", m_Realm, where);
cmd.Parameters.Add(parameter);
conn.Open();
return DoQuery(cmd);
}
}
public virtual bool Store(T row)
{
List<string> constraintFields = GetConstraints();
List<KeyValuePair<string, string>> constraints = new List<KeyValuePair<string, string>>();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
StringBuilder query = new StringBuilder();
List<String> names = new List<String>();
List<String> values = new List<String>();
foreach (FieldInfo fi in m_Fields.Values)
{
names.Add(fi.Name);
values.Add(":" + fi.Name);
// Temporarily return more information about what field is unexpectedly null for
// http://opensimulator.org/mantis/view.php?id=5403. This might be due to a bug in the
// InventoryTransferModule or we may be required to substitute a DBNull here.
if (fi.GetValue(row) == null)
throw new NullReferenceException(
string.Format(
"[PGSQL GENERIC TABLE HANDLER]: Trying to store field {0} for {1} which is unexpectedly null",
fi.Name, row));
if (constraintFields.Count > 0 && constraintFields.Contains(fi.Name))
{
constraints.Add(new KeyValuePair<string, string>(fi.Name, fi.GetValue(row).ToString() ));
}
if (m_FieldTypes.ContainsKey(fi.Name))
cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row), m_FieldTypes[fi.Name]));
else
cmd.Parameters.Add(m_database.CreateParameter(fi.Name, fi.GetValue(row)));
}
if (m_DataField != null)
{
Dictionary<string, string> data =
(Dictionary<string, string>)m_DataField.GetValue(row);
foreach (KeyValuePair<string, string> kvp in data)
{
if (constraintFields.Count > 0 && constraintFields.Contains(kvp.Key))
{
constraints.Add(new KeyValuePair<string, string>(kvp.Key, kvp.Key));
}
names.Add(kvp.Key);
values.Add(":" + kvp.Key);
if (m_FieldTypes.ContainsKey(kvp.Key))
cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value, m_FieldTypes[kvp.Key]));
else
cmd.Parameters.Add(m_database.CreateParameter("" + kvp.Key, kvp.Value));
}
}
query.AppendFormat("UPDATE {0} SET ", m_Realm);
int i = 0;
for (i = 0; i < names.Count - 1; i++)
{
query.AppendFormat("\"{0}\" = {1}, ", names[i], values[i]);
}
query.AppendFormat("\"{0}\" = {1} ", names[i], values[i]);
if (constraints.Count > 0)
{
List<string> terms = new List<string>();
for (int j = 0; j < constraints.Count; j++)
{
terms.Add(String.Format(" \"{0}\" = :{0}", constraints[j].Key));
}
string where = String.Join(" AND ", terms.ToArray());
query.AppendFormat(" WHERE {0} ", where);
}
cmd.Connection = conn;
cmd.CommandText = query.ToString();
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
{
//m_log.WarnFormat("[PGSQLGenericTable]: Updating {0}", m_Realm);
return true;
}
else
{
// assume record has not yet been inserted
query = new StringBuilder();
query.AppendFormat("INSERT INTO {0} (\"", m_Realm);
query.Append(String.Join("\",\"", names.ToArray()));
query.Append("\") values (" + String.Join(",", values.ToArray()) + ")");
cmd.Connection = conn;
cmd.CommandText = query.ToString();
// m_log.WarnFormat("[PGSQLGenericTable]: Inserting into {0} sql {1}", m_Realm, cmd.CommandText);
if (conn.State != ConnectionState.Open)
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
}
return false;
}
}
public virtual bool Delete(string field, string key)
{
return Delete(new string[] { field }, new string[] { key });
}
public virtual bool Delete(string[] fields, string[] keys)
{
if (fields.Length != keys.Length)
return false;
List<string> terms = new List<string>();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
for (int i = 0; i < fields.Length; i++)
{
if (m_FieldTypes.ContainsKey(fields[i]))
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i], m_FieldTypes[fields[i]]));
else
cmd.Parameters.Add(m_database.CreateParameter(fields[i], keys[i]));
terms.Add(" \"" + fields[i] + "\" = :" + fields[i]);
}
string where = String.Join(" AND ", terms.ToArray());
string query = String.Format("DELETE FROM {0} WHERE {1}", m_Realm, where);
cmd.Connection = conn;
cmd.CommandText = query;
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
{
//m_log.Warn("[PGSQLGenericTable]: " + deleteCommand);
return true;
}
return false;
}
}
public long GetCount(string field, string key)
{
return GetCount(new string[] { field }, new string[] { key });
}
public long GetCount(string[] fields, string[] keys)
{
if (fields.Length != keys.Length)
return 0;
List<string> terms = new List<string>();
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
for (int i = 0; i < fields.Length; i++)
{
cmd.Parameters.AddWithValue(fields[i], keys[i]);
terms.Add("\"" + fields[i] + "\" = :" + fields[i]);
}
string where = String.Join(" and ", terms.ToArray());
string query = String.Format("select count(*) from {0} where {1}",
m_Realm, where);
cmd.CommandText = query;
Object result = DoQueryScalar(cmd);
return Convert.ToInt64(result);
}
}
public long GetCount(string where)
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
string query = String.Format("select count(*) from {0} where {1}",
m_Realm, where);
cmd.CommandText = query;
object result = DoQueryScalar(cmd);
return Convert.ToInt64(result);
}
}
public object DoQueryScalar(NpgsqlCommand cmd)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_ConnectionString))
{
dbcon.Open();
cmd.Connection = dbcon;
return cmd.ExecuteScalar();
}
}
}
}

View File

@@ -0,0 +1,68 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Threading;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for Avatar Storage
/// </summary>
public class PGSQLGridUserData : PGSQLGenericTableHandler<GridUserData>,
IGridUserData
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public PGSQLGridUserData(string connectionString, string realm) :
base(connectionString, realm, "GridUserStore")
{
}
public new GridUserData Get(string userID)
{
GridUserData[] ret = Get("UserID", userID);
if (ret.Length == 0)
return null;
return ret[0];
}
public GridUserData[] GetAll(string userID)
{
return base.Get(String.Format("\"UserID\" LIKE '{0}%'", userID));
}
}
}

View File

@@ -0,0 +1,485 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using OpenSim.Framework;
using OpenMetaverse;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
public class PGSQLGroupsData : IGroupsData
{
private PGSqlGroupsGroupsHandler m_Groups;
private PGSqlGroupsMembershipHandler m_Membership;
private PGSqlGroupsRolesHandler m_Roles;
private PGSqlGroupsRoleMembershipHandler m_RoleMembership;
private PGSqlGroupsInvitesHandler m_Invites;
private PGSqlGroupsNoticesHandler m_Notices;
private PGSqlGroupsPrincipalsHandler m_Principals;
public PGSQLGroupsData(string connectionString, string realm)
{
m_Groups = new PGSqlGroupsGroupsHandler(connectionString, realm + "_groups", realm + "_Store");
m_Membership = new PGSqlGroupsMembershipHandler(connectionString, realm + "_membership");
m_Roles = new PGSqlGroupsRolesHandler(connectionString, realm + "_roles");
m_RoleMembership = new PGSqlGroupsRoleMembershipHandler(connectionString, realm + "_rolemembership");
m_Invites = new PGSqlGroupsInvitesHandler(connectionString, realm + "_invites");
m_Notices = new PGSqlGroupsNoticesHandler(connectionString, realm + "_notices");
m_Principals = new PGSqlGroupsPrincipalsHandler(connectionString, realm + "_principals");
}
#region groups table
public bool StoreGroup(GroupData data)
{
return m_Groups.Store(data);
}
public GroupData RetrieveGroup(UUID groupID)
{
GroupData[] groups = m_Groups.Get("GroupID", groupID.ToString());
if (groups.Length > 0)
return groups[0];
return null;
}
public GroupData RetrieveGroup(string name)
{
GroupData[] groups = m_Groups.Get("Name", name);
if (groups.Length > 0)
return groups[0];
return null;
}
public GroupData[] RetrieveGroups(string pattern)
{
if (string.IsNullOrEmpty(pattern)) // True for where clause
{
pattern = " true ORDER BY lower(\"Name\") LIMIT 100";
return m_Groups.Get(pattern);
}
else
{
pattern = " lower(\"Name\") LIKE lower('%:pattern%') ORDER BY lower(\"Name\") LIMIT 100";
return m_Groups.Get(pattern, new NpgsqlParameter("pattern", pattern));
}
}
public bool DeleteGroup(UUID groupID)
{
return m_Groups.Delete("GroupID", groupID.ToString());
}
public int GroupsCount()
{
return (int)m_Groups.GetCount(" \"Location\" = \"\"");
}
#endregion
#region membership table
public MembershipData[] RetrieveMembers(UUID groupID)
{
return m_Membership.Get("GroupID", groupID.ToString());
}
public MembershipData RetrieveMember(UUID groupID, string pricipalID)
{
MembershipData[] m = m_Membership.Get(new string[] { "GroupID", "PrincipalID" },
new string[] { groupID.ToString(), pricipalID });
if (m != null && m.Length > 0)
return m[0];
return null;
}
public MembershipData[] RetrieveMemberships(string pricipalID)
{
return m_Membership.Get("PrincipalID", pricipalID.ToString());
}
public bool StoreMember(MembershipData data)
{
return m_Membership.Store(data);
}
public bool DeleteMember(UUID groupID, string pricipalID)
{
return m_Membership.Delete(new string[] { "GroupID", "PrincipalID" },
new string[] { groupID.ToString(), pricipalID });
}
public int MemberCount(UUID groupID)
{
return (int)m_Membership.GetCount("GroupID", groupID.ToString());
}
#endregion
#region roles table
public bool StoreRole(RoleData data)
{
return m_Roles.Store(data);
}
public RoleData RetrieveRole(UUID groupID, UUID roleID)
{
RoleData[] data = m_Roles.Get(new string[] { "GroupID", "RoleID" },
new string[] { groupID.ToString(), roleID.ToString() });
if (data != null && data.Length > 0)
return data[0];
return null;
}
public RoleData[] RetrieveRoles(UUID groupID)
{
//return m_Roles.RetrieveRoles(groupID);
return m_Roles.Get("GroupID", groupID.ToString());
}
public bool DeleteRole(UUID groupID, UUID roleID)
{
return m_Roles.Delete(new string[] { "GroupID", "RoleID" },
new string[] { groupID.ToString(), roleID.ToString() });
}
public int RoleCount(UUID groupID)
{
return (int)m_Roles.GetCount("GroupID", groupID.ToString());
}
#endregion
#region rolememberhip table
public RoleMembershipData[] RetrieveRolesMembers(UUID groupID)
{
RoleMembershipData[] data = m_RoleMembership.Get("GroupID", groupID.ToString());
return data;
}
public RoleMembershipData[] RetrieveRoleMembers(UUID groupID, UUID roleID)
{
RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID" },
new string[] { groupID.ToString(), roleID.ToString() });
return data;
}
public RoleMembershipData[] RetrieveMemberRoles(UUID groupID, string principalID)
{
RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "PrincipalID" },
new string[] { groupID.ToString(), principalID.ToString() });
return data;
}
public RoleMembershipData RetrieveRoleMember(UUID groupID, UUID roleID, string principalID)
{
RoleMembershipData[] data = m_RoleMembership.Get(new string[] { "GroupID", "RoleID", "PrincipalID" },
new string[] { groupID.ToString(), roleID.ToString(), principalID.ToString() });
if (data != null && data.Length > 0)
return data[0];
return null;
}
public int RoleMemberCount(UUID groupID, UUID roleID)
{
return (int)m_RoleMembership.GetCount(new string[] { "GroupID", "RoleID" },
new string[] { groupID.ToString(), roleID.ToString() });
}
public bool StoreRoleMember(RoleMembershipData data)
{
return m_RoleMembership.Store(data);
}
public bool DeleteRoleMember(RoleMembershipData data)
{
return m_RoleMembership.Delete(new string[] { "GroupID", "RoleID", "PrincipalID"},
new string[] { data.GroupID.ToString(), data.RoleID.ToString(), data.PrincipalID });
}
public bool DeleteMemberAllRoles(UUID groupID, string principalID)
{
return m_RoleMembership.Delete(new string[] { "GroupID", "PrincipalID" },
new string[] { groupID.ToString(), principalID });
}
#endregion
#region principals table
public bool StorePrincipal(PrincipalData data)
{
return m_Principals.Store(data);
}
public PrincipalData RetrievePrincipal(string principalID)
{
PrincipalData[] p = m_Principals.Get("PrincipalID", principalID);
if (p != null && p.Length > 0)
return p[0];
return null;
}
public bool DeletePrincipal(string principalID)
{
return m_Principals.Delete("PrincipalID", principalID);
}
#endregion
#region invites table
public bool StoreInvitation(InvitationData data)
{
return m_Invites.Store(data);
}
public InvitationData RetrieveInvitation(UUID inviteID)
{
InvitationData[] invites = m_Invites.Get("InviteID", inviteID.ToString());
if (invites != null && invites.Length > 0)
return invites[0];
return null;
}
public InvitationData RetrieveInvitation(UUID groupID, string principalID)
{
InvitationData[] invites = m_Invites.Get(new string[] { "GroupID", "PrincipalID" },
new string[] { groupID.ToString(), principalID });
if (invites != null && invites.Length > 0)
return invites[0];
return null;
}
public bool DeleteInvite(UUID inviteID)
{
return m_Invites.Delete("InviteID", inviteID.ToString());
}
public void DeleteOldInvites()
{
m_Invites.DeleteOld();
}
#endregion
#region notices table
public bool StoreNotice(NoticeData data)
{
return m_Notices.Store(data);
}
public NoticeData RetrieveNotice(UUID noticeID)
{
NoticeData[] notices = m_Notices.Get("NoticeID", noticeID.ToString());
if (notices != null && notices.Length > 0)
return notices[0];
return null;
}
public NoticeData[] RetrieveNotices(UUID groupID)
{
NoticeData[] notices = m_Notices.Get("GroupID", groupID.ToString());
return notices;
}
public bool DeleteNotice(UUID noticeID)
{
return m_Notices.Delete("NoticeID", noticeID.ToString());
}
public void DeleteOldNotices()
{
m_Notices.DeleteOld();
}
#endregion
#region combinations
public MembershipData RetrievePrincipalGroupMembership(string principalID, UUID groupID)
{
// TODO
return null;
}
public MembershipData[] RetrievePrincipalGroupMemberships(string principalID)
{
// TODO
return null;
}
#endregion
}
public class PGSqlGroupsGroupsHandler : PGSQLGenericTableHandler<GroupData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsGroupsHandler(string connectionString, string realm, string store)
: base(connectionString, realm, store)
{
}
}
public class PGSqlGroupsMembershipHandler : PGSQLGenericTableHandler<MembershipData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsMembershipHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
}
public class PGSqlGroupsRolesHandler : PGSQLGenericTableHandler<RoleData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsRolesHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
}
public class PGSqlGroupsRoleMembershipHandler : PGSQLGenericTableHandler<RoleMembershipData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsRoleMembershipHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
}
public class PGSqlGroupsInvitesHandler : PGSQLGenericTableHandler<InvitationData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsInvitesHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
public void DeleteOld()
{
uint now = (uint)Util.UnixTimeSinceEpoch();
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < :tstamp", m_Realm);
cmd.Parameters.AddWithValue("tstamp", now - 14 * 24 * 60 * 60); // > 2 weeks old
ExecuteNonQuery(cmd);
}
}
}
public class PGSqlGroupsNoticesHandler : PGSQLGenericTableHandler<NoticeData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsNoticesHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
public void DeleteOld()
{
uint now = (uint)Util.UnixTimeSinceEpoch();
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < :tstamp", m_Realm);
cmd.Parameters.AddWithValue("tstamp", now - 14 * 24 * 60 * 60); // > 2 weeks old
ExecuteNonQuery(cmd);
}
}
}
public class PGSqlGroupsPrincipalsHandler : PGSQLGenericTableHandler<PrincipalData>
{
protected override Assembly Assembly
{
// WARNING! Moving migrations to this assembly!!!
get { return GetType().Assembly; }
}
public PGSqlGroupsPrincipalsHandler(string connectionString, string realm)
: base(connectionString, realm, string.Empty)
{
}
}
}

View File

@@ -0,0 +1,80 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Threading;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for user grid data
/// </summary>
public class PGSQLHGTravelData : PGSQLGenericTableHandler<HGTravelingData>, IHGTravelingData
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public PGSQLHGTravelData(string connectionString, string realm) : base(connectionString, realm, "HGTravelStore") { }
public HGTravelingData Get(UUID sessionID)
{
HGTravelingData[] ret = Get("SessionID", sessionID.ToString());
if (ret.Length == 0)
return null;
return ret[0];
}
public HGTravelingData[] GetSessions(UUID userID)
{
return base.Get("UserID", userID.ToString());
}
public bool Delete(UUID sessionID)
{
return Delete("SessionID", sessionID.ToString());
}
public void DeleteOld()
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"delete from {0} where ""TMStamp"" < CURRENT_DATE - INTERVAL '2 day'", m_Realm);
ExecuteNonQuery(cmd);
}
}
}
}

View File

@@ -0,0 +1,831 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL interface for the inventory server
/// </summary>
public class PGSQLInventoryData : IInventoryDataPlugin
{
private const string _migrationStore = "InventoryStore";
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// The database manager
/// </summary>
private PGSQLManager database;
private string m_connectionString;
#region IPlugin members
[Obsolete("Cannot be default-initialized!")]
public void Initialise()
{
m_log.Info("[PGSQLInventoryData]: " + Name + " cannot be default-initialized!");
throw new PluginNotInitialisedException(Name);
}
/// <summary>
/// Loads and initialises the PGSQL inventory storage interface
/// </summary>
/// <param name="connectionString">connect string</param>
/// <remarks>use PGSQL_connection.ini</remarks>
public void Initialise(string connectionString)
{
m_connectionString = connectionString;
database = new PGSQLManager(connectionString);
//New migrations check of store
database.CheckMigration(_migrationStore);
}
/// <summary>
/// The name of this DB provider
/// </summary>
/// <returns>A string containing the name of the DB provider</returns>
public string Name
{
get { return "PGSQL Inventory Data Interface"; }
}
/// <summary>
/// Closes this DB provider
/// </summary>
public void Dispose()
{
database = null;
}
/// <summary>
/// Returns the version of this DB provider
/// </summary>
/// <returns>A string containing the DB provider</returns>
public string Version
{
get { return database.getVersion(); }
}
#endregion
#region Folder methods
/// <summary>
/// Returns a list of the root folders within a users inventory
/// </summary>
/// <param name="user">The user whos inventory is to be searched</param>
/// <returns>A list of folder objects</returns>
public List<InventoryFolderBase> getUserRootFolders(UUID user)
{
if (user == UUID.Zero)
return new List<InventoryFolderBase>();
return getInventoryFolders(UUID.Zero, user);
}
/// <summary>
/// see InventoryItemBase.getUserRootFolder
/// </summary>
/// <param name="user">the User UUID</param>
/// <returns></returns>
public InventoryFolderBase getUserRootFolder(UUID user)
{
List<InventoryFolderBase> items = getUserRootFolders(user);
InventoryFolderBase rootFolder = null;
// There should only ever be one root folder for a user. However, if there's more
// than one we'll simply use the first one rather than failing. It would be even
// nicer to print some message to this effect, but this feels like it's too low a
// to put such a message out, and it's too minor right now to spare the time to
// suitably refactor.
if (items.Count > 0)
{
rootFolder = items[0];
}
return rootFolder;
}
/// <summary>
/// Returns a list of folders in a users inventory contained within the specified folder
/// </summary>
/// <param name="parentID">The folder to search</param>
/// <returns>A list of inventory folders</returns>
public List<InventoryFolderBase> getInventoryFolders(UUID parentID)
{
return getInventoryFolders(parentID, UUID.Zero);
}
/// <summary>
/// Returns a specified inventory folder
/// </summary>
/// <param name="folderID">The folder to return</param>
/// <returns>A folder class</returns>
public InventoryFolderBase getInventoryFolder(UUID folderID)
{
string sql = "SELECT * FROM inventoryfolders WHERE \"folderID\" = :folderID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("folderID", folderID));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
return readInventoryFolder(reader);
}
}
}
m_log.InfoFormat("[INVENTORY DB] : Found no inventory folder with ID : {0}", folderID);
return null;
}
/// <summary>
/// Returns all child folders in the hierarchy from the parent folder and down.
/// Does not return the parent folder itself.
/// </summary>
/// <param name="parentID">The folder to get subfolders for</param>
/// <returns>A list of inventory folders</returns>
public List<InventoryFolderBase> getFolderHierarchy(UUID parentID)
{
//Note maybe change this to use a Dataset that loading in all folders of a user and then go throw it that way.
//Note this is changed so it opens only one connection to the database and not everytime it wants to get data.
/* NOTE: the implementation below is very inefficient (makes a separate request to get subfolders for
* every found folder, recursively). Inventory code for other DBs has been already rewritten to get ALL
* inventory for a specific user at once.
*
* Meanwhile, one little thing is corrected: getFolderHierarchy(UUID.Zero) doesn't make sense and should never
* be used, so check for that and return an empty list.
*/
List<InventoryFolderBase> folders = new List<InventoryFolderBase>();
if (parentID == UUID.Zero)
return folders;
string sql = "SELECT * FROM inventoryfolders WHERE \"parentFolderID\" = :parentID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("parentID", parentID));
conn.Open();
folders.AddRange(getInventoryFolders(cmd));
List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
foreach (InventoryFolderBase folderBase in folders)
{
tempFolders.AddRange(getFolderHierarchy(folderBase.ID, cmd));
}
if (tempFolders.Count > 0)
{
folders.AddRange(tempFolders);
}
}
return folders;
}
/// <summary>
/// Creates a new inventory folder
/// </summary>
/// <param name="folder">Folder to create</param>
public void addInventoryFolder(InventoryFolderBase folder)
{
string sql = "INSERT INTO inventoryfolders (\"folderID\", \"agentID\", \"parentFolderID\", \"folderName\", type, version) " +
" VALUES (:folderID, :agentID, :parentFolderID, :folderName, :type, :version);";
string folderName = folder.Name;
if (folderName.Length > 64)
{
folderName = folderName.Substring(0, 64);
m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on add");
}
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
}
}
}
/// <summary>
/// Updates an inventory folder
/// </summary>
/// <param name="folder">Folder to update</param>
public void updateInventoryFolder(InventoryFolderBase folder)
{
string sql = @"UPDATE inventoryfolders SET ""agentID"" = :agentID,
""parentFolderID"" = :parentFolderID,
""folderName"" = :folderName,
type = :type,
version = :version
WHERE folderID = :folderID";
string folderName = folder.Name;
if (folderName.Length > 64)
{
folderName = folderName.Substring(0, 64);
m_log.Warn("[INVENTORY DB]: Name field truncated from " + folder.Name.Length.ToString() + " to " + folderName.Length + " characters on update");
}
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
cmd.Parameters.Add(database.CreateParameter("agentID", folder.Owner));
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
cmd.Parameters.Add(database.CreateParameter("folderName", folderName));
cmd.Parameters.Add(database.CreateParameter("type", folder.Type));
cmd.Parameters.Add(database.CreateParameter("version", folder.Version));
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
}
}
}
/// <summary>
/// Updates an inventory folder
/// </summary>
/// <param name="folder">Folder to update</param>
public void moveInventoryFolder(InventoryFolderBase folder)
{
string sql = @"UPDATE inventoryfolders SET ""parentFolderID"" = :parentFolderID WHERE ""folderID"" = :folderID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folder.ParentID));
cmd.Parameters.Add(database.CreateParameter("folderID", folder.ID));
conn.Open();
try
{
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.ErrorFormat("[INVENTORY DB]: Error : {0}", e.Message);
}
}
}
/// <summary>
/// Delete an inventory folder
/// </summary>
/// <param name="folderID">Id of folder to delete</param>
public void deleteInventoryFolder(UUID folderID)
{
string sql = @"SELECT * FROM inventoryfolders WHERE ""parentFolderID"" = :parentID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
List<InventoryFolderBase> subFolders;
cmd.Parameters.Add(database.CreateParameter("parentID", UUID.Zero));
conn.Open();
subFolders = getFolderHierarchy(folderID, cmd);
//Delete all sub-folders
foreach (InventoryFolderBase f in subFolders)
{
DeleteOneFolder(f.ID, conn);
DeleteItemsInFolder(f.ID, conn);
}
//Delete the actual row
DeleteOneFolder(folderID, conn);
DeleteItemsInFolder(folderID, conn);
}
}
#endregion
#region Item Methods
/// <summary>
/// Returns a list of items in a specified folder
/// </summary>
/// <param name="folderID">The folder to search</param>
/// <returns>A list containing inventory items</returns>
public List<InventoryItemBase> getInventoryInFolder(UUID folderID)
{
string sql = @"SELECT * FROM inventoryitems WHERE ""parentFolderID"" = :parentFolderID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("parentFolderID", folderID));
conn.Open();
List<InventoryItemBase> items = new List<InventoryItemBase>();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
items.Add(readInventoryItem(reader));
}
}
return items;
}
}
/// <summary>
/// Returns a specified inventory item
/// </summary>
/// <param name="itemID">The item ID</param>
/// <returns>An inventory item</returns>
public InventoryItemBase getInventoryItem(UUID itemID)
{
string sql = @"SELECT * FROM inventoryitems WHERE ""inventoryID"" = :inventoryID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
return readInventoryItem(reader);
}
}
}
m_log.InfoFormat("[INVENTORY DB]: Found no inventory item with ID : {0}", itemID);
return null;
}
/// <summary>
/// Adds a specified item to the database
/// </summary>
/// <param name="item">The inventory item</param>
public void addInventoryItem(InventoryItemBase item)
{
if (getInventoryItem(item.ID) != null)
{
updateInventoryItem(item);
return;
}
string sql = @"INSERT INTO inventoryitems
(""inventoryID"", ""assetID"", ""assetType"", ""parentFolderID"", ""avatarID"", ""inventoryName"",
""inventoryDescription"", ""inventoryNextPermissions"", ""inventoryCurrentPermissions"",
""invType"", ""creatorID"", ""inventoryBasePermissions"", ""inventoryEveryOnePermissions"", ""inventoryGroupPermissions"",
""salePrice"", ""SaleType"", ""creationDate"", ""groupID"", ""groupOwned"", flags)
VALUES
(:inventoryID, :assetID, :assetType, :parentFolderID, :avatarID, :inventoryName, :inventoryDescription,
:inventoryNextPermissions, :inventoryCurrentPermissions, :invType, :creatorID,
:inventoryBasePermissions, :inventoryEveryOnePermissions, :inventoryGroupPermissions, :SalePrice, :SaleType,
:creationDate, :groupID, :groupOwned, :flags)";
string itemName = item.Name;
if (item.Name.Length > 64)
{
itemName = item.Name.Substring(0, 64);
m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters");
}
string itemDesc = item.Description;
if (item.Description.Length > 128)
{
itemDesc = item.Description.Substring(0, 128);
m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters");
}
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
command.Parameters.Add(database.CreateParameter("invType", item.InvType));
command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
command.Parameters.Add(database.CreateParameter("SalePrice", item.SalePrice));
command.Parameters.Add(database.CreateParameter("SaleType", item.SaleType));
command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
command.Parameters.Add(database.CreateParameter("flags", item.Flags));
conn.Open();
try
{
command.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB]: Error inserting item :" + e.Message);
}
}
sql = @"UPDATE inventoryfolders SET version = version + 1 WHERE ""folderID"" = @folderID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
command.Parameters.Add(database.CreateParameter("folderID", item.Folder.ToString()));
conn.Open();
try
{
command.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB] Error updating inventory folder for new item :" + e.Message);
}
}
}
/// <summary>
/// Updates the specified inventory item
/// </summary>
/// <param name="item">Inventory item to update</param>
public void updateInventoryItem(InventoryItemBase item)
{
string sql = @"UPDATE inventoryitems SET ""assetID"" = :assetID,
""assetType"" = :assetType,
""parentFolderID"" = :parentFolderID,
""avatarID"" = :avatarID,
""inventoryName"" = :inventoryName,
""inventoryDescription"" = :inventoryDescription,
""inventoryNextPermissions"" = :inventoryNextPermissions,
""inventoryCurrentPermissions"" = :inventoryCurrentPermissions,
""invType"" = :invType,
""creatorID"" = :creatorID,
""inventoryBasePermissions"" = :inventoryBasePermissions,
""inventoryEveryOnePermissions"" = :inventoryEveryOnePermissions,
""inventoryGroupPermissions"" = :inventoryGroupPermissions,
""salePrice"" = :SalePrice,
""saleType"" = :SaleType,
""creationDate"" = :creationDate,
""groupID"" = :groupID,
""groupOwned"" = :groupOwned,
flags = :flags
WHERE ""inventoryID"" = :inventoryID";
string itemName = item.Name;
if (item.Name.Length > 64)
{
itemName = item.Name.Substring(0, 64);
m_log.Warn("[INVENTORY DB]: Name field truncated from " + item.Name.Length.ToString() + " to " + itemName.Length.ToString() + " characters on update");
}
string itemDesc = item.Description;
if (item.Description.Length > 128)
{
itemDesc = item.Description.Substring(0, 128);
m_log.Warn("[INVENTORY DB]: Description field truncated from " + item.Description.Length.ToString() + " to " + itemDesc.Length.ToString() + " characters on update");
}
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
command.Parameters.Add(database.CreateParameter("inventoryID", item.ID));
command.Parameters.Add(database.CreateParameter("assetID", item.AssetID));
command.Parameters.Add(database.CreateParameter("assetType", item.AssetType));
command.Parameters.Add(database.CreateParameter("parentFolderID", item.Folder));
command.Parameters.Add(database.CreateParameter("avatarID", item.Owner));
command.Parameters.Add(database.CreateParameter("inventoryName", itemName));
command.Parameters.Add(database.CreateParameter("inventoryDescription", itemDesc));
command.Parameters.Add(database.CreateParameter("inventoryNextPermissions", item.NextPermissions));
command.Parameters.Add(database.CreateParameter("inventoryCurrentPermissions", item.CurrentPermissions));
command.Parameters.Add(database.CreateParameter("invType", item.InvType));
command.Parameters.Add(database.CreateParameter("creatorID", item.CreatorId));
command.Parameters.Add(database.CreateParameter("inventoryBasePermissions", item.BasePermissions));
command.Parameters.Add(database.CreateParameter("inventoryEveryOnePermissions", item.EveryOnePermissions));
command.Parameters.Add(database.CreateParameter("inventoryGroupPermissions", item.GroupPermissions));
command.Parameters.Add(database.CreateParameter("SalePrice", item.SalePrice));
command.Parameters.Add(database.CreateParameter("SaleType", item.SaleType));
command.Parameters.Add(database.CreateParameter("creationDate", item.CreationDate));
command.Parameters.Add(database.CreateParameter("groupID", item.GroupID));
command.Parameters.Add(database.CreateParameter("groupOwned", item.GroupOwned));
command.Parameters.Add(database.CreateParameter("flags", item.Flags));
conn.Open();
try
{
command.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB]: Error updating item :" + e.Message);
}
}
}
// See IInventoryDataPlugin
/// <summary>
/// Delete an item in inventory database
/// </summary>
/// <param name="itemID">the item UUID</param>
public void deleteInventoryItem(UUID itemID)
{
string sql = @"DELETE FROM inventoryitems WHERE ""inventoryID""=:inventoryID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("inventoryID", itemID));
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB]: Error deleting item :" + e.Message);
}
}
}
public InventoryItemBase queryInventoryItem(UUID itemID)
{
return getInventoryItem(itemID);
}
public InventoryFolderBase queryInventoryFolder(UUID folderID)
{
return getInventoryFolder(folderID);
}
/// <summary>
/// Returns all activated gesture-items in the inventory of the specified avatar.
/// </summary>
/// <param name="avatarID">The <see cref="UUID"/> of the avatar</param>
/// <returns>
/// The list of gestures (<see cref="InventoryItemBase"/>s)
/// </returns>
public List<InventoryItemBase> fetchActiveGestures(UUID avatarID)
{
string sql = @"SELECT * FROM inventoryitems WHERE ""avatarID"" = :uuid AND ""assetType"" = :assetType and flags = 1";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(database.CreateParameter("uuid", avatarID));
cmd.Parameters.Add(database.CreateParameter("assetType", (int)AssetType.Gesture));
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
List<InventoryItemBase> gestureList = new List<InventoryItemBase>();
while (reader.Read())
{
gestureList.Add(readInventoryItem(reader));
}
return gestureList;
}
}
}
#endregion
#region Private methods
/// <summary>
/// Delete an item in inventory database
/// </summary>
/// <param name="folderID">the item ID</param>
/// <param name="connection">connection to the database</param>
private void DeleteItemsInFolder(UUID folderID, NpgsqlConnection connection)
{
using (NpgsqlCommand command = new NpgsqlCommand(@"DELETE FROM inventoryitems WHERE ""folderID""=:folderID", connection))
{
command.Parameters.Add(database.CreateParameter("folderID", folderID));
try
{
command.ExecuteNonQuery();
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB] Error deleting item :" + e.Message);
}
}
}
/// <summary>
/// Gets the folder hierarchy in a loop.
/// </summary>
/// <param name="parentID">parent ID.</param>
/// <param name="command">SQL command/connection to database</param>
/// <returns></returns>
private static List<InventoryFolderBase> getFolderHierarchy(UUID parentID, NpgsqlCommand command)
{
command.Parameters["parentID"].Value = parentID.Guid; //.ToString();
List<InventoryFolderBase> folders = getInventoryFolders(command);
if (folders.Count > 0)
{
List<InventoryFolderBase> tempFolders = new List<InventoryFolderBase>();
foreach (InventoryFolderBase folderBase in folders)
{
tempFolders.AddRange(getFolderHierarchy(folderBase.ID, command));
}
if (tempFolders.Count > 0)
{
folders.AddRange(tempFolders);
}
}
return folders;
}
/// <summary>
/// Gets the inventory folders.
/// </summary>
/// <param name="parentID">parentID, use UUID.Zero to get root</param>
/// <param name="user">user id, use UUID.Zero, if you want all folders from a parentID.</param>
/// <returns></returns>
private List<InventoryFolderBase> getInventoryFolders(UUID parentID, UUID user)
{
string sql = @"SELECT * FROM inventoryfolders WHERE ""parentFolderID"" = :parentID AND ""agentID"" = :uuid";
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
using (NpgsqlCommand command = new NpgsqlCommand(sql, conn))
{
if (user == UUID.Zero)
{
command.Parameters.Add(database.CreateParameter("uuid", "%"));
}
else
{
command.Parameters.Add(database.CreateParameter("uuid", user));
}
command.Parameters.Add(database.CreateParameter("parentID", parentID));
conn.Open();
return getInventoryFolders(command);
}
}
/// <summary>
/// Gets the inventory folders.
/// </summary>
/// <param name="command">SQLcommand.</param>
/// <returns></returns>
private static List<InventoryFolderBase> getInventoryFolders(NpgsqlCommand command)
{
using (NpgsqlDataReader reader = command.ExecuteReader())
{
List<InventoryFolderBase> items = new List<InventoryFolderBase>();
while (reader.Read())
{
items.Add(readInventoryFolder(reader));
}
return items;
}
}
/// <summary>
/// Reads a list of inventory folders returned by a query.
/// </summary>
/// <param name="reader">A PGSQL Data Reader</param>
/// <returns>A List containing inventory folders</returns>
protected static InventoryFolderBase readInventoryFolder(NpgsqlDataReader reader)
{
try
{
InventoryFolderBase folder = new InventoryFolderBase();
folder.Owner = DBGuid.FromDB(reader["agentID"]);
folder.ParentID = DBGuid.FromDB(reader["parentFolderID"]);
folder.ID = DBGuid.FromDB(reader["folderID"]);
folder.Name = (string)reader["folderName"];
folder.Type = (short)reader["type"];
folder.Version = Convert.ToUInt16(reader["version"]);
return folder;
}
catch (Exception e)
{
m_log.Error("[INVENTORY DB] Error reading inventory folder :" + e.Message);
}
return null;
}
/// <summary>
/// Reads a one item from an SQL result
/// </summary>
/// <param name="reader">The SQL Result</param>
/// <returns>the item read</returns>
private static InventoryItemBase readInventoryItem(IDataRecord reader)
{
try
{
InventoryItemBase item = new InventoryItemBase();
item.ID = DBGuid.FromDB(reader["inventoryID"]);
item.AssetID = DBGuid.FromDB(reader["assetID"]);
item.AssetType = Convert.ToInt32(reader["assetType"].ToString());
item.Folder = DBGuid.FromDB(reader["parentFolderID"]);
item.Owner = DBGuid.FromDB(reader["avatarID"]);
item.Name = reader["inventoryName"].ToString();
item.Description = reader["inventoryDescription"].ToString();
item.NextPermissions = Convert.ToUInt32(reader["inventoryNextPermissions"]);
item.CurrentPermissions = Convert.ToUInt32(reader["inventoryCurrentPermissions"]);
item.InvType = Convert.ToInt32(reader["invType"].ToString());
item.CreatorId = reader["creatorID"].ToString();
item.BasePermissions = Convert.ToUInt32(reader["inventoryBasePermissions"]);
item.EveryOnePermissions = Convert.ToUInt32(reader["inventoryEveryOnePermissions"]);
item.GroupPermissions = Convert.ToUInt32(reader["inventoryGroupPermissions"]);
item.SalePrice = Convert.ToInt32(reader["salePrice"]);
item.SaleType = Convert.ToByte(reader["saleType"]);
item.CreationDate = Convert.ToInt32(reader["creationDate"]);
item.GroupID = DBGuid.FromDB(reader["groupID"]);
item.GroupOwned = Convert.ToBoolean(reader["groupOwned"]);
item.Flags = Convert.ToUInt32(reader["flags"]);
return item;
}
catch (NpgsqlException e)
{
m_log.Error("[INVENTORY DB]: Error reading inventory item :" + e.Message);
}
return null;
}
/// <summary>
/// Delete a folder in inventory databasae
/// </summary>
/// <param name="folderID">the folder UUID</param>
/// <param name="connection">connection to database</param>
private void DeleteOneFolder(UUID folderID, NpgsqlConnection connection)
{
try
{
using (NpgsqlCommand command = new NpgsqlCommand(@"DELETE FROM inventoryfolders WHERE ""folderID""=:folderID and type=-1", connection))
{
command.Parameters.Add(database.CreateParameter("folderID", folderID));
command.ExecuteNonQuery();
}
}
catch (NpgsqlException e)
{
m_log.Error("[INVENTORY DB]: Error deleting folder :" + e.Message);
}
}
#endregion
}
}

View File

@@ -0,0 +1,350 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Reflection;
using OpenSim.Framework;
using log4net;
using OpenMetaverse;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A management class for the MS SQL Storage Engine
/// </summary>
public class PGSQLManager
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// Connection string for ADO.net
/// </summary>
private readonly string connectionString;
/// <summary>
/// Initialize the manager and set the connectionstring
/// </summary>
/// <param name="connection"></param>
public PGSQLManager(string connection)
{
connectionString = connection;
InitializeMonoSecurity();
}
public void InitializeMonoSecurity()
{
if (!Util.IsPlatformMono)
{
if (AppDomain.CurrentDomain.GetData("MonoSecurityPostgresAdded") == null)
{
AppDomain.CurrentDomain.SetData("MonoSecurityPostgresAdded", "true");
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.AssemblyResolve += new ResolveEventHandler(ResolveEventHandlerMonoSec);
}
}
}
private System.Reflection.Assembly ResolveEventHandlerMonoSec(object sender, ResolveEventArgs args)
{
Assembly MyAssembly = null;
if (args.Name.Substring(0, args.Name.IndexOf(",")) == "Mono.Security")
{
MyAssembly = Assembly.LoadFrom("lib/NET/Mono.Security.dll");
}
//Return the loaded assembly.
return MyAssembly;
}
/// <summary>
/// Type conversion to a SQLDbType functions
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
internal NpgsqlDbType DbtypeFromType(Type type)
{
if (type == typeof(string))
{
return NpgsqlDbType.Varchar;
}
if (type == typeof(double))
{
return NpgsqlDbType.Double;
}
if (type == typeof(Single))
{
return NpgsqlDbType.Double;
}
if (type == typeof(int))
{
return NpgsqlDbType.Integer;
}
if (type == typeof(bool))
{
return NpgsqlDbType.Boolean;
}
if (type == typeof(UUID))
{
return NpgsqlDbType.Uuid;
}
if (type == typeof(byte))
{
return NpgsqlDbType.Smallint;
}
if (type == typeof(sbyte))
{
return NpgsqlDbType.Integer;
}
if (type == typeof(Byte[]))
{
return NpgsqlDbType.Bytea;
}
if (type == typeof(uint) || type == typeof(ushort))
{
return NpgsqlDbType.Integer;
}
if (type == typeof(ulong))
{
return NpgsqlDbType.Bigint;
}
if (type == typeof(DateTime))
{
return NpgsqlDbType.Timestamp;
}
return NpgsqlDbType.Varchar;
}
internal NpgsqlDbType DbtypeFromString(Type type, string PGFieldType)
{
if (PGFieldType == "")
{
return DbtypeFromType(type);
}
if (PGFieldType == "character varying")
{
return NpgsqlDbType.Varchar;
}
if (PGFieldType == "double precision")
{
return NpgsqlDbType.Double;
}
if (PGFieldType == "integer")
{
return NpgsqlDbType.Integer;
}
if (PGFieldType == "smallint")
{
return NpgsqlDbType.Smallint;
}
if (PGFieldType == "boolean")
{
return NpgsqlDbType.Boolean;
}
if (PGFieldType == "uuid")
{
return NpgsqlDbType.Uuid;
}
if (PGFieldType == "bytea")
{
return NpgsqlDbType.Bytea;
}
return DbtypeFromType(type);
}
/// <summary>
/// Creates value for parameter.
/// </summary>
/// <param name="value">The value.</param>
/// <returns></returns>
private static object CreateParameterValue(object value)
{
Type valueType = value.GetType();
if (valueType == typeof(UUID)) //TODO check if this works
{
return ((UUID) value).Guid;
}
if (valueType == typeof(UUID))
{
return ((UUID)value).Guid;
}
if (valueType == typeof(bool))
{
return (bool)value;
}
if (valueType == typeof(Byte[]))
{
return value;
}
if (valueType == typeof(int))
{
return value;
}
return value;
}
/// <summary>
/// Create value for parameter based on PGSQL Schema
/// </summary>
/// <param name="value"></param>
/// <param name="PGFieldType"></param>
/// <returns></returns>
internal static object CreateParameterValue(object value, string PGFieldType)
{
if (PGFieldType == "uuid")
{
UUID uidout;
UUID.TryParse(value.ToString(), out uidout);
return uidout;
}
if (PGFieldType == "integer")
{
int intout;
int.TryParse(value.ToString(), out intout);
return intout;
}
if (PGFieldType == "boolean")
{
return (value.ToString() == "true");
}
if (PGFieldType == "timestamp with time zone")
{
return (DateTime)value;
}
if (PGFieldType == "timestamp without time zone")
{
return (DateTime)value;
}
return CreateParameterValue(value);
}
/// <summary>
/// Create a parameter for a command
/// </summary>
/// <param name="parameterName">Name of the parameter.</param>
/// <param name="parameterObject">parameter object.</param>
/// <returns></returns>
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject)
{
return CreateParameter(parameterName, parameterObject, false);
}
/// <summary>
/// Creates the parameter for a command.
/// </summary>
/// <param name="parameterName">Name of the parameter.</param>
/// <param name="parameterObject">parameter object.</param>
/// <param name="parameterOut">if set to <c>true</c> parameter is a output parameter</param>
/// <returns></returns>
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, bool parameterOut)
{
//Tweak so we dont always have to add : sign
if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":","");
//HACK if object is null, it is turned into a string, there are no nullable type till now
if (parameterObject == null) parameterObject = "";
NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromType(parameterObject.GetType()));
if (parameterOut)
{
parameter.Direction = ParameterDirection.Output;
}
else
{
parameter.Direction = ParameterDirection.Input;
parameter.Value = CreateParameterValue(parameterObject);
}
return parameter;
}
/// <summary>
/// Create a parameter with PGSQL schema type
/// </summary>
/// <param name="parameterName"></param>
/// <param name="parameterObject"></param>
/// <param name="PGFieldType"></param>
/// <returns></returns>
internal NpgsqlParameter CreateParameter(string parameterName, object parameterObject, string PGFieldType)
{
//Tweak so we dont always have to add : sign
if (parameterName.StartsWith(":")) parameterName = parameterName.Replace(":", "");
//HACK if object is null, it is turned into a string, there are no nullable type till now
if (parameterObject == null) parameterObject = "";
NpgsqlParameter parameter = new NpgsqlParameter(parameterName, DbtypeFromString(parameterObject.GetType(), PGFieldType));
parameter.Direction = ParameterDirection.Input;
parameter.Value = CreateParameterValue(parameterObject, PGFieldType);
return parameter;
}
/// <summary>
/// Checks if we need to do some migrations to the database
/// </summary>
/// <param name="migrationStore">migrationStore.</param>
public void CheckMigration(string migrationStore)
{
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
Assembly assem = GetType().Assembly;
PGSQLMigration migration = new PGSQLMigration(connection, assem, migrationStore);
migration.Update();
}
}
/// <summary>
/// Returns the version of this DB provider
/// </summary>
/// <returns>A string containing the DB provider</returns>
public string getVersion()
{
Module module = GetType().Module;
// string dllName = module.Assembly.ManifestModule.Name;
Version dllVersion = module.Assembly.GetName().Version;
return
string.Format("{0}.{1}.{2}.{3}", dllVersion.Major, dllVersion.Minor, dllVersion.Build,
dllVersion.Revision);
}
}
}

View File

@@ -0,0 +1,102 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using Npgsql;
using System;
using System.Data;
using System.Data.Common;
using System.Reflection;
namespace OpenSim.Data.PGSQL
{
public class PGSQLMigration : Migration
{
public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string type)
: base(conn, assem, type)
{
}
public PGSQLMigration(NpgsqlConnection conn, Assembly assem, string subtype, string type)
: base(conn, assem, subtype, type)
{
}
protected override int FindVersion(DbConnection conn, string type)
{
int version = 0;
NpgsqlConnection lcConn = (NpgsqlConnection)conn;
using (NpgsqlCommand cmd = lcConn.CreateCommand())
{
try
{
cmd.CommandText = "select version from migrations where name = '" + type + "' " +
" order by version desc limit 1"; //Must be
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
if (reader.Read())
{
version = Convert.ToInt32(reader["version"]);
}
reader.Close();
}
}
catch
{
// Return -1 to indicate table does not exist
return -1;
}
}
return version;
}
protected override void ExecuteScript(DbConnection conn, string[] script)
{
if (!(conn is NpgsqlConnection))
{
base.ExecuteScript(conn, script);
return;
}
foreach (string sql in script)
{
try
{
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, (NpgsqlConnection)conn))
{
cmd.ExecuteNonQuery();
}
}
catch (Exception)
{
throw new Exception(sql);
}
}
}
}
}

View File

@@ -26,38 +26,31 @@
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;
using OpenSim.Framework;
using OpenMetaverse;
using Npgsql;
namespace OpenSim.Framework.Configuration.HTTP
namespace OpenSim.Data.PGSQL
{
public class RemoteConfigSettings
public class PGSQLOfflineIMData : PGSQLGenericTableHandler<OfflineIMData>, IOfflineIMData
{
private ConfigurationMember configMember;
public string baseConfigURL = String.Empty;
public RemoteConfigSettings(string filename)
public PGSQLOfflineIMData(string connectionString, string realm)
: base(connectionString, realm, "IM_Store")
{
configMember =
new ConfigurationMember(filename, "REMOTE CONFIG SETTINGS", loadConfigurationOptions,
handleIncomingConfiguration,true);
configMember.forceConfigurationPluginLibrary("OpenSim.Framework.Configuration.XML.dll");
configMember.performConfigurationRetrieve();
}
public void loadConfigurationOptions()
public void DeleteOld()
{
configMember.addConfigurationOption("base_config_url",
ConfigurationOption.ConfigurationTypes.TYPE_STRING_NOT_EMPTY,
"URL Containing Configuration Files", "http://localhost/", false);
}
public bool handleIncomingConfiguration(string configuration_key, object configuration_result)
{
if (configuration_key == "base_config_url")
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
baseConfigURL = (string) configuration_result;
cmd.CommandText = String.Format("delete from {0} where \"TMStamp\" < CURRENT_DATE - INTERVAL '2 week'", m_Realm);
ExecuteNonQuery(cmd);
}
return true;
}
}
}

View File

@@ -0,0 +1,115 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Reflection;
using System.Threading;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for the Presence Server
/// </summary>
public class PGSQLPresenceData : PGSQLGenericTableHandler<PresenceData>,
IPresenceData
{
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public PGSQLPresenceData(string connectionString, string realm) :
base(connectionString, realm, "Presence")
{
}
public PresenceData Get(UUID sessionID)
{
PresenceData[] ret = Get("SessionID", sessionID.ToString());
if (ret.Length == 0)
return null;
return ret[0];
}
public void LogoutRegionAgents(UUID regionID)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"DELETE FROM {0} WHERE ""RegionID""=:RegionID", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();
}
}
public bool ReportAgent(UUID sessionID, UUID regionID)
{
PresenceData[] pd = Get("SessionID", sessionID.ToString());
if (pd.Length == 0)
return false;
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"UPDATE {0} SET
""RegionID"" = :RegionID
WHERE ""SessionID"" = :SessionID", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("SessionID", sessionID));
cmd.Parameters.Add(m_database.CreateParameter("RegionID", regionID));
cmd.Connection = conn;
conn.Open();
if (cmd.ExecuteNonQuery() == 0)
return false;
}
return true;
}
public bool VerifyAgent(UUID agentId, UUID secureSessionID)
{
PresenceData[] ret = Get("SecureSessionID", secureSessionID.ToString());
if (ret.Length == 0)
return false;
if(ret[0].UserID != agentId.ToString())
return false;
return true;
}
}
}

View File

@@ -0,0 +1,392 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.Drawing;
using System.IO;
using System.Reflection;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Region.Framework.Interfaces;
using OpenSim.Region.Framework.Scenes;
using RegionFlags = OpenSim.Framework.RegionFlags;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
/// <summary>
/// A PGSQL Interface for the Region Server.
/// </summary>
public class PGSQLRegionData : IRegionData
{
private string m_Realm;
private List<string> m_ColumnNames = null;
private string m_ConnectionString;
private PGSQLManager m_database;
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected Dictionary<string, string> m_FieldTypes = new Dictionary<string, string>();
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
public PGSQLRegionData(string connectionString, string realm)
{
m_Realm = realm;
m_ConnectionString = connectionString;
m_database = new PGSQLManager(connectionString);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, "GridStore");
m.Update();
}
LoadFieldTypes();
}
private void LoadFieldTypes()
{
m_FieldTypes = new Dictionary<string, string>();
string query = string.Format(@"select column_name,data_type
from INFORMATION_SCHEMA.COLUMNS
where table_name = lower('{0}');
", m_Realm);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(query, conn))
{
conn.Open();
using (NpgsqlDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
// query produces 0 to many rows of single column, so always add the first item in each row
m_FieldTypes.Add((string)rdr[0], (string)rdr[1]);
}
}
}
}
public List<RegionData> Get(string regionName, UUID scopeID)
{
string sql = "select * from "+m_Realm+" where lower(\"regionName\") like lower(:regionName) ";
if (scopeID != UUID.Zero)
sql += " and \"ScopeID\" = :scopeID";
sql += " order by lower(\"regionName\")";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("regionName", regionName));
if (scopeID != UUID.Zero)
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
return RunCommand(cmd);
}
}
public RegionData Get(int posX, int posY, UUID scopeID)
{
string sql = "select * from "+m_Realm+" where \"locX\" = :posX and \"locY\" = :posY";
if (scopeID != UUID.Zero)
sql += " and \"ScopeID\" = :scopeID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("posX", posX));
cmd.Parameters.Add(m_database.CreateParameter("posY", posY));
if (scopeID != UUID.Zero)
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
List<RegionData> ret = RunCommand(cmd);
if (ret.Count == 0)
return null;
return ret[0];
}
}
public RegionData Get(UUID regionID, UUID scopeID)
{
string sql = "select * from "+m_Realm+" where uuid = :regionID";
if (scopeID != UUID.Zero)
sql += " and \"ScopeID\" = :scopeID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("regionID", regionID));
if (scopeID != UUID.Zero)
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
List<RegionData> ret = RunCommand(cmd);
if (ret.Count == 0)
return null;
return ret[0];
}
}
public List<RegionData> Get(int startX, int startY, int endX, int endY, UUID scopeID)
{
string sql = "select * from "+m_Realm+" where \"locX\" between :startX and :endX and \"locY\" between :startY and :endY";
if (scopeID != UUID.Zero)
sql += " and \"ScopeID\" = :scopeID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("startX", startX));
cmd.Parameters.Add(m_database.CreateParameter("startY", startY));
cmd.Parameters.Add(m_database.CreateParameter("endX", endX));
cmd.Parameters.Add(m_database.CreateParameter("endY", endY));
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
return RunCommand(cmd);
}
}
public List<RegionData> RunCommand(NpgsqlCommand cmd)
{
List<RegionData> retList = new List<RegionData>();
NpgsqlDataReader result = cmd.ExecuteReader();
while (result.Read())
{
RegionData ret = new RegionData();
ret.Data = new Dictionary<string, object>();
UUID regionID;
UUID.TryParse(result["uuid"].ToString(), out regionID);
ret.RegionID = regionID;
UUID scope;
UUID.TryParse(result["ScopeID"].ToString(), out scope);
ret.ScopeID = scope;
ret.RegionName = result["regionName"].ToString();
ret.posX = Convert.ToInt32(result["locX"]);
ret.posY = Convert.ToInt32(result["locY"]);
ret.sizeX = Convert.ToInt32(result["sizeX"]);
ret.sizeY = Convert.ToInt32(result["sizeY"]);
if (m_ColumnNames == null)
{
m_ColumnNames = new List<string>();
DataTable schemaTable = result.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
m_ColumnNames.Add(row["ColumnName"].ToString());
}
foreach (string s in m_ColumnNames)
{
if (s == "uuid")
continue;
if (s == "ScopeID")
continue;
if (s == "regionName")
continue;
if (s == "locX")
continue;
if (s == "locY")
continue;
ret.Data[s] = result[s].ToString();
}
retList.Add(ret);
}
return retList;
}
public bool Store(RegionData data)
{
if (data.Data.ContainsKey("uuid"))
data.Data.Remove("uuid");
if (data.Data.ContainsKey("ScopeID"))
data.Data.Remove("ScopeID");
if (data.Data.ContainsKey("regionName"))
data.Data.Remove("regionName");
if (data.Data.ContainsKey("posX"))
data.Data.Remove("posX");
if (data.Data.ContainsKey("posY"))
data.Data.Remove("posY");
if (data.Data.ContainsKey("sizeX"))
data.Data.Remove("sizeX");
if (data.Data.ContainsKey("sizeY"))
data.Data.Remove("sizeY");
if (data.Data.ContainsKey("locX"))
data.Data.Remove("locX");
if (data.Data.ContainsKey("locY"))
data.Data.Remove("locY");
string[] fields = new List<string>(data.Data.Keys).ToArray();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
string update = "update " + m_Realm + " set \"locX\"=:posX, \"locY\"=:posY, \"sizeX\"=:sizeX, \"sizeY\"=:sizeY ";
foreach (string field in fields)
{
update += ", ";
update += " \"" + field + "\" = :" + field;
if (m_FieldTypes.ContainsKey(field))
cmd.Parameters.Add(m_database.CreateParameter(field, data.Data[field], m_FieldTypes[field]));
else
cmd.Parameters.Add(m_database.CreateParameter(field, data.Data[field]));
}
update += " where uuid = :regionID";
if (data.ScopeID != UUID.Zero)
update += " and \"ScopeID\" = :scopeID";
cmd.CommandText = update;
cmd.Connection = conn;
cmd.Parameters.Add(m_database.CreateParameter("regionID", data.RegionID));
cmd.Parameters.Add(m_database.CreateParameter("regionName", data.RegionName));
cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
cmd.Parameters.Add(m_database.CreateParameter("posX", data.posX));
cmd.Parameters.Add(m_database.CreateParameter("posY", data.posY));
cmd.Parameters.Add(m_database.CreateParameter("sizeX", data.sizeX));
cmd.Parameters.Add(m_database.CreateParameter("sizeY", data.sizeY));
conn.Open();
try
{
if (cmd.ExecuteNonQuery() < 1)
{
string insert = "insert into " + m_Realm + " (uuid, \"ScopeID\", \"locX\", \"locY\", \"sizeX\", \"sizeY\", \"regionName\", \"" +
String.Join("\", \"", fields) +
"\") values (:regionID, :scopeID, :posX, :posY, :sizeX, :sizeY, :regionName, :" + String.Join(", :", fields) + ")";
cmd.CommandText = insert;
try
{
if (cmd.ExecuteNonQuery() < 1)
{
return false;
}
}
catch (Exception ex)
{
m_log.Warn("[PGSQL Grid]: Error inserting into Regions table: " + ex.Message + ", INSERT sql: " + insert);
}
}
}
catch (Exception ex)
{
m_log.Warn("[PGSQL Grid]: Error updating Regions table: " + ex.Message + ", UPDATE sql: " + update);
}
}
return true;
}
public bool SetDataItem(UUID regionID, string item, string value)
{
string sql = "update " + m_Realm +
" set \"" + item + "\" = :" + item + " where uuid = :UUID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
}
return false;
}
public bool Delete(UUID regionID)
{
string sql = "delete from " + m_Realm +
" where uuid = :UUID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("UUID", regionID));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
}
return false;
}
public List<RegionData> GetDefaultRegions(UUID scopeID)
{
return Get((int)RegionFlags.DefaultRegion, scopeID);
}
public List<RegionData> GetDefaultHypergridRegions(UUID scopeID)
{
return Get((int)RegionFlags.DefaultHGRegion, scopeID);
}
public List<RegionData> GetFallbackRegions(UUID scopeID, int x, int y)
{
List<RegionData> regions = Get((int)RegionFlags.FallbackRegion, scopeID);
RegionDataDistanceCompare distanceComparer = new RegionDataDistanceCompare(x, y);
regions.Sort(distanceComparer);
return regions;
}
public List<RegionData> GetHyperlinks(UUID scopeID)
{
return Get((int)RegionFlags.Hyperlink, scopeID);
}
private List<RegionData> Get(int regionFlags, UUID scopeID)
{
string sql = "SELECT * FROM " + m_Realm + " WHERE (\"flags\" & " + regionFlags.ToString() + ") <> 0";
if (scopeID != UUID.Zero)
sql += " AND \"ScopeID\" = :scopeID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
return RunCommand(cmd);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,325 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using OpenMetaverse;
using OpenSim.Framework;
using System.Text;
using Npgsql;
using log4net;
using System.Reflection;
namespace OpenSim.Data.PGSQL
{
public class PGSQLUserAccountData : PGSQLGenericTableHandler<UserAccountData>,IUserAccountData
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
public PGSQLUserAccountData(string connectionString, string realm) :
base(connectionString, realm, "UserAccount")
{
}
/*
private string m_Realm;
private List<string> m_ColumnNames = null;
private PGSQLManager m_database;
public PGSQLUserAccountData(string connectionString, string realm) :
base(connectionString, realm, "UserAccount")
{
m_Realm = realm;
m_ConnectionString = connectionString;
m_database = new PGSQLManager(connectionString);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
conn.Open();
Migration m = new Migration(conn, GetType().Assembly, "UserAccount");
m.Update();
}
}
*/
/*
public List<UserAccountData> Query(UUID principalID, UUID scopeID, string query)
{
return null;
}
*/
/*
public override UserAccountData[] Get(string[] fields, string[] keys)
{
UserAccountData[] retUA = base.Get(fields,keys);
if (retUA.Length > 0)
{
Dictionary<string, string> data = retUA[0].Data;
Dictionary<string, string> data2 = new Dictionary<string, string>();
foreach (KeyValuePair<string,string> chave in data)
{
string s2 = chave.Key;
data2[s2] = chave.Value;
if (!m_FieldTypes.ContainsKey(chave.Key))
{
string tipo = "";
m_FieldTypes.TryGetValue(chave.Key, out tipo);
m_FieldTypes.Add(s2, tipo);
}
}
foreach (KeyValuePair<string, string> chave in data2)
{
if (!retUA[0].Data.ContainsKey(chave.Key))
retUA[0].Data.Add(chave.Key, chave.Value);
}
}
return retUA;
}
*/
/*
public UserAccountData Get(UUID principalID, UUID scopeID)
{
UserAccountData ret = new UserAccountData();
ret.Data = new Dictionary<string, string>();
string sql = string.Format(@"select * from {0} where ""PrincipalID"" = :principalID", m_Realm);
if (scopeID != UUID.Zero)
sql += @" and ""ScopeID"" = :scopeID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
cmd.Parameters.Add(m_database.CreateParameter("principalID", principalID));
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
conn.Open();
using (NpgsqlDataReader result = cmd.ExecuteReader())
{
if (result.Read())
{
ret.PrincipalID = principalID;
UUID scope;
UUID.TryParse(result["scopeid"].ToString(), out scope);
ret.ScopeID = scope;
if (m_ColumnNames == null)
{
m_ColumnNames = new List<string>();
DataTable schemaTable = result.GetSchemaTable();
foreach (DataRow row in schemaTable.Rows)
m_ColumnNames.Add(row["ColumnName"].ToString());
}
foreach (string s in m_ColumnNames)
{
string s2 = s;
if (s2 == "uuid")
continue;
if (s2 == "scopeid")
continue;
ret.Data[s] = result[s].ToString();
}
return ret;
}
}
}
return null;
}
public override bool Store(UserAccountData data)
{
if (data.Data.ContainsKey("PrincipalID"))
data.Data.Remove("PrincipalID");
if (data.Data.ContainsKey("ScopeID"))
data.Data.Remove("ScopeID");
string[] fields = new List<string>(data.Data.Keys).ToArray();
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
m_log.DebugFormat("[USER]: Try to update user {0} {1}", data.FirstName, data.LastName);
StringBuilder updateBuilder = new StringBuilder();
updateBuilder.AppendFormat("update {0} set ", m_Realm);
bool first = true;
foreach (string field in fields)
{
if (!first)
updateBuilder.Append(", ");
updateBuilder.AppendFormat("\"{0}\" = :{0}", field);
first = false;
if (m_FieldTypes.ContainsKey(field))
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field], m_FieldTypes[field]));
else
cmd.Parameters.Add(m_database.CreateParameter("" + field, data.Data[field]));
}
updateBuilder.Append(" where \"PrincipalID\" = :principalID");
if (data.ScopeID != UUID.Zero)
updateBuilder.Append(" and \"ScopeID\" = :scopeID");
cmd.CommandText = updateBuilder.ToString();
cmd.Connection = conn;
cmd.Parameters.Add(m_database.CreateParameter("principalID", data.PrincipalID));
cmd.Parameters.Add(m_database.CreateParameter("scopeID", data.ScopeID));
m_log.DebugFormat("[USER]: SQL update user {0} ", cmd.CommandText);
conn.Open();
m_log.DebugFormat("[USER]: CON opened update user {0} ", cmd.CommandText);
int conta = 0;
try
{
conta = cmd.ExecuteNonQuery();
}
catch (Exception e){
m_log.ErrorFormat("[USER]: ERROR opened update user {0} ", e.Message);
}
if (conta < 1)
{
m_log.DebugFormat("[USER]: Try to insert user {0} {1}", data.FirstName, data.LastName);
StringBuilder insertBuilder = new StringBuilder();
insertBuilder.AppendFormat(@"insert into {0} (""PrincipalID"", ""ScopeID"", ""FirstName"", ""LastName"", """, m_Realm);
insertBuilder.Append(String.Join(@""", """, fields));
insertBuilder.Append(@""") values (:principalID, :scopeID, :FirstName, :LastName, :");
insertBuilder.Append(String.Join(", :", fields));
insertBuilder.Append(");");
cmd.Parameters.Add(m_database.CreateParameter("FirstName", data.FirstName));
cmd.Parameters.Add(m_database.CreateParameter("LastName", data.LastName));
cmd.CommandText = insertBuilder.ToString();
if (cmd.ExecuteNonQuery() < 1)
{
return false;
}
}
else
m_log.DebugFormat("[USER]: User {0} {1} exists", data.FirstName, data.LastName);
}
return true;
}
public bool Store(UserAccountData data, UUID principalID, string token)
{
return false;
}
public bool SetDataItem(UUID principalID, string item, string value)
{
string sql = string.Format(@"update {0} set {1} = :{1} where ""UUID"" = :UUID", m_Realm, item);
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
if (m_FieldTypes.ContainsKey(item))
cmd.Parameters.Add(m_database.CreateParameter("" + item, value, m_FieldTypes[item]));
else
cmd.Parameters.Add(m_database.CreateParameter("" + item, value));
cmd.Parameters.Add(m_database.CreateParameter("UUID", principalID));
conn.Open();
if (cmd.ExecuteNonQuery() > 0)
return true;
}
return false;
}
*/
/*
public UserAccountData[] Get(string[] keys, string[] vals)
{
return null;
}
*/
public UserAccountData[] GetUsers(UUID scopeID, string query)
{
string[] words = query.Split(new char[] { ' ' });
for (int i = 0; i < words.Length; i++)
{
if (words[i].Length < 3)
{
if (i != words.Length - 1)
Array.Copy(words, i + 1, words, i, words.Length - i - 1);
Array.Resize(ref words, words.Length - 1);
}
}
if (words.Length == 0)
return new UserAccountData[0];
if (words.Length > 2)
return new UserAccountData[0];
string sql = "";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
if (words.Length == 1)
{
sql = String.Format(@"select * from {0} where (""ScopeID""=:ScopeID or ""ScopeID""='00000000-0000-0000-0000-000000000000') and (""FirstName"" ilike :search or ""LastName"" ilike :search)", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("scopeID", scopeID));
cmd.Parameters.Add(m_database.CreateParameter("search", "%" + words[0] + "%"));
}
else
{
sql = String.Format(@"select * from {0} where (""ScopeID""=:ScopeID or ""ScopeID""='00000000-0000-0000-0000-000000000000') and (""FirstName"" ilike :searchFirst or ""LastName"" ilike :searchLast)", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("searchFirst", "%" + words[0] + "%"));
cmd.Parameters.Add(m_database.CreateParameter("searchLast", "%" + words[1] + "%"));
cmd.Parameters.Add(m_database.CreateParameter("ScopeID", scopeID.ToString()));
}
cmd.Connection = conn;
cmd.CommandText = sql;
conn.Open();
return DoQuery(cmd);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,572 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.IO.Compression;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using log4net;
using OpenMetaverse;
using OpenSim.Framework;
using OpenSim.Data;
using Npgsql;
namespace OpenSim.Data.PGSQL
{
public class PGSQLXAssetData : IXAssetDataPlugin
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
protected virtual Assembly Assembly
{
get { return GetType().Assembly; }
}
/// <summary>
/// Number of days that must pass before we update the access time on an asset when it has been fetched.
/// </summary>
private const int DaysBetweenAccessTimeUpdates = 30;
private bool m_enableCompression = false;
private string m_connectionString;
private object m_dbLock = new object();
/// <summary>
/// We can reuse this for all hashing since all methods are single-threaded through m_dbBLock
/// </summary>
private HashAlgorithm hasher = new SHA256CryptoServiceProvider();
#region IPlugin Members
public string Version { get { return "1.0.0.0"; } }
/// <summary>
/// <para>Initialises Asset interface</para>
/// <para>
/// <list type="bullet">
/// <item>Loads and initialises the PGSQL storage plugin.</item>
/// <item>Warns and uses the obsolete pgsql_connection.ini if connect string is empty.</item>
/// <item>Check for migration</item>
/// </list>
/// </para>
/// </summary>
/// <param name="connect">connect string</param>
public void Initialise(string connect)
{
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_log.ErrorFormat("[PGSQL XASSETDATA]: THIS PLUGIN IS STRICTLY EXPERIMENTAL.");
m_log.ErrorFormat("[PGSQL XASSETDATA]: DO NOT USE FOR ANY DATA THAT YOU DO NOT MIND LOSING.");
m_log.ErrorFormat("[PGSQL XASSETDATA]: DATABASE TABLES CAN CHANGE AT ANY TIME, CAUSING EXISTING DATA TO BE LOST.");
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_log.ErrorFormat("[PGSQL XASSETDATA]: ***********************************************************");
m_connectionString = connect;
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
Migration m = new Migration(dbcon, Assembly, "XAssetStore");
m.Update();
}
}
public void Initialise()
{
throw new NotImplementedException();
}
public void Dispose() { }
/// <summary>
/// The name of this DB provider
/// </summary>
public string Name
{
get { return "PGSQL XAsset storage engine"; }
}
#endregion
#region IAssetDataPlugin Members
/// <summary>
/// Fetch Asset <paramref name="assetID"/> from database
/// </summary>
/// <param name="assetID">Asset UUID to fetch</param>
/// <returns>Return the asset</returns>
/// <remarks>On failure : throw an exception and attempt to reconnect to database</remarks>
public AssetBase GetAsset(UUID assetID)
{
// m_log.DebugFormat("[PGSQL XASSET DATA]: Looking for asset {0}", assetID);
AssetBase asset = null;
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(
@"SELECT ""Name"", ""Description"", ""AccessTime"", ""AssetType"", ""Local"", ""Temporary"", ""AssetFlags"", ""CreatorID"", ""Data""
FROM XAssetsMeta
JOIN XAssetsData ON XAssetsMeta.Hash = XAssetsData.Hash WHERE ""ID""=:ID",
dbcon))
{
cmd.Parameters.AddWithValue("ID", assetID.ToString());
try
{
using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
if (dbReader.Read())
{
asset = new AssetBase(assetID, (string)dbReader["Name"], (sbyte)dbReader["AssetType"], dbReader["CreatorID"].ToString());
asset.Data = (byte[])dbReader["Data"];
asset.Description = (string)dbReader["Description"];
string local = dbReader["Local"].ToString();
if (local.Equals("1") || local.Equals("true", StringComparison.InvariantCultureIgnoreCase))
asset.Local = true;
else
asset.Local = false;
asset.Temporary = Convert.ToBoolean(dbReader["Temporary"]);
asset.Flags = (AssetFlags)Convert.ToInt32(dbReader["AssetFlags"]);
if (m_enableCompression)
{
using (GZipStream decompressionStream = new GZipStream(new MemoryStream(asset.Data), CompressionMode.Decompress))
{
MemoryStream outputStream = new MemoryStream();
WebUtil.CopyStream(decompressionStream, outputStream, int.MaxValue);
// int compressedLength = asset.Data.Length;
asset.Data = outputStream.ToArray();
// m_log.DebugFormat(
// "[XASSET DB]: Decompressed {0} {1} to {2} bytes from {3}",
// asset.ID, asset.Name, asset.Data.Length, compressedLength);
}
}
UpdateAccessTime(asset.Metadata, (int)dbReader["AccessTime"]);
}
}
}
catch (Exception e)
{
m_log.Error(string.Format("[PGSQL XASSET DATA]: Failure fetching asset {0}", assetID), e);
}
}
}
}
return asset;
}
/// <summary>
/// Create an asset in database, or update it if existing.
/// </summary>
/// <param name="asset">Asset UUID to create</param>
/// <remarks>On failure : Throw an exception and attempt to reconnect to database</remarks>
public void StoreAsset(AssetBase asset)
{
// m_log.DebugFormat("[XASSETS DB]: Storing asset {0} {1}", asset.Name, asset.ID);
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
using (NpgsqlTransaction transaction = dbcon.BeginTransaction())
{
string assetName = asset.Name;
if (asset.Name.Length > 64)
{
assetName = asset.Name.Substring(0, 64);
m_log.WarnFormat(
"[XASSET DB]: Name '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Name, asset.ID, asset.Name.Length, assetName.Length);
}
string assetDescription = asset.Description;
if (asset.Description.Length > 64)
{
assetDescription = asset.Description.Substring(0, 64);
m_log.WarnFormat(
"[XASSET DB]: Description '{0}' for asset {1} truncated from {2} to {3} characters on add",
asset.Description, asset.ID, asset.Description.Length, assetDescription.Length);
}
if (m_enableCompression)
{
MemoryStream outputStream = new MemoryStream();
using (GZipStream compressionStream = new GZipStream(outputStream, CompressionMode.Compress, false))
{
// Console.WriteLine(WebUtil.CopyTo(new MemoryStream(asset.Data), compressionStream, int.MaxValue));
// We have to close the compression stream in order to make sure it writes everything out to the underlying memory output stream.
compressionStream.Close();
byte[] compressedData = outputStream.ToArray();
asset.Data = compressedData;
}
}
byte[] hash = hasher.ComputeHash(asset.Data);
// m_log.DebugFormat(
// "[XASSET DB]: Compressed data size for {0} {1}, hash {2} is {3}",
// asset.ID, asset.Name, hash, compressedData.Length);
try
{
using (NpgsqlCommand cmd =
new NpgsqlCommand(
@"insert INTO XAssetsMeta(""ID"", ""Hash"", ""Name"", ""Description"", ""AssetType"", ""Local"", ""Temporary"", ""CreateTime"", ""AccessTime"", ""AssetFlags"", ""CreatorID"")
Select :ID, :Hash, :Name, :Description, :AssetType, :Local, :Temporary, :CreateTime, :AccessTime, :AssetFlags, :CreatorID
where not exists( Select ""ID"" from XAssetsMeta where ""ID"" = :ID ;
update XAssetsMeta
set ""ID"" = :ID, ""Hash"" = :Hash, ""Name"" = :Name, ""Description"" = :Description,
""AssetType"" = :AssetType, ""Local"" = :Local, ""Temporary"" = :Temporary, ""CreateTime"" = :CreateTime,
""AccessTime"" = :AccessTime, ""AssetFlags"" = :AssetFlags, ""CreatorID"" = :CreatorID
where ""ID"" = :ID;
",
dbcon))
{
// create unix epoch time
int now = (int)Utils.DateTimeToUnixTime(DateTime.UtcNow);
cmd.Parameters.AddWithValue("ID", asset.ID);
cmd.Parameters.AddWithValue("Hash", hash);
cmd.Parameters.AddWithValue("Name", assetName);
cmd.Parameters.AddWithValue("Description", assetDescription);
cmd.Parameters.AddWithValue("AssetType", asset.Type);
cmd.Parameters.AddWithValue("Local", asset.Local);
cmd.Parameters.AddWithValue("Temporary", asset.Temporary);
cmd.Parameters.AddWithValue("CreateTime", now);
cmd.Parameters.AddWithValue("AccessTime", now);
cmd.Parameters.AddWithValue("CreatorID", asset.Metadata.CreatorID);
cmd.Parameters.AddWithValue("AssetFlags", (int)asset.Flags);
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
m_log.ErrorFormat("[ASSET DB]: PGSQL failure creating asset metadata {0} with name \"{1}\". Error: {2}",
asset.FullID, asset.Name, e.Message);
transaction.Rollback();
return;
}
if (!ExistsData(dbcon, transaction, hash))
{
try
{
using (NpgsqlCommand cmd =
new NpgsqlCommand(
@"INSERT INTO XAssetsData(""Hash"", ""Data"") VALUES(:Hash, :Data)",
dbcon))
{
cmd.Parameters.AddWithValue("Hash", hash);
cmd.Parameters.AddWithValue("Data", asset.Data);
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
m_log.ErrorFormat("[XASSET DB]: PGSQL failure creating asset data {0} with name \"{1}\". Error: {2}",
asset.FullID, asset.Name, e.Message);
transaction.Rollback();
return;
}
}
transaction.Commit();
}
}
}
}
/// <summary>
/// Updates the access time of the asset if it was accessed above a given threshhold amount of time.
/// </summary>
/// <remarks>
/// This gives us some insight into assets which haven't ben accessed for a long period. This is only done
/// over the threshold time to avoid excessive database writes as assets are fetched.
/// </remarks>
/// <param name='asset'></param>
/// <param name='accessTime'></param>
private void UpdateAccessTime(AssetMetadata assetMetadata, int accessTime)
{
DateTime now = DateTime.UtcNow;
if ((now - Utils.UnixTimeToDateTime(accessTime)).TotalDays < DaysBetweenAccessTimeUpdates)
return;
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
NpgsqlCommand cmd =
new NpgsqlCommand(@"update XAssetsMeta set ""AccessTime""=:AccessTime where ID=:ID", dbcon);
try
{
using (cmd)
{
// create unix epoch time
cmd.Parameters.AddWithValue("ID", assetMetadata.ID);
cmd.Parameters.AddWithValue("AccessTime", (int)Utils.DateTimeToUnixTime(now));
cmd.ExecuteNonQuery();
}
}
catch (Exception e)
{
m_log.ErrorFormat(
"[XASSET PGSQL DB]: Failure updating access_time for asset {0} with name {1} : {2}",
assetMetadata.ID, assetMetadata.Name, e.Message);
}
}
}
}
/// <summary>
/// We assume we already have the m_dbLock.
/// </summary>
/// TODO: need to actually use the transaction.
/// <param name="dbcon"></param>
/// <param name="transaction"></param>
/// <param name="hash"></param>
/// <returns></returns>
private bool ExistsData(NpgsqlConnection dbcon, NpgsqlTransaction transaction, byte[] hash)
{
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
bool exists = false;
using (NpgsqlCommand cmd = new NpgsqlCommand(@"SELECT ""Hash"" FROM XAssetsData WHERE ""Hash""=:Hash", dbcon))
{
cmd.Parameters.AddWithValue("Hash", hash);
try
{
using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
if (dbReader.Read())
{
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
exists = true;
}
}
}
catch (Exception e)
{
m_log.ErrorFormat(
"[XASSETS DB]: PGSql failure in ExistsData fetching hash {0}. Exception {1}{2}",
hash, e.Message, e.StackTrace);
}
}
return exists;
}
/// <summary>
/// Check if the assets exist in the database.
/// </summary>
/// <param name="uuids">The assets' IDs</param>
/// <returns>For each asset: true if it exists, false otherwise</returns>
public bool[] AssetsExist(UUID[] uuids)
{
if (uuids.Length == 0)
return new bool[0];
HashSet<UUID> exist = new HashSet<UUID>();
string ids = "'" + string.Join("','", uuids) + "'";
string sql = string.Format(@"SELECT ""ID"" FROM XAssetsMeta WHERE ""ID"" IN ({0})", ids);
using (NpgsqlConnection conn = new NpgsqlConnection(m_connectionString))
{
conn.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
UUID id = DBGuid.FromDB(reader["id"]);
exist.Add(id);
}
}
}
}
bool[] results = new bool[uuids.Length];
for (int i = 0; i < uuids.Length; i++)
results[i] = exist.Contains(uuids[i]);
return results;
}
/// <summary>
/// Check if the asset exists in the database
/// </summary>
/// <param name="uuid">The asset UUID</param>
/// <returns>true if it exists, false otherwise.</returns>
public bool ExistsAsset(UUID uuid)
{
// m_log.DebugFormat("[ASSETS DB]: Checking for asset {0}", uuid);
bool assetExists = false;
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(@"SELECT ""ID"" FROM XAssetsMeta WHERE ""ID""=:ID", dbcon))
{
cmd.Parameters.AddWithValue("ID", uuid.ToString());
try
{
using (NpgsqlDataReader dbReader = cmd.ExecuteReader(CommandBehavior.SingleRow))
{
if (dbReader.Read())
{
// m_log.DebugFormat("[ASSETS DB]: Found asset {0}", uuid);
assetExists = true;
}
}
}
catch (Exception e)
{
m_log.Error(string.Format("[XASSETS DB]: PGSql failure fetching asset {0}", uuid), e);
}
}
}
}
return assetExists;
}
/// <summary>
/// Returns a list of AssetMetadata objects. The list is a subset of
/// the entire data set offset by <paramref name="start" /> containing
/// <paramref name="count" /> elements.
/// </summary>
/// <param name="start">The number of results to discard from the total data set.</param>
/// <param name="count">The number of rows the returned list should contain.</param>
/// <returns>A list of AssetMetadata objects.</returns>
public List<AssetMetadata> FetchAssetMetadataSet(int start, int count)
{
List<AssetMetadata> retList = new List<AssetMetadata>(count);
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
NpgsqlCommand cmd = new NpgsqlCommand( @"SELECT ""Name"", ""Description"", ""AccessTime"", ""AssetType"", ""Temporary"", ""ID"", ""AssetFlags"", ""CreatorID""
FROM XAssetsMeta
LIMIT :start, :count", dbcon);
cmd.Parameters.AddWithValue("start", start);
cmd.Parameters.AddWithValue("count", count);
try
{
using (NpgsqlDataReader dbReader = cmd.ExecuteReader())
{
while (dbReader.Read())
{
AssetMetadata metadata = new AssetMetadata();
metadata.Name = (string)dbReader["Name"];
metadata.Description = (string)dbReader["Description"];
metadata.Type = (sbyte)dbReader["AssetType"];
metadata.Temporary = Convert.ToBoolean(dbReader["Temporary"]); // Not sure if this is correct.
metadata.Flags = (AssetFlags)Convert.ToInt32(dbReader["AssetFlags"]);
metadata.FullID = DBGuid.FromDB(dbReader["ID"]);
metadata.CreatorID = dbReader["CreatorID"].ToString();
// We'll ignore this for now - it appears unused!
// metadata.SHA1 = dbReader["hash"]);
UpdateAccessTime(metadata, (int)dbReader["AccessTime"]);
retList.Add(metadata);
}
}
}
catch (Exception e)
{
m_log.Error("[XASSETS DB]: PGSql failure fetching asset set" + Environment.NewLine + e.ToString());
}
}
}
return retList;
}
public bool Delete(string id)
{
// m_log.DebugFormat("[XASSETS DB]: Deleting asset {0}", id);
lock (m_dbLock)
{
using (NpgsqlConnection dbcon = new NpgsqlConnection(m_connectionString))
{
dbcon.Open();
using (NpgsqlCommand cmd = new NpgsqlCommand(@"delete from XAssetsMeta where ""ID""=:ID", dbcon))
{
cmd.Parameters.AddWithValue("ID", id);
cmd.ExecuteNonQuery();
}
// TODO: How do we deal with data from deleted assets? Probably not easily reapable unless we
// keep a reference count (?)
}
}
return true;
}
#endregion
}
}

View File

@@ -0,0 +1,330 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ''AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using OpenMetaverse;
using OpenSim.Framework;
using System.Reflection;
using System.Text;
using log4net;
using Npgsql;
using NpgsqlTypes;
namespace OpenSim.Data.PGSQL
{
public class PGSQLXInventoryData : IXInventoryData
{
// private static readonly ILog m_log = LogManager.GetLogger(
// MethodBase.GetCurrentMethod().DeclaringType);
private PGSQLFolderHandler m_Folders;
private PGSQLItemHandler m_Items;
public PGSQLXInventoryData(string conn, string realm)
{
m_Folders = new PGSQLFolderHandler(
conn, "inventoryfolders", "InventoryStore");
m_Items = new PGSQLItemHandler(
conn, "inventoryitems", String.Empty);
}
public static UUID str2UUID(string strUUID)
{
UUID newUUID = UUID.Zero;
UUID.TryParse(strUUID, out newUUID);
return newUUID;
}
public XInventoryFolder[] GetFolders(string[] fields, string[] vals)
{
return m_Folders.Get(fields, vals);
}
public XInventoryItem[] GetItems(string[] fields, string[] vals)
{
return m_Items.Get(fields, vals);
}
public bool StoreFolder(XInventoryFolder folder)
{
if (folder.folderName.Length > 64)
folder.folderName = folder.folderName.Substring(0, 64);
return m_Folders.Store(folder);
}
public bool StoreItem(XInventoryItem item)
{
if (item.inventoryName.Length > 64)
item.inventoryName = item.inventoryName.Substring(0, 64);
if (item.inventoryDescription.Length > 128)
item.inventoryDescription = item.inventoryDescription.Substring(0, 128);
return m_Items.Store(item);
}
public bool DeleteFolders(string field, string val)
{
return m_Folders.Delete(field, val);
}
public bool DeleteFolders(string[] fields, string[] vals)
{
return m_Folders.Delete(fields, vals);
}
public bool DeleteItems(string field, string val)
{
return m_Items.Delete(field, val);
}
public bool DeleteItems(string[] fields, string[] vals)
{
return m_Items.Delete(fields, vals);
}
public bool MoveItem(string id, string newParent)
{
return m_Items.MoveItem(id, newParent);
}
public bool MoveFolder(string id, string newParent)
{
return m_Folders.MoveFolder(id, newParent);
}
public XInventoryItem[] GetActiveGestures(UUID principalID)
{
return m_Items.GetActiveGestures(principalID.ToString());
}
public int GetAssetPermissions(UUID principalID, UUID assetID)
{
return m_Items.GetAssetPermissions(principalID, assetID);
}
}
public class PGSQLItemHandler : PGSQLInventoryHandler<XInventoryItem>
{
public PGSQLItemHandler(string c, string t, string m) :
base(c, t, m)
{
}
public bool MoveItem(string id, string newParent)
{
XInventoryItem[] retrievedItems = Get(new string[] { "inventoryID" }, new string[] { id });
if (retrievedItems.Length == 0)
return false;
UUID oldParent = retrievedItems[0].parentFolderID;
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"update {0} set ""parentFolderID"" = :ParentFolderID where ""inventoryID"" = :InventoryID", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newParent));
cmd.Parameters.Add(m_database.CreateParameter("InventoryID", id ));
cmd.Connection = conn;
conn.Open();
if (cmd.ExecuteNonQuery() == 0)
return false;
}
}
IncrementFolderVersion(oldParent);
IncrementFolderVersion(newParent);
return true;
}
public XInventoryItem[] GetActiveGestures(string principalID)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"select * from inventoryitems where ""avatarID"" = :uuid and ""assetType"" = :type and ""flags"" = 1", m_Realm);
UUID princID = UUID.Zero;
UUID.TryParse(principalID, out princID);
cmd.Parameters.Add(m_database.CreateParameter("uuid", principalID));
cmd.Parameters.Add(m_database.CreateParameter("type", (int)AssetType.Gesture));
cmd.Connection = conn;
conn.Open();
return DoQuery(cmd);
}
}
}
public int GetAssetPermissions(UUID principalID, UUID assetID)
{
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
cmd.CommandText = String.Format(@"select bit_or(""inventoryCurrentPermissions"") as ""inventoryCurrentPermissions""
from inventoryitems
where ""avatarID"" = :PrincipalID
and ""assetID"" = :AssetID
group by ""assetID"" ", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("PrincipalID", principalID));
cmd.Parameters.Add(m_database.CreateParameter("AssetID", assetID));
cmd.Connection = conn;
conn.Open();
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
int perms = 0;
if (reader.Read())
{
perms = Convert.ToInt32(reader["inventoryCurrentPermissions"]);
}
return perms;
}
}
}
}
public override bool Store(XInventoryItem item)
{
if (!base.Store(item))
return false;
IncrementFolderVersion(item.parentFolderID);
return true;
}
}
public class PGSQLFolderHandler : PGSQLInventoryHandler<XInventoryFolder>
{
public PGSQLFolderHandler(string c, string t, string m) :
base(c, t, m)
{
}
public bool MoveFolder(string id, string newParentFolderID)
{
XInventoryFolder[] folders = Get(new string[] { "folderID" }, new string[] { id });
if (folders.Length == 0)
return false;
UUID oldParentFolderUUID = folders[0].parentFolderID;
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand())
{
UUID foldID = UUID.Zero;
UUID.TryParse(id, out foldID);
UUID newPar = UUID.Zero;
UUID.TryParse(newParentFolderID, out newPar);
cmd.CommandText = String.Format(@"update {0} set ""parentFolderID"" = :ParentFolderID where ""folderID"" = :folderID", m_Realm);
cmd.Parameters.Add(m_database.CreateParameter("ParentFolderID", newPar));
cmd.Parameters.Add(m_database.CreateParameter("folderID", foldID));
cmd.Connection = conn;
conn.Open();
if (cmd.ExecuteNonQuery() == 0)
return false;
}
}
IncrementFolderVersion(oldParentFolderUUID);
IncrementFolderVersion(newParentFolderID);
return true;
}
public override bool Store(XInventoryFolder folder)
{
if (!base.Store(folder))
return false;
IncrementFolderVersion(folder.parentFolderID);
return true;
}
}
public class PGSQLInventoryHandler<T> : PGSQLGenericTableHandler<T> where T: class, new()
{
public PGSQLInventoryHandler(string c, string t, string m) : base(c, t, m) {}
protected bool IncrementFolderVersion(UUID folderID)
{
return IncrementFolderVersion(folderID.ToString());
}
protected bool IncrementFolderVersion(string folderID)
{
// m_log.DebugFormat("[PGSQL ITEM HANDLER]: Incrementing version on folder {0}", folderID);
// Util.PrintCallStack();
string sql = @"update inventoryfolders set version=version+1 where ""folderID"" = :folderID";
using (NpgsqlConnection conn = new NpgsqlConnection(m_ConnectionString))
{
using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
{
UUID foldID = UUID.Zero;
UUID.TryParse(folderID, out foldID);
conn.Open();
cmd.Parameters.Add( m_database.CreateParameter("folderID", foldID) );
try
{
cmd.ExecuteNonQuery();
}
catch (Exception)
{
return false;
}
}
}
return true;
}
}
}

View File

@@ -0,0 +1,65 @@
/*
* Copyright (c) Contributors, http://opensimulator.org/
* See CONTRIBUTORS.TXT for a full list of copyright holders.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the OpenSimulator Project nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
using System.Reflection;
using System.Runtime.InteropServices;
// General information about an assembly is controlled through the following
// set of attributes. Change these attribute values to modify the information
// associated with an assembly.
[assembly : AssemblyTitle("OpenSim.Data.PGSQL")]
[assembly : AssemblyDescription("")]
[assembly : AssemblyConfiguration("")]
[assembly : AssemblyCompany("http://opensimulator.org")]
[assembly : AssemblyProduct("OpenSim.Data.PGSQL")]
[assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")]
[assembly : AssemblyTrademark("")]
[assembly : AssemblyCulture("")]
// Setting ComVisible to false makes the types in this assembly not visible
// to COM components. If you need to access a type in this assembly from
// COM, set the ComVisible attribute to true on that type.
[assembly : ComVisible(false)]
// The following GUID is for the ID of the typelib if this project is exposed to COM
[assembly : Guid("0e1c1ca4-2cf2-4315-b0e7-432c02feea8a")]
// Version information for an assembly consists of the following four values:
//
// Major Version
// Minor Version
// Build Number
// Revision
//
// You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below:
[assembly : AssemblyVersion("0.8.1.*")]

View File

@@ -0,0 +1,94 @@
:VERSION 1
CREATE TABLE assets (
"id" varchar(36) NOT NULL PRIMARY KEY,
"name" varchar(64) NOT NULL,
"description" varchar(64) NOT NULL,
"assetType" smallint NOT NULL,
"local" smallint NOT NULL,
"temporary" smallint NOT NULL,
"data" bytea NOT NULL
) ;
:VERSION 2
BEGIN TRANSACTION;
CREATE TABLE Tmp_assets
(
"id" varchar(36) NOT NULL,
"name" varchar(64) NOT NULL,
"description" varchar(64) NOT NULL,
"assetType" smallint NOT NULL,
"local" boolean NOT NULL,
"temporary" boolean NOT NULL,
"data" bytea NOT NULL
) ;
INSERT INTO Tmp_assets ("id", "name", "description", "assetType", "local", "temporary", "data")
SELECT "id", "name", "description", "assetType", case when "local" = 1 then true else false end, case when "temporary" = 1 then true else false end, "data"
FROM assets ;
DROP TABLE assets;
Alter table Tmp_assets
rename to assets;
ALTER TABLE assets ADD PRIMARY KEY ("id");
COMMIT;
:VERSION 3
BEGIN TRANSACTION;
ALTER TABLE assets add "create_time" integer default 0;
ALTER TABLE assets add "access_time" integer default 0;
COMMIT;
:VERSION 4
BEGIN TRANSACTION;
CREATE TABLE Tmp_assets
(
"id" uuid NOT NULL,
"name" varchar(64) NOT NULL,
"description" varchar(64) NOT NULL,
"assetType" smallint NOT NULL,
"local" boolean NOT NULL,
"temporary" boolean NOT NULL,
"data" bytea NOT NULL,
"create_time" int NULL,
"access_time" int NULL
) ;
INSERT INTO Tmp_assets ("id", "name", "description", "assetType", "local", "temporary", "data", "create_time", "access_time")
SELECT cast("id" as uuid), "name", "description", "assetType", "local", "temporary", "data", "create_time", "access_time"
FROM assets ;
DROP TABLE assets;
Alter table Tmp_assets
rename to assets;
ALTER TABLE assets ADD PRIMARY KEY ("id");
COMMIT;
:VERSION 5
DELETE FROM assets WHERE "id" = 'dc4b9f0b-d008-45c6-96a4-01dd947ac621';
:VERSION 6
ALTER TABLE assets ADD "asset_flags" INTEGER NOT NULL DEFAULT 0;
:VERSION 7
alter table assets add "creatorid" varchar(36) not null default '';

View File

@@ -0,0 +1,32 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE auth (
uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
"passwordHash" varchar(32) NOT NULL,
"passwordSalt" varchar(32) NOT NULL,
"webLoginKey" varchar(255) NOT NULL,
"accountType" VARCHAR(32) NOT NULL DEFAULT 'UserAccount'
) ;
CREATE TABLE tokens (
uuid uuid NOT NULL default '00000000-0000-0000-0000-000000000000',
token varchar(255) NOT NULL,
validity TIMESTAMP NOT NULL )
;
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
INSERT INTO auth (uuid, "passwordHash", "passwordSalt", "webLoginKey", "accountType")
SELECT uuid AS UUID, passwordHash AS passwordHash, passwordSalt AS passwordSalt, webLoginKey AS webLoginKey, 'UserAccount' as accountType
FROM users
where exists ( Select * from information_schema.tables where table_name = 'users' )
;
COMMIT;

View File

@@ -0,0 +1,59 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE Avatars (
"PrincipalID" uuid NOT NULL PRIMARY KEY,
"Name" varchar(32) NOT NULL,
"Value" varchar(255) NOT NULL DEFAULT ''
);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
CREATE TABLE Tmp_Avatars
(
"PrincipalID" uuid NOT NULL,
"Name" varchar(32) NOT NULL,
"Value" text NOT NULL DEFAULT ''
) ;
INSERT INTO Tmp_Avatars ("PrincipalID", "Name", "Value")
SELECT "PrincipalID", cast("Name" as text), "Value"
FROM Avatars ;
DROP TABLE Avatars;
Alter table Tmp_Avatars
rename to Avatars;
COMMIT;
:VERSION 3
BEGIN TRANSACTION;
CREATE TABLE Tmp_Avatars
(
"PrincipalID" uuid NOT NULL,
"Name" varchar(32) NOT NULL,
"Value" text NOT NULL DEFAULT ''
);
ALTER TABLE Tmp_Avatars ADD PRIMARY KEY ("PrincipalID", "Name");
INSERT INTO Tmp_Avatars ("PrincipalID", "Name", "Value")
SELECT "PrincipalID", "Name", cast("Value" as text) FROM Avatars ;
DROP TABLE Avatars;
Alter table Tmp_Avatars
rename to Avatars;
COMMIT;

View File

@@ -0,0 +1,307 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE estate_managers(
"EstateID" int NOT NULL Primary Key,
uuid varchar(36) NOT NULL
);
CREATE TABLE estate_groups(
"EstateID" int NOT NULL,
uuid varchar(36) NOT NULL
);
CREATE TABLE estate_users(
"EstateID" int NOT NULL,
uuid varchar(36) NOT NULL
);
CREATE TABLE estateban(
"EstateID" int NOT NULL,
"bannedUUID" varchar(36) NOT NULL,
"bannedIp" varchar(16) NOT NULL,
"bannedIpHostMask" varchar(16) NOT NULL,
"bannedNameMask" varchar(64) NULL DEFAULT NULL
);
Create Sequence estate_settings_id increment by 100 start with 100;
CREATE TABLE estate_settings(
"EstateID" integer DEFAULT nextval('estate_settings_id') NOT NULL,
"EstateName" varchar(64) NULL DEFAULT (NULL),
"AbuseEmailToEstateOwner" boolean NOT NULL,
"DenyAnonymous" boolean NOT NULL,
"ResetHomeOnTeleport" boolean NOT NULL,
"FixedSun" boolean NOT NULL,
"DenyTransacted" boolean NOT NULL,
"BlockDwell" boolean NOT NULL,
"DenyIdentified" boolean NOT NULL,
"AllowVoice" boolean NOT NULL,
"UseGlobalTime" boolean NOT NULL,
"PricePerMeter" int NOT NULL,
"TaxFree" boolean NOT NULL,
"AllowDirectTeleport" boolean NOT NULL,
"RedirectGridX" int NOT NULL,
"RedirectGridY" int NOT NULL,
"ParentEstateID" int NOT NULL,
"SunPosition" double precision NOT NULL,
"EstateSkipScripts" boolean NOT NULL,
"BillableFactor" double precision NOT NULL,
"PublicAccess" boolean NOT NULL,
"AbuseEmail" varchar(255) NOT NULL,
"EstateOwner" varchar(36) NOT NULL,
"DenyMinors" boolean NOT NULL
);
CREATE TABLE estate_map(
"RegionID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
"EstateID" int NOT NULL
);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
CREATE INDEX IX_estate_managers ON estate_managers
(
"EstateID"
);
CREATE INDEX IX_estate_groups ON estate_groups
(
"EstateID"
);
CREATE INDEX IX_estate_users ON estate_users
(
"EstateID"
);
COMMIT;
:VERSION 3
BEGIN TRANSACTION;
CREATE TABLE Tmp_estateban
(
"EstateID" int NOT NULL,
"bannedUUID" varchar(36) NOT NULL,
"bannedIp" varchar(16) NULL,
"bannedIpHostMask" varchar(16) NULL,
"bannedNameMask" varchar(64) NULL
);
INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
SELECT "EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban;
DROP TABLE estateban;
Alter table Tmp_estateban
rename to estateban;
CREATE INDEX IX_estateban ON estateban
(
"EstateID"
);
COMMIT;
:VERSION 4
BEGIN TRANSACTION;
CREATE TABLE Tmp_estate_managers
(
"EstateID" int NOT NULL,
uuid uuid NOT NULL
);
INSERT INTO Tmp_estate_managers ("EstateID", uuid)
SELECT "EstateID", cast(uuid as uuid) FROM estate_managers;
DROP TABLE estate_managers;
Alter table Tmp_estate_managers
rename to estate_managers;
CREATE INDEX IX_estate_managers ON estate_managers
(
"EstateID"
);
COMMIT;
:VERSION 5
BEGIN TRANSACTION;
CREATE TABLE Tmp_estate_groups
(
"EstateID" int NOT NULL,
uuid uuid NOT NULL
) ;
INSERT INTO Tmp_estate_groups ("EstateID", uuid)
SELECT "EstateID", cast(uuid as uuid) FROM estate_groups;
DROP TABLE estate_groups;
Alter table Tmp_estate_groups
rename to estate_groups;
CREATE INDEX IX_estate_groups ON estate_groups
(
"EstateID"
);
COMMIT;
:VERSION 6
BEGIN TRANSACTION;
CREATE TABLE Tmp_estate_users
(
"EstateID" int NOT NULL,
uuid uuid NOT NULL
);
INSERT INTO Tmp_estate_users ("EstateID", uuid)
SELECT "EstateID", cast(uuid as uuid) FROM estate_users ;
DROP TABLE estate_users;
Alter table Tmp_estate_users
rename to estate_users;
CREATE INDEX IX_estate_users ON estate_users
(
"EstateID"
);
COMMIT;
:VERSION 7
BEGIN TRANSACTION;
CREATE TABLE Tmp_estateban
(
"EstateID" int NOT NULL,
"bannedUUID" uuid NOT NULL,
"bannedIp" varchar(16) NULL,
"bannedIpHostMask" varchar(16) NULL,
"bannedNameMask" varchar(64) NULL
);
INSERT INTO Tmp_estateban ("EstateID", "bannedUUID", "bannedIp", "bannedIpHostMask", "bannedNameMask")
SELECT "EstateID", cast("bannedUUID" as uuid), "bannedIp", "bannedIpHostMask", "bannedNameMask" FROM estateban ;
DROP TABLE estateban;
Alter table Tmp_estateban
rename to estateban;
CREATE INDEX IX_estateban ON estateban
(
"EstateID"
);
COMMIT;
:VERSION 8
BEGIN TRANSACTION;
CREATE TABLE Tmp_estate_settings
(
"EstateID" integer default nextval('estate_settings_id') NOT NULL,
"EstateName" varchar(64) NULL DEFAULT (NULL),
"AbuseEmailToEstateOwner" boolean NOT NULL,
"DenyAnonymous" boolean NOT NULL,
"ResetHomeOnTeleport" boolean NOT NULL,
"FixedSun" boolean NOT NULL,
"DenyTransacted" boolean NOT NULL,
"BlockDwell" boolean NOT NULL,
"DenyIdentified" boolean NOT NULL,
"AllowVoice" boolean NOT NULL,
"UseGlobalTime" boolean NOT NULL,
"PricePerMeter" int NOT NULL,
"TaxFree" boolean NOT NULL,
"AllowDirectTeleport" boolean NOT NULL,
"RedirectGridX" int NOT NULL,
"RedirectGridY" int NOT NULL,
"ParentEstateID" int NOT NULL,
"SunPosition" double precision NOT NULL,
"EstateSkipScripts" boolean NOT NULL,
"BillableFactor" double precision NOT NULL,
"PublicAccess" boolean NOT NULL,
"AbuseEmail" varchar(255) NOT NULL,
"EstateOwner" uuid NOT NULL,
"DenyMinors" boolean NOT NULL
);
INSERT INTO Tmp_estate_settings ("EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", "EstateOwner", "DenyMinors")
SELECT "EstateID", "EstateName", "AbuseEmailToEstateOwner", "DenyAnonymous", "ResetHomeOnTeleport", "FixedSun", "DenyTransacted", "BlockDwell", "DenyIdentified", "AllowVoice", "UseGlobalTime", "PricePerMeter", "TaxFree", "AllowDirectTeleport", "RedirectGridX", "RedirectGridY", "ParentEstateID", "SunPosition", "EstateSkipScripts", "BillableFactor", "PublicAccess", "AbuseEmail", cast("EstateOwner" as uuid), "DenyMinors" FROM estate_settings ;
DROP TABLE estate_settings;
Alter table Tmp_estate_settings
rename to estate_settings;
Create index on estate_settings (lower("EstateName"));
COMMIT;
:VERSION 9
BEGIN TRANSACTION;
CREATE TABLE Tmp_estate_map
(
"RegionID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
"EstateID" int NOT NULL
);
INSERT INTO Tmp_estate_map ("RegionID", "EstateID")
SELECT cast("RegionID" as uuid), "EstateID" FROM estate_map ;
DROP TABLE estate_map;
Alter table Tmp_estate_map
rename to estate_map;
COMMIT;
:VERSION 10
BEGIN TRANSACTION;
ALTER TABLE estate_settings ADD COLUMN "AllowLandmark" boolean NOT NULL default true;
ALTER TABLE estate_settings ADD COLUMN "AllowParcelChanges" boolean NOT NULL default true;
ALTER TABLE estate_settings ADD COLUMN "AllowSetHome" boolean NOT NULL default true;
COMMIT;
:VERSION 11
Begin transaction;
Commit;

View File

@@ -0,0 +1,44 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE Friends (
"PrincipalID" uuid NOT NULL,
"Friend" varchar(255) NOT NULL,
"Flags" char(16) NOT NULL DEFAULT '0',
"Offered" varchar(32) NOT NULL DEFAULT 0);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
INSERT INTO Friends ("PrincipalID", "Friend", "Flags", "Offered")
SELECT "ownerID", "friendID", "friendPerms", 0 FROM userfriends;
COMMIT;
:VERSION 3
BEGIN TRANSACTION;
CREATE TABLE Tmp_Friends
("PrincipalID" varchar(255) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"Friend" varchar(255) NOT NULL,
"Flags" char(16) NOT NULL DEFAULT '0',
"Offered" varchar(32) NOT NULL DEFAULT 0) ;
INSERT INTO Tmp_Friends ("PrincipalID", "Friend", "Flags", "Offered")
SELECT cast("PrincipalID" as varchar(255)), "Friend", "Flags", "Offered" FROM Friends ;
DROP TABLE Friends;
Alter table Tmp_Friends
rename to Friends;
ALTER TABLE Friends ADD PRIMARY KEY("PrincipalID", "Friend");
COMMIT;

View File

@@ -0,0 +1,242 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE regions(
"regionHandle" varchar(255) NULL,
"regionName" varchar(255) NULL,
uuid varchar(255) NOT NULL PRIMARY KEY,
"regionRecvKey" varchar(255) NULL,
"regionSecret" varchar(255) NULL,
"regionSendKey" varchar(255) NULL,
"regionDataURI" varchar(255) NULL,
"serverIP" varchar(255) NULL,
"serverPort" varchar(255) NULL,
"serverURI" varchar(255) NULL,
"locX" varchar(255) NULL,
"locY" varchar(255) NULL,
"locZ" varchar(255) NULL,
"eastOverrideHandle" varchar(255) NULL,
"westOverrideHandle" varchar(255) NULL,
"southOverrideHandle" varchar(255) NULL,
"northOverrideHandle" varchar(255) NULL,
"regionAssetURI" varchar(255) NULL,
"regionAssetRecvKey" varchar(255) NULL,
"regionAssetSendKey" varchar(255) NULL,
"regionUserURI" varchar(255) NULL,
"regionUserRecvKey" varchar(255) NULL,
"regionUserSendKey" varchar(255) NULL,
"regionMapTexture" varchar(255) NULL,
"serverHttpPort" varchar(255) NULL,
"serverRemotingPort" varchar(255) NULL,
"owner_uuid" varchar(36) NULL
);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
CREATE TABLE Tmp_regions
(
uuid varchar(36) NOT NULL,
"regionHandle" bigint NULL,
"regionName" varchar(20) NULL,
"regionRecvKey" varchar(128) NULL,
"regionSendKey" varchar(128) NULL,
"regionSecret" varchar(128) NULL,
"regionDataURI" varchar(128) NULL,
"serverIP" varchar(64) NULL,
"serverPort" int NULL,
"serverURI" varchar(255) NULL,
"locX" int NULL,
"locY" int NULL,
"locZ" int NULL,
"eastOverrideHandle" bigint NULL,
"westOverrideHandle" bigint NULL,
"southOverrideHandle" bigint NULL,
"northOverrideHandle" bigint NULL,
"regionAssetURI" varchar(255) NULL,
"regionAssetRecvKey" varchar(128) NULL,
"regionAssetSendKey" varchar(128) NULL,
"regionUserURI" varchar(255) NULL,
"regionUserRecvKey" varchar(128) NULL,
"regionUserSendKey" varchar(128) NULL,
"regionMapTexture" varchar(36) NULL,
"serverHttpPort" int NULL,
"serverRemotingPort" int NULL,
"owner_uuid" varchar(36) NULL,
"originUUID" varchar(36) NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
);
INSERT INTO Tmp_regions (uuid, "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", "regionMapTexture", "serverHttpPort", "serverRemotingPort", "owner_uuid")
SELECT cast(uuid as varchar(36)), cast("regionHandle" as bigint), cast("regionName" as varchar(20)), cast("regionRecvKey" as varchar(128)), cast("regionSendKey" as varchar(128)), cast("regionSecret" as varchar(128)), cast("regionDataURI" as varchar(128)), cast("serverIP" as varchar(64)), cast("serverPort" as int), "serverURI", cast("locX" as int), cast("locY" as int), cast("locZ" as int), cast("eastOverrideHandle" as bigint), cast("westOverrideHandle" as bigint),
cast("southOverrideHandle" as bigint), cast("northOverrideHandle" as bigint), "regionAssetURI", cast("regionAssetRecvKey" as varchar(128)), cast("regionAssetSendKey" as varchar(128)), "regionUserURI", cast("regionUserRecvKey" as varchar(128)), cast("regionUserSendKey" as varchar(128)), cast("regionMapTexture" as varchar(36)),
cast("serverHttpPort" as int), cast("serverRemotingPort" as int), "owner_uuid"
FROM regions;
DROP TABLE regions;
alter table Tmp_regions
rename to regions;
COMMIT;
:VERSION 3
BEGIN TRANSACTION;
CREATE INDEX IX_regions_name ON regions
(
"regionName"
);
CREATE INDEX IX_regions_handle ON regions
(
"regionHandle"
);
CREATE INDEX IX_regions_override ON regions
(
"eastOverrideHandle",
"westOverrideHandle",
"southOverrideHandle",
"northOverrideHandle"
);
COMMIT;
:VERSION 4
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
BEGIN TRANSACTION;
CREATE TABLE Tmp_regions
(
uuid uuid NOT NULL,
"regionHandle" bigint NULL,
"regionName" varchar(20) NULL,
"regionRecvKey" varchar(128) NULL,
"regionSendKey" varchar(128) NULL,
"regionSecret" varchar(128) NULL,
"regionDataURI" varchar(128) NULL,
"serverIP" varchar(64) NULL,
"serverPort" int NULL,
"serverURI" varchar(255) NULL,
"locX" int NULL,
"locY" int NULL,
"locZ" int NULL,
"eastOverrideHandle" bigint NULL,
"westOverrideHandle" bigint NULL,
"southOverrideHandle" bigint NULL,
"northOverrideHandle" bigint NULL,
"regionAssetURI" varchar(255) NULL,
"regionAssetRecvKey" varchar(128) NULL,
"regionAssetSendKey" varchar(128) NULL,
"regionUserURI" varchar(255) NULL,
"regionUserRecvKey" varchar(128) NULL,
"regionUserSendKey" varchar(128) NULL,
"regionMapTexture" uuid NULL,
"serverHttpPort" int NULL,
"serverRemotingPort" int NULL,
"owner_uuid" uuid NOT NULL,
"originUUID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000')
);
INSERT INTO Tmp_regions (uuid, "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", "regionMapTexture", "serverHttpPort", "serverRemotingPort", "owner_uuid", "originUUID")
SELECT cast(uuid as uuid), "regionHandle", "regionName", "regionRecvKey", "regionSendKey", "regionSecret", "regionDataURI", "serverIP", "serverPort", "serverURI", "locX", "locY", "locZ", "eastOverrideHandle", "westOverrideHandle", "southOverrideHandle", "northOverrideHandle", "regionAssetURI", "regionAssetRecvKey", "regionAssetSendKey", "regionUserURI", "regionUserRecvKey", "regionUserSendKey", cast("regionMapTexture" as uuid), "serverHttpPort", "serverRemotingPort", cast( "owner_uuid" as uuid), cast("originUUID" as uuid) FROM regions ;
DROP TABLE regions;
alter table Tmp_regions rename to regions;
ALTER TABLE regions ADD CONSTRAINT
PK__regions__uuid PRIMARY KEY
(
uuid
);
CREATE INDEX IX_regions_name ON regions
(
"regionName"
);
CREATE INDEX IX_regions_handle ON regions
(
"regionHandle"
);
CREATE INDEX IX_regions_override ON regions
(
"eastOverrideHandle",
"westOverrideHandle",
"southOverrideHandle",
"northOverrideHandle"
);
COMMIT;
:VERSION 5
BEGIN TRANSACTION;
ALTER TABLE regions ADD access int default 0;
COMMIT;
:VERSION 6
BEGIN TRANSACTION;
ALTER TABLE regions ADD "ScopeID" uuid default '00000000-0000-0000-0000-000000000000';
ALTER TABLE regions alter column "owner_uuid" set DEFAULT ('00000000-0000-0000-0000-000000000000');
ALTER TABLE regions ADD "sizeX" integer not null default 0;
ALTER TABLE regions ADD "sizeY" integer not null default 0;
COMMIT;
:VERSION 7
BEGIN TRANSACTION;
ALTER TABLE regions ADD "flags" integer NOT NULL DEFAULT 0;
CREATE INDEX flags ON regions("flags");
ALTER TABLE regions ADD "last_seen" integer NOT NULL DEFAULT 0;
ALTER TABLE regions ADD "PrincipalID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000';
ALTER TABLE regions ADD "Token" varchar(255) NOT NULL DEFAULT 0;
COMMIT;
:VERSION 8
BEGIN TRANSACTION;
ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128) ;
DROP INDEX IX_regions_name;
ALTER TABLE regions ALTER COLUMN "regionName" type VarChar(128),
ALTER COLUMN "regionName" SET NOT NULL;
CREATE INDEX IX_regions_name ON regions
(
"regionName"
);
COMMIT;
:VERSION 9
BEGIN TRANSACTION;
ALTER TABLE regions ADD "parcelMapTexture" uuid NULL;
COMMIT;

View File

@@ -0,0 +1,60 @@
:VERSION 1 # --------------------------
BEGIN TRANSACTION;
CREATE TABLE GridUser (
"UserID" VARCHAR(255) NOT NULL Primary Key,
"HomeRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"LastRegionID" CHAR(36) NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"Online" CHAR(5) NOT NULL DEFAULT 'false',
"Login" CHAR(16) NOT NULL DEFAULT '0',
"Logout" CHAR(16) NOT NULL DEFAULT '0'
) ;
COMMIT;
:VERSION 2 # --------------------------
BEGIN TRANSACTION;
CREATE TABLE GridUser_tmp (
"UserID" VARCHAR(255) NOT NULL PRIMARY KEY,
"HomeRegionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"HomePosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"HomeLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"LastRegionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"LastPosition" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"LastLookAt" CHAR(64) NOT NULL DEFAULT '<0,0,0>',
"Online" CHAR(5) NOT NULL DEFAULT 'false',
"Login" CHAR(16) NOT NULL DEFAULT '0',
"Logout" CHAR(16) NOT NULL DEFAULT '0'
);
COMMIT;
INSERT INTO GridUser_tmp ("UserID"
,"HomeRegionID"
,"HomePosition"
,"HomeLookAt"
,"LastRegionID"
,"LastPosition"
,"LastLookAt"
,"Online"
,"Login"
,"Logout")
SELECT "UserID", cast("HomeRegionID" as uuid), "HomePosition" ,"HomeLookAt" , cast("LastRegionID" as uuid),
"LastPosition"
,"LastLookAt"
,"Online"
,"Login"
,"Logout" FROM GridUser;
DROP TABLE GridUser;
alter table GridUser_tmp rename to GridUser;

View File

@@ -0,0 +1,17 @@
:VERSION 1 # --------------------------
BEGIN;
CREATE TABLE hg_traveling_data (
"SessionID" VARCHAR(36) NOT NULL Primary Key,
"UserID" VARCHAR(36) NOT NULL,
"GridExternalName" VARCHAR(255) NOT NULL DEFAULT '',
"ServiceToken" VARCHAR(255) NOT NULL DEFAULT '',
"ClientIPAddress" VARCHAR(16) NOT NULL DEFAULT '',
"MyIPAddress" VARCHAR(16) NOT NULL DEFAULT '',
"TMStamp" timestamp NOT NULL default now()
);
COMMIT;

View File

@@ -0,0 +1,26 @@
:VERSION 1 # --------------------------
BEGIN Transaction;
Create Sequence im_offiline_id increment by 1 start with 1;
CREATE TABLE im_offline (
"ID" integer PRIMARY KEY NOT NULL DEFAULT nextval('im_offiline_id') ,
"PrincipalID" char(36) NOT NULL default '',
"Message" text NOT NULL,
"TMStamp" timestamp NOT NULL default now()
);
COMMIT;
:VERSION 2 # --------------------------
BEGIN;
/*
INSERT INTO `im_offline` SELECT * from `diva_im_offline`;
DROP TABLE `diva_im_offline`;
DELETE FROM `migrations` WHERE name='diva_im_Store';
*/
COMMIT;

View File

@@ -0,0 +1,220 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE inventoryfolders (
"folderID" varchar(36) NOT NULL default '' PRIMARY KEY,
"agentID" varchar(36) default NULL,
"parentFolderID" varchar(36) default NULL,
"folderName" varchar(64) default NULL,
"type" smallint NOT NULL default 0,
"version" int NOT NULL default 0
);
CREATE INDEX owner ON inventoryfolders
(
"agentID" ASC
);
CREATE INDEX parent ON inventoryfolders
(
"parentFolderID" ASC
);
CREATE TABLE inventoryitems (
"inventoryID" varchar(36) NOT NULL default '' Primary Key,
"assetID" varchar(36) default NULL,
"assetType" int default NULL,
"parentFolderID" varchar(36) default NULL,
"avatarID" varchar(36) default NULL,
"inventoryName" varchar(64) default NULL,
"inventoryDescription" varchar(128) default NULL,
"inventoryNextPermissions" int default NULL,
"inventoryCurrentPermissions" int default NULL,
"invType" int default NULL,
"creatorID" varchar(36) default NULL,
"inventoryBasePermissions" int NOT NULL default 0,
"inventoryEveryOnePermissions" int NOT NULL default 0,
"salePrice" int default NULL,
"saleType" smallint default NULL,
"creationDate" int default NULL,
"groupID" varchar(36) default NULL,
"groupOwned" boolean default NULL,
"flags" int default NULL
);
CREATE INDEX ii_owner ON inventoryitems
(
"avatarID" ASC
);
CREATE INDEX ii_folder ON inventoryitems
(
"parentFolderID" ASC
);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
ALTER TABLE inventoryitems ADD "inventoryGroupPermissions" INTEGER NOT NULL default 0;
COMMIT;
:VERSION 3
/* To prevent any potential data loss issues, you should review this script in detail before running it outside the cotext of the database designer.*/
BEGIN TRANSACTION;
CREATE TABLE Tmp_inventoryfolders
(
"folderID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
"agentID" uuid NULL DEFAULT (NULL),
"parentFolderID" uuid NULL DEFAULT (NULL),
"folderName" varchar(64) NULL DEFAULT (NULL),
"type" smallint NOT NULL DEFAULT ((0)),
"version" int NOT NULL DEFAULT ((0))
);
INSERT INTO Tmp_inventoryfolders ("folderID", "agentID", "parentFolderID", "folderName", type, version)
SELECT cast("folderID" as uuid), cast("agentID" as uuid), cast("parentFolderID" as uuid), "folderName", "type", "version"
FROM inventoryfolders;
DROP TABLE inventoryfolders;
alter table Tmp_inventoryfolders rename to inventoryfolders;
ALTER TABLE inventoryfolders ADD CONSTRAINT
PK__inventor__C2FABFB3173876EA PRIMARY KEY
(
"folderID"
);
CREATE INDEX owner ON inventoryfolders
(
"agentID"
);
CREATE INDEX parent ON inventoryfolders
(
"parentFolderID"
);
COMMIT;
:VERSION 4
BEGIN TRANSACTION;
CREATE TABLE Tmp_inventoryitems
(
"inventoryID" uuid NOT NULL DEFAULT ('00000000-0000-0000-0000-000000000000'),
"assetID" uuid NULL DEFAULT (NULL),
"assetType" int NULL DEFAULT (NULL),
"parentFolderID" uuid NULL DEFAULT (NULL),
"avatarID" uuid NULL DEFAULT (NULL),
"inventoryName" varchar(64) NULL DEFAULT (NULL),
"inventoryDescription" varchar(128) NULL DEFAULT (NULL),
"inventoryNextPermissions" int NULL DEFAULT (NULL),
"inventoryCurrentPermissions" int NULL DEFAULT (NULL),
"invType" int NULL DEFAULT (NULL),
"creatorID" uuid NULL DEFAULT (NULL),
"inventoryBasePermissions" int NOT NULL DEFAULT ((0)),
"inventoryEveryOnePermissions" int NOT NULL DEFAULT ((0)),
"salePrice" int NULL DEFAULT (NULL),
"SaleType" smallint NULL DEFAULT (NULL),
"creationDate" int NULL DEFAULT (NULL),
"groupID" uuid NULL DEFAULT (NULL),
"groupOwned" boolean NULL DEFAULT (NULL),
"flags" int NULL DEFAULT (NULL),
"inventoryGroupPermissions" int NOT NULL DEFAULT ((0))
);
INSERT INTO Tmp_inventoryitems ("inventoryID", "assetID", "assetType", "parentFolderID", "avatarID", "inventoryName", "inventoryDescription", "inventoryNextPermissions", "inventoryCurrentPermissions", "invType", "creatorID", "inventoryBasePermissions", "inventoryEveryOnePermissions", "salePrice", "SaleType", "creationDate", "groupID", "groupOwned", "flags", "inventoryGroupPermissions")
SELECT cast("inventoryID" as uuid), cast("assetID" as uuid), "assetType", cast("parentFolderID" as uuid), cast("avatarID" as uuid), "inventoryName", "inventoryDescription", "inventoryNextPermissions", "inventoryCurrentPermissions", "invType", cast("creatorID" as uuid), "inventoryBasePermissions", "inventoryEveryOnePermissions", "salePrice", "SaleType", "creationDate", cast("groupID" as uuid), "groupOwned", "flags", "inventoryGroupPermissions"
FROM inventoryitems ;
DROP TABLE inventoryitems;
alter table Tmp_inventoryitems rename to inventoryitems;
ALTER TABLE inventoryitems ADD CONSTRAINT
PK__inventor__C4B7BC2220C1E124 PRIMARY KEY
(
"inventoryID"
);
CREATE INDEX ii2_owner ON inventoryitems
(
"avatarID"
);
CREATE INDEX ii2_folder ON inventoryitems
(
"parentFolderID"
);
COMMIT;
:VERSION 5
BEGIN TRANSACTION;
-- # Restoring defaults:
-- # NOTE: "inventoryID" does NOT need one: it's NOT NULL PK and a unique Guid must be provided every time anyway!
alter table inventoryitems
alter column "inventoryBasePermissions" set default 0;
alter table inventoryitems
alter column "inventoryEveryOnePermissions" set default 0;
alter table inventoryitems
alter column "inventoryGroupPermissions" set default 0 ;
COMMIT ;
:VERSION 7
BEGIN TRANSACTION;
-- # "creatorID" goes back to VARCHAR(36) (???)
alter table inventoryitems
alter column "creatorID" type varchar(36);
COMMIT ;
:VERSION 8
ALTER TABLE inventoryitems
alter column "creatorID" set DEFAULT '00000000-0000-0000-0000-000000000000';
:VERSION 9
BEGIN TRANSACTION;
--# "creatorID" goes up to VARCHAR(255)
alter table inventoryitems
alter column "creatorID" type varchar(255);
Commit;
:VERSION 10
BEGIN TRANSACTION;
Alter table inventoryitems Rename Column "SaleType" to "saleType";
Commit;

View File

@@ -0,0 +1,16 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE logs (
"logID" int NOT NULL Primary Key,
"target" varchar(36) default NULL,
"server" varchar(64) default NULL,
"method" varchar(64) default NULL,
"arguments" varchar(255) default NULL,
"priority" int default NULL,
"message" text
);
COMMIT;

View File

@@ -0,0 +1,30 @@
:VERSION 1
BEGIN TRANSACTION;
CREATE TABLE Presence (
"UserID" varchar(255) NOT NULL,
"RegionID" uuid NOT NULL,
"SessionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
"SecureSessionID" uuid NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000'
);
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
CREATE UNIQUE INDEX SessionID ON Presence("SessionID");
CREATE INDEX UserID ON Presence("UserID");
COMMIT;
:VERSION 2
BEGIN TRANSACTION;
ALTER TABLE Presence ADD "LastSeen" Timestamp;
COMMIT;

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More