Added public files

Roughly added all public files. Probably missed some, though.
diff --git a/secure/zweities.c b/secure/zweities.c
new file mode 100644
index 0000000..89307c2
--- /dev/null
+++ b/secure/zweities.c
@@ -0,0 +1,164 @@
+// MorgenGrauen MUDlib
+/** \file /file.c
+* Kurzbeschreibung.
+* Langbeschreibung...
+* \author <Autor>
+* \date <date>
+* \version $Id$
+*/
+/* Changelog:
+*/
+#pragma strong_types,save_types,rtt_checks
+#pragma no_clone,no_inherit,no_shadow
+#pragma pedantic, range_check
+
+#include <defines.h>
+#include <events.h>
+#include <wizlevels.h>
+#include <player/base.h>
+#include <userinfo.h>
+
+#define HOME(x) (__PATH__(0)+x)
+#define ZDEBUG(x) tell_room("/players/zesstra/workroom",\
+                    sprintf("second: %O\n",x));
+
+protected void create()
+{
+  seteuid(getuid());
+  if (sl_open(HOME("ARCH/second.sqlite")) != 1)
+  {
+    raise_error("Datenbank konnte nicht geoeffnet werden.\n");
+  }
+  // Tabellen und Indices anlegen, falls die nicht existieren.
+  sl_exec("CREATE TABLE IF NOT EXISTS zweities(uuid TEXT PRIMARY KEY ASC, "
+          "name TEXT NOT NULL, erstieuuid TEXT NOT NULL, "
+          "erstie TEXT NOT NULL);");
+  sl_exec("CREATE TABLE IF NOT EXISTS testies(name TEXT PRIMARY KEY ASC, "
+          "magier TEXT NOT NULL, "
+          "lastlogin DATETIME DEFAULT current_timestamp);");
+  sl_exec("CREATE TABLE IF NOT EXISTS familien("
+          "erstieuuid TEXT PRIMARY KEY ASC, familie TEXT NOT NULL);");
+  sl_exec("CREATE INDEX IF NOT EXISTS idx_erstie ON zweities(erstie);");
+  sl_exec("CREATE INDEX IF NOT EXISTS idx_name ON zweities(name);");
+  sl_exec("CREATE INDEX IF NOT EXISTS idx_magiername ON testies(magier);");
+  sl_exec("CREATE INDEX IF NOT EXISTS idx_familie ON familien(familie);");
+
+  // Login-Event abonnieren
+  if (EVENTD->RegisterEvent(EVT_LIB_LOGIN,
+                            "listen", this_object()) <= 0)
+  {
+    raise_error("Loginevent konnte nicht abonniert werden.\n");
+  }
+}
+
+public void listen(string eid, object trigob, mixed data)
+{
+  if (previous_object() != find_object(EVENTD)
+      || !trigob
+      || !query_once_interactive(trigob)
+      || IS_LEARNER(trigob))
+    return;
+  // wenn testie, wird der Char als Testie behandelt und P_SECOND ignoriert.
+  mixed testie=trigob->QueryProp(P_TESTPLAYER);
+  if (stringp(testie)
+      && strstr(testie,"Gilde")==-1)
+  {
+    mixed plinfo = master()->get_userinfo(testie);
+    if (pointerp(plinfo))
+    {
+      sl_exec("INSERT OR REPLACE INTO testies(name, magier, lastlogin) "
+              "VALUES(?1,?2,?3);",
+              trigob->query_real_name(),
+              testie, time());
+      return; // zweitie jetzt auf jeden Fall ignorieren.
+    }
+  }
+
+  mixed erstie=trigob->QueryProp(P_SECOND);
+  if (stringp(erstie))
+  {
+    mixed plinfo = master()->get_userinfo(erstie);
+    if (pointerp(plinfo))
+    {
+      sl_exec("INSERT OR REPLACE INTO zweities(uuid, name, erstieuuid, erstie) "
+              "VALUES(?1,?2,?3,?4);",
+              getuuid(trigob),
+              trigob->query_real_name(),
+              erstie + "_" + plinfo[USER_CREATION_DATE+1],
+              erstie);
+    }
+    //ZDEBUG(sprintf("%O, %O, %O\n",eid,trigob,data));
+  }
+}
+
+varargs int remove(int silent)
+{
+  EVENTD->UnregisterEvent(EVT_LIB_LOGIN, this_object());
+  sl_close();
+  destruct(ME);
+  return 1;
+}
+
+public mixed sql_query(string query)
+{
+  if (ARCH_SECURITY)
+    return sl_exec(query);
+  return 0;
+}
+
+private string get_erstie_data(string datum, object zweitie)
+{
+  if (!zweitie) return 0;
+  mixed res = sl_exec("SELECT " + datum + " FROM zweities WHERE uuid=?1",
+                      getuuid(zweitie));
+  if (sizeof(res))
+    return res[0][0];
+
+  return 0;
+}
+
+public varargs string QueryErstieName(object zweitie)
+{
+  return get_erstie_data("erstie", zweitie || previous_object());
+}
+
+public varargs string QueryErstieUUID(object zweitie)
+{
+  return get_erstie_data("erstieuuid", zweitie || previous_object());
+}
+
+private string* get_zweitie_data(string datum, object erstie)
+{
+  if (!erstie) return 0;
+  mixed tmp = sl_exec("SELECT " + datum + " FROM zweities WHERE erstieuuid=?1",
+                      getuuid(erstie));
+  if (sizeof(tmp))
+  {
+    string *res=({});
+    foreach(string *row: tmp)
+      res+=({row[0]});
+    return res;
+  }
+  return 0;
+}
+
+public varargs string* QueryZweities(object erstie)
+{
+  return get_zweitie_data("name", erstie || previous_object());
+}
+
+public varargs string QueryFamilie(object pl)
+{
+  string erstie = get_erstie_data("erstieuuid",
+                                  pl || previous_object());
+  // Wenn !erstie, dann ist pl kein Zweitie, also ist er selber erstie
+  erstie ||= getuuid(pl);
+  // jetzt noch gucken, ob ne explizite Familie fuer den erstie erfasst ist.
+  mixed tmp = sl_exec("SELECT familie FROM familien WHERE "
+                      "erstieuuid=?1",erstie);
+  if (sizeof(tmp))
+    return tmp[0][0];
+  // wenn nicht, dann ist die Familie die Zweitieuuid 
+  return erstie;
+}
+