Marauroa Database Structure: Difference between revisions
imported>Hendrik Brummermann |
imported>Hendrik Brummermann |
||
| Line 39: | Line 39: | ||
== The whole picture == |
== The whole picture == |
||
The following diagram shows the all tables used by Marauroa. Games are, however, free to add their own tables if the need arises (JMapacman and Marboard don't need additional tables but Stendhal makes heavy use of [Stendhal Database Structure|this possibility]. |
The following diagram shows the all tables used by Marauroa. Games are, however, free to add their own tables if the need arises (JMapacman and Marboard don't need additional tables but Stendhal makes heavy use of [[Stendhal Database Structure|this possibility]]. |
||
[[Image:Database-marauroa.png]] |
[[Image:Database-marauroa.png]] |
||
Revision as of 11:43, 26 February 2010
This article describes the table structure of the Marauroa database. You might want to have a look at High Level Database Access which explains the high level API to access the database from your program code. The article Low Level Database Access describes how Marauroa accesses the database internally and how you can add support for your own tables.
Accounts
Authentication information is stored in the table account. It consists of the username, the password hash, email address, and the timestamp of the account creation. Please note that for historic reasons foreign key columns pointing to the account table are not named account_id but player_id.
For security reason every login (successful or not) is logged in the table loginEvent with the ip-address, timestamp, and a success flag. The column service is used to tell logins from a game and a website apart. The optional column seed stores a preauthentication seed. Marauroa automatically prevents logins for some time after too many failed tries.
Password changes are logged in a similar way. In addition to normal loginEvents the old password hash is stored as well. This is a precaution to restore hacked accounts back to their original owner.
Note: It may be a good idea to delete old rows in this table regularly for privacy reasons.
Bans
Unfortunately there are some unfriendly people out there that you may need to keep away. The tables accountban and banlist store such bans.
The table accountban is on a per account basis. The person trying to login is displayed the reason. Account bans can expire automatically.
The table banlist stores bans based on ip-address and ip-address-ranges. The mask 255.255.255.255 donates a single ip-address.
RPObjects
Game Logging
There are two more tables used for logging:
gameEvents stores events that occur in the game world (killing monsters, trading, teleporting, etc.) with a time stamp and the player causing the event. The parameters param1 and param2 depend on the event.
Unless disabled Marauroa logs statistical information every minute in the table statistics. This includes the network traffic data and number of players online.
The whole picture
The following diagram shows the all tables used by Marauroa. Games are, however, free to add their own tables if the need arises (JMapacman and Marboard don't need additional tables but Stendhal makes heavy use of this possibility.
Other stuff
{{Move everything below these lines into the Database Access article}}
JDBC Database HOWTO
TODO: Update to reflect DAOs
TODO: Add H2
JDBC technology is an API that lets you access virtually any tabular data source from the Java programming language. It provides cross-DBMS connectivity to a wide range of relational databases. Unfortunatally it does not hide vendor specific stuff. Marauroa and Stendhal currently only work with MySQL because of that. Adding support for other database software would be very easy as the database specific code is concentrated in the classes JDBCDatabase (Marauroa) and StendhalPlayerDatabase (Stendhal). We have no need for that, so it was not done, yet. We will, however, accept patches for multi database system support, so if you need it, go ahead.
You need to download MySQL Connector/J in order to get it to run: http://www.mysql.com/downloads/api-jdbc-stable.html
To configure Marauroa to work with a JDBC source, run the appropriate GenerateINI program. For Stendhal this is games.stendhal.server.core.engine.GenerateINI.
Before using the application with the database, you need to create the database itself. So, with MySQL just run MySQL and enter:
create database stendhal; grant all on stendhal.* to stendhal_user@localhost identified by 'stendhal_passwd';
The rest of code is handled by the server itself, and it will create the tables if they don't exist.
Storing objects in the database
Objects are stored in the database to save their state. This is an expensive operation, so it is only done every 10 minutes or on special events (like logout).
This decision is made in RPManager. It calculates how often an object has to be stored.
Marauroa knows two types of objects which can be stored to the database: players and zones. Both objects can contain other objects: Players have items in their bags, zones can contain objects that are flagged as storable.




