From 95984e05876136cee464b3ecdc66d3cf36aac353 Mon Sep 17 00:00:00 2001
From: Teravus Ovares
Date: Wed, 7 Jan 2009 23:20:23 +0000
Subject: * Added session report. ** Full or two criteria. UserID, or
VersionString * Added link to session report from client report.
---
OpenSim/Region/UserStatistics/Clients_report.cs | 5 +-
OpenSim/Region/UserStatistics/HTMLUtil.cs | 44 ++--
OpenSim/Region/UserStatistics/Sessions_Report.cs | 260 +++++++++++++++++++++++
OpenSim/Region/UserStatistics/WebStatsModule.cs | 16 ++
4 files changed, 312 insertions(+), 13 deletions(-)
create mode 100644 OpenSim/Region/UserStatistics/Sessions_Report.cs
diff --git a/OpenSim/Region/UserStatistics/Clients_report.cs b/OpenSim/Region/UserStatistics/Clients_report.cs
index bc43e18..69514fb 100644
--- a/OpenSim/Region/UserStatistics/Clients_report.cs
+++ b/OpenSim/Region/UserStatistics/Clients_report.cs
@@ -71,6 +71,8 @@ namespace OpenSim.Region.UserStatistics
totalregions = Convert.ToInt32(sdr["regcnt"]);
}
+ sdr.Close();
+ sdr.Dispose();
sql =
"select client_version, count(*) as cnt, avg(avg_sim_fps) as simfps from stats_session_data group by client_version order by count(*) desc LIMIT 10;";
@@ -197,7 +199,8 @@ TD.align_top { vertical-align: top; }
{
HTMLUtil.TR_O(ref output, "");
HTMLUtil.TD_O(ref output, "content");
- output.Append(cvd.version);
+ string linkhref = "sessions.report?VersionString=" + cvd.version;
+ HTMLUtil.A(ref output, cvd.version, linkhref, "");
HTMLUtil.TD_C(ref output);
HTMLUtil.TD_O(ref output, "content");
output.Append(cvd.count);
diff --git a/OpenSim/Region/UserStatistics/HTMLUtil.cs b/OpenSim/Region/UserStatistics/HTMLUtil.cs
index 173f75e..bd0c74a 100644
--- a/OpenSim/Region/UserStatistics/HTMLUtil.cs
+++ b/OpenSim/Region/UserStatistics/HTMLUtil.cs
@@ -50,11 +50,27 @@ namespace OpenSim.Region.UserStatistics
public static void TD_O(ref StringBuilder o, string pclass)
{
+ TD_O(ref o, pclass, 0, 0);
+ }
+ public static void TD_O(ref StringBuilder o, string pclass, int rowspan, int colspan)
+ {
o.Append("
0)
{
GenericClass(ref o, pclass);
}
+ if (rowspan > 1)
+ {
+ o.Append(" rowspan=\"");
+ o.Append(rowspan);
+ o.Append("\"");
+ }
+ if (colspan > 1)
+ {
+ o.Append(" colspan=\"");
+ o.Append(colspan);
+ o.Append("\"");
+ }
o.Append(">");
}
public static void TD_C(ref StringBuilder o)
@@ -220,21 +236,25 @@ namespace OpenSim.Region.UserStatistics
{
o.Append("| ");
}
-
- o.Append(" 0)
- {
- GenericClass(ref o, pClass);
-
- }
- o.Append(" href=\"");
- o.Append(str);
- o.Append("\">");
- o.Append(reports[str].ReportName);
- o.Append(" ");
+ A(ref o, reports[str].ReportName, str, pClass);
+ o.Append(" ");
repcount++;
}
}
}
+ public static void A( ref StringBuilder o, string linktext, string linkhref, string pClass)
+ {
+ o.Append(" 0)
+ {
+ GenericClass(ref o, pClass);
+ }
+ o.Append(" href=\"");
+ o.Append(linkhref);
+ o.Append("\">");
+ o.Append(linktext);
+ o.Append("");
+
+ }
}
}
diff --git a/OpenSim/Region/UserStatistics/Sessions_Report.cs b/OpenSim/Region/UserStatistics/Sessions_Report.cs
new file mode 100644
index 0000000..2eeb90d
--- /dev/null
+++ b/OpenSim/Region/UserStatistics/Sessions_Report.cs
@@ -0,0 +1,260 @@
+/*
+ * 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.Text;
+using Mono.Data.SqliteClient;
+using OpenMetaverse;
+using OpenSim.Framework;
+
+namespace OpenSim.Region.UserStatistics
+{
+ public class Sessions_Report : IStatsController
+ {
+ #region IStatsController Members
+
+ public string ReportName
+ {
+ get { return "Sessions"; }
+ }
+
+ public Hashtable ProcessModel(Hashtable pParams)
+ {
+ Hashtable modeldata = new Hashtable();
+ modeldata.Add("Scenes", pParams["Scenes"]);
+ modeldata.Add("Reports", pParams["Reports"]);
+ SqliteConnection dbConn = (SqliteConnection)pParams["DatabaseConnection"];
+ List lstSessions = new List();
+ Hashtable requestvars = (Hashtable) pParams["RequestVars"];
+
+ string puserUUID = string.Empty;
+ string clientVersionString = string.Empty;
+ int queryparams = 0;
+
+ if (requestvars.ContainsKey("UserID"))
+ {
+ UUID testUUID = UUID.Zero;
+ if (UUID.TryParse(requestvars["UserID"].ToString(), out testUUID))
+ {
+ puserUUID = requestvars["UserID"].ToString();
+
+ }
+ }
+
+ if (requestvars.ContainsKey("VersionString"))
+ {
+ UUID testUUID = UUID.Zero;
+
+ clientVersionString = requestvars["VersionString"].ToString();
+
+
+ }
+
+ lock (dbConn)
+ {
+ string sql =
+ "SELECT distinct a.name_f, a.name_l, a.Agent_ID, b.Session_ID, b.client_version, b.last_updated FROM stats_session_data a LEFT OUTER JOIN stats_session_data b ON a.Agent_ID = b.Agent_ID";
+
+ if (puserUUID.Length > 0)
+ {
+ if (queryparams == 0)
+ sql += " WHERE";
+ else
+ sql += " AND";
+
+ sql += " b.agent_id=:agent_id";
+ queryparams++;
+ }
+
+ if (clientVersionString.Length > 0)
+ {
+ if (queryparams == 0)
+ sql += " WHERE";
+ else
+ sql += " AND";
+
+ sql += " b.client_version=:client_version";
+ queryparams++;
+ }
+
+ sql += " ORDER BY a.name_f, a.name_l, b.last_updated;";
+
+ SqliteCommand cmd = new SqliteCommand(sql, dbConn);
+
+ if (puserUUID.Length > 0)
+ cmd.Parameters.Add(new SqliteParameter(":agent_id", puserUUID));
+ if (clientVersionString.Length > 0)
+ cmd.Parameters.Add(new SqliteParameter(":client_version", clientVersionString));
+
+ SqliteDataReader sdr = cmd.ExecuteReader();
+
+ if (sdr.HasRows)
+ {
+ UUID userUUID = UUID.Zero;
+
+ SessionList activeSessionList = new SessionList();
+ activeSessionList.user_id=UUID.Random();
+ while(sdr.Read())
+ {
+ UUID readUUID = UUID.Parse(sdr["agent_id"].ToString());
+ if (readUUID != userUUID)
+ {
+ activeSessionList = new SessionList();
+ activeSessionList.user_id = readUUID;
+ activeSessionList.firstname = sdr["name_f"].ToString();
+ activeSessionList.lastname = sdr["name_l"].ToString();
+ activeSessionList.sessions = new List();
+ lstSessions.Add(activeSessionList);
+ }
+
+ ShortSessionData ssd = new ShortSessionData();
+
+ ssd.last_update = Utils.UnixTimeToDateTime((uint)Convert.ToInt32(sdr["last_updated"]));
+ ssd.session_id = UUID.Parse(sdr["session_id"].ToString());
+ ssd.client_version = sdr["client_version"].ToString();
+ activeSessionList.sessions.Add(ssd);
+
+ userUUID = activeSessionList.user_id;
+ }
+ }
+ sdr.Close();
+ sdr.Dispose();
+
+ }
+ modeldata["SessionData"] = lstSessions;
+ return modeldata;
+ }
+
+ public string RenderView(Hashtable pModelResult)
+ {
+ List lstSession = (List) pModelResult["SessionData"];
+ Dictionary reports = (Dictionary)pModelResult["Reports"];
+
+ const string STYLESHEET =
+ @"
+
+";
+
+ StringBuilder output = new StringBuilder();
+ HTMLUtil.HtmlHeaders_O(ref output);
+ output.Append(STYLESHEET);
+ HTMLUtil.HtmlHeaders_C(ref output);
+
+ HTMLUtil.AddReportLinks(ref output, reports, "");
+
+ HTMLUtil.TABLE_O(ref output, "defaultr");
+ HTMLUtil.TR_O(ref output, "defaultr");
+ HTMLUtil.TD_O(ref output, "header");
+ output.Append("FirstName");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TD_O(ref output, "header");
+ output.Append("LastName");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TD_O(ref output, "header");
+ output.Append("SessionEnd");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TD_O(ref output, "header");
+ output.Append("Client");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TR_C(ref output);
+ if (lstSession.Count == 0)
+ {
+ HTMLUtil.TR_O(ref output, "");
+ HTMLUtil.TD_O(ref output, "align_top", 1, 4);
+ output.Append("No results for that query");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TR_C(ref output);
+ }
+ foreach (SessionList ssnlst in lstSession)
+ {
+ int cnt = 0;
+ foreach (ShortSessionData sesdata in ssnlst.sessions)
+ {
+ HTMLUtil.TR_O(ref output, "");
+ if (cnt++ == 0)
+ {
+ HTMLUtil.TD_O(ref output, "align_top", ssnlst.sessions.Count, 1);
+ output.Append(ssnlst.firstname);
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TD_O(ref output, "align_top", ssnlst.sessions.Count, 1);
+ output.Append(ssnlst.lastname);
+ HTMLUtil.TD_C(ref output);
+ }
+ HTMLUtil.TD_O(ref output, "content");
+ output.Append(sesdata.last_update.ToShortDateString());
+ output.Append(" - ");
+ output.Append(sesdata.last_update.ToShortTimeString());
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TD_O(ref output, "content");
+ output.Append(sesdata.client_version);
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TR_C(ref output);
+
+ }
+ HTMLUtil.TR_O(ref output, "");
+ HTMLUtil.TD_O(ref output, "align_top", 1, 4);
+ HTMLUtil.HR(ref output, "");
+ HTMLUtil.TD_C(ref output);
+ HTMLUtil.TR_C(ref output);
+ }
+ HTMLUtil.TABLE_C(ref output);
+ output.Append(" |