Index: trunk/MagicSoft/Mars/Changelog
===================================================================
--- trunk/MagicSoft/Mars/Changelog	(revision 8060)
+++ trunk/MagicSoft/Mars/Changelog	(revision 8061)
@@ -18,4 +18,14 @@
 
                                                  -*-*- END OF LINE -*-*-
+ 2006/10/13 Thomas Bretz
+
+   * datacenter/macros/filldotraw.C:
+     - allow inserting missing runs
+
+   * msql/MSQLMagic.[h,cc]:
+     - adde also function to request the value not only key and name
+
+
+
  2006/10/12 Daniela Dorner
 
Index: trunk/MagicSoft/Mars/datacenter/macros/filldotraw.C
===================================================================
--- trunk/MagicSoft/Mars/datacenter/macros/filldotraw.C	(revision 8060)
+++ trunk/MagicSoft/Mars/datacenter/macros/filldotraw.C	(revision 8061)
@@ -68,5 +68,5 @@
 
 #include "MZlib.h"
-#include "MSQLServer.h"
+#include "MSQLMagic.h"
 #include "MRawRunHeader.h"
 #include "MDirIter.h"
@@ -74,9 +74,71 @@
 using namespace std;
 
+Int_t QueryFromName(MSQLMagic &serv, const char *col, const char *val)
+{
+    const TString query1 = Form("SELECT f%sKEY FROM %s WHERE f%s='%s'",
+                                col, col, col, val);
+
+    TSQLResult *res1 = serv.Query(query1);
+    if (!res1)
+    {
+        cout << "ERROR - Query has failed: " << query1 << endl;
+        return -1;
+    }
+
+    TSQLRow *row=res1->Next();
+
+    const Int_t rc1 = row && (*row)[0] ? atoi((*row)[0]) : -1;
+    delete res1;
+    return rc1;
+}
+
 //get key for a magic number
-Int_t MagicNumber(MSQLServer &serv, const MRawRunHeader &h)
-{
-    TString query(Form("SELECT fMagicNumberKEY FROM MagicNumber WHERE fMagicNumber=%d",
-                       h.GetMagicNumber()));
+Int_t MagicNumber(MSQLMagic &serv, const MRawRunHeader &h)
+{
+    return QueryFromName(serv, "MagicNumber", Form("%d", h.GetMagicNumber()));
+}
+
+Bool_t ReadRaw(TString fname, MRawRunHeader &h)
+{
+    MZlib fin(fname);
+    if (!fin)
+    {
+        cout << "ERROR - Couldn't open file " << fname << endl;
+        return kFALSE;
+    }
+
+    if (!h.ReadEvt(fin))
+    {
+        cout << "ERROR - Reading header from file " << fname << endl;
+        return kFALSE;
+    }
+    return kTRUE;
+}
+
+Bool_t ReadRoot(TString fname, MRawRunHeader *h)
+{
+    TFile file(fname, "READ");
+    if (file.IsZombie())
+    {
+        cout << "ERROR - Cannot open file " << fname << endl;
+        return kFALSE;
+    }
+
+    TTree *t = (TTree*)file.Get("RunHeaders");
+    if (!t)
+    {
+        cout << "ERROR - Tree RunHeaders not found." << endl;
+        return kFALSE;
+    }
+
+    t->SetBranchAddress("MRawRunHeader.", &h);
+    t->GetEntry(0);
+
+    return kTRUE;
+}
+
+Bool_t CheckRunNumber(MSQLMagic &serv, Int_t num)
+{
+    TString query(Form("SELECT fRunNumber from RunData where fRunNumber=%d", num));
 
     TSQLResult *res = serv.Query(query);
@@ -84,62 +146,65 @@
     {
         cout << "ERROR - Query failed: " << query << endl;
+        return kFALSE;
+    }
+
+    TSQLRow *row = res->Next();
+
+    Bool_t rc = row && (*row)[0] ? atoi((*row)[0])==num : kFALSE;
+    delete res;
+    return rc;
+
+}
+
+Bool_t InsertEntry(MSQLMagic &serv, MRawRunHeader &h)
+{
+    const Int_t magickey  = MagicNumber(serv, h);
+    const Int_t runkey    = QueryFromName(serv, "RunType",         h.GetRunTypeStr());
+    const Int_t projkey   = serv.QueryKeyOfName("Project",         h.GetProjectName());
+    const Int_t sourcekey = serv.QueryKeyOfName("Source",          h.GetSourceName());
+    const Int_t modekey   = serv.QueryKeyOfName("ObservationMode", h.GetObservationMode());
+
+    if (magickey<0 || runkey<0 || projkey<0 || sourcekey<0 || modekey<0)
         return -1;
-    }
-
-    TSQLRow *row = res->Next();
-
-    TString rc = row ? (*row)[0] : "";
-
-    delete res;
-
-    if (rc.IsNull())
-    {
-        cout << "ERROR - No result from query: " << query << endl;
+
+    TString query;
+
+    query += Form("fRunNumber=%d, ",          h.GetRunNumber());
+    query += Form("fMagicNumberKEY=%d, ",     magickey);
+    query += Form("fFormatVersion=%d, ",      h.GetFormatVersion());
+    query += Form("fRunTypeKEY=%d, ",         runkey);
+    query += Form("fProjectKEY=%d, ",         projkey);
+    query += Form("fSourceKEY=%d, ",          sourcekey);
+    query += Form("fNumEvents=%d, ",          h.GetNumEvents());
+    query += Form("fRunStart='%s', ",         h.GetRunStart().GetSqlDateTime().Data());
+    query += Form("fRunStop='%s', ",          h.GetRunEnd().GetSqlDateTime().Data());
+    query += Form("fObservationModeKEY=%d, ", modekey);
+
+    query += "fExcludedFDAKEY=1, fTestFlagKEY=1, fLightConditionsKEY=1, ";
+    query += "fCalibrationScriptKEY=1, fDiscriminatorThresholdTableKEY=1, ";
+    query += "fTriggerDelayTableKEY=1, fL1TriggerTableKEY=1, fL2TriggerTableKEY=1, ";
+    query += "fHvSettingsKEY=1, fZenithDistance=0, fAzimuth=0, ";
+    query += "fDaqStoreRate=0, fDaqTriggerRate=0, fMeanTRiggerRate=0, ";
+    query += "fL2RatePresc=0, fL2RateUnpresc=0 ";
+
+    return serv.Insert("RunData", query);
+}
+
+Int_t UpdateEntry(MSQLMagic &serv, MRawRunHeader &h)
+{
+    //get key for the magic number
+    const Int_t key = MagicNumber(serv, h);
+    if (key<0)
         return -1;
-    }
-
-    return rc.Atoi();
-}
-
-Bool_t ReadRaw(TString fname, MRawRunHeader &h)
-{
-    MZlib fin(fname);
-    if (!fin)
-    {
-        cout << "ERROR - Couldn't open file " << fname << endl;
-        return kFALSE;
-    }
-
-    if (!h.ReadEvt(fin))
-    {
-        cout << "ERROR - Reading header from file " << fname << endl;
-        return kFALSE;
-    }
-    return kTRUE;
-}
-
-Bool_t ReadRoot(TString fname, MRawRunHeader *h)
-{
-    TFile file(fname, "READ");
-    if (file.IsZombie())
-    {
-        cout << "ERROR - Cannot open file " << fname << endl;
-        return kFALSE;
-    }
-
-    TTree *t = (TTree*)file.Get("RunHeaders");
-    if (!t)
-    {
-        cout << "ERROR - Tree RunHeaders not found." << endl;
-        return kFALSE;
-    }
-
-    t->SetBranchAddress("MRawRunHeader.", &h);
-    t->GetEntry(0);
-
-    return kTRUE;
-}
-
-int Process(MSQLServer &serv, TString fname, Bool_t dummy)
+
+    TString vars(Form("fMagicNumberKEY=%d, fFormatVersion=%d",
+                       key, h.GetFormatVersion()));
+    TString where(Form("fRunNumber=%d", h.GetRunNumber()));
+
+    return serv.Update("RunData", vars, where);
+}
+
+
+int Process(MSQLMagic &serv, TString fname, Bool_t dummy)
 {
     MRawRunHeader h;
@@ -154,25 +219,10 @@
 
     if (dummy)
-    {
         h.Print("header");
-        return 1;
-    }
-
-    //get key for the magic number
-    const Int_t key = MagicNumber(serv, h);
-    if (key<0)
-        return 2;
-
-    TString query(Form("UPDATE RunData SET fMagicNumberKEY=%d, fFormatVersion=%d WHERE fRunNumber=%d",
-                       key, h.GetFormatVersion(), h.GetRunNumber()));
-
-    TSQLResult *res = serv.Query(query);
-    if (!res)
-    {
-        cout << "ERROR - Query failed: " << query << endl;
-        return 2;
-    }
-    delete res;
-    return 1;
+
+    Int_t rc = CheckRunNumber(serv, h.GetRunNumber()) ?
+        UpdateEntry(serv, h) : InsertEntry(serv, h);
+
+    return rc==0 ? 2 : 1;
 }
 
@@ -181,5 +231,5 @@
     TEnv env("sql.rc");
 
-    MSQLServer serv(env);
+    MSQLMagic serv(env);
     if (!serv.IsConnected())
     {
@@ -187,4 +237,6 @@
         return 0;
     }
+
+    serv.SetIsDummy(dummy);
 
     cout << "filldotraw" << endl;
@@ -202,5 +254,5 @@
     TEnv env("sql.rc");
 
-    MSQLServer serv(env);
+    MSQLMagic serv(env);
     if (!serv.IsConnected())
     {
@@ -208,4 +260,6 @@
         return 0;
     }
+
+    serv.SetIsDummy(dummy);
 
     cout << "filldotraw" << endl;
Index: trunk/MagicSoft/Mars/msql/MSQLMagic.cc
===================================================================
--- trunk/MagicSoft/Mars/msql/MSQLMagic.cc	(revision 8060)
+++ trunk/MagicSoft/Mars/msql/MSQLMagic.cc	(revision 8061)
@@ -51,5 +51,5 @@
 //  On success the name of the key is returned.
 //
-TString MSQLMagic::QueryNameOfKey(TString col, const char *key)
+TString MSQLMagic::QueryValOf(TString col, const char *ext, const char *key)
 {
     if (col.EndsWith("KEY"))
@@ -58,6 +58,6 @@
         col.Remove(0, 1);
 
-    const TString query=Form("SELECT f%sName FROM %s WHERE f%sKEY=%s",
-                             col.Data(), col.Data(), col.Data(), key);
+    const TString query=Form("SELECT f%s%s FROM %s WHERE f%sKEY=%s",
+                             col.Data(), ext, col.Data(), col.Data(), key);
 
     TSQLResult *res = Query(query);
@@ -75,4 +75,72 @@
 // --------------------------------------------------------------------------
 //
+// Return the name corresponding to a key. If col starts with f or
+// end with KEY it is stripped.
+//
+//  If the query fails an empty string is returned.
+//
+//  On success the name of the key is returned.
+//
+TString MSQLMagic::QueryNameOfKey(TString col, const char *key)
+{
+    return QueryValOf(col, "Name", key);
+}
+
+// --------------------------------------------------------------------------
+//
+// Return the value corresponding to a key. If col starts with f or
+// end with KEY it is stripped.
+//
+//  If the query fails an empty string is returned.
+//
+//  On success the value of the key is returned.
+//
+TString MSQLMagic::QueryValOfKey(TString col, const char *key)
+{
+    return QueryValOf(col, "", key);
+}
+
+// --------------------------------------------------------------------------
+//
+//  return the key of f[col]KEY where f[col][ext]=[val]
+//
+//  return -1 if the query failed or the KEY was not found
+//  return  0 if the KEY could not be determined after inserting
+//  return the KEY in case of success
+//
+Int_t MSQLMagic::QueryKeyOf(const char *col, const char *ext, const char *val)
+{
+    const TString query1 = Form("SELECT f%sKEY FROM %s WHERE f%s%s='%s'",
+                                col, col, col, ext, val);
+
+    TSQLResult *res1 = Query(query1);
+    if (!res1)
+    {
+        cout << "ERROR - Query has failed: " << query1 << endl;
+        return -1;
+    }
+
+    TSQLRow *row=res1->Next();
+
+    const Int_t rc1 = row && (*row)[0] ? atoi((*row)[0]) : -1;
+    delete res1;
+    return rc1;
+}
+
+// --------------------------------------------------------------------------
+//
+//  return the key of f[col]KEY where f[col]=[val]
+//
+//  return -1 if the query failed or the KEY was not found
+//  return  0 if the KEY could not be determined after inserting
+//  return the KEY in case of success
+//
+Int_t MSQLMagic::QueryKeyOfVal(const char *col, const char *val)
+{
+    return QueryKeyOf(col, "", val);
+}
+
+// --------------------------------------------------------------------------
+//
 //  return the key of f[col]KEY where f[col]Name=[name]
 //
@@ -86,19 +154,5 @@
 Int_t MSQLMagic::QueryKeyOfName(const char *col, const char *name, Bool_t insert)
 {
-    const TString query1 = Form("SELECT f%sKEY FROM %s WHERE f%sName='%s'",
-                                col, col, col, name);
-
-    TSQLResult *res1 = Query(query1);
-    if (!res1)
-    {
-        cout << "ERROR - Query has failed: " << query1 << endl;
-        return -1;
-    }
-
-    TSQLRow *row=res1->Next();
-
-    const Int_t rc1 = row && (*row)[0] ? atoi((*row)[0]) : -1;
-
-    delete res1;
+    const Int_t rc1 = QueryKeyOf(col, "Name", name);
 
     if (rc1>=0)
Index: trunk/MagicSoft/Mars/msql/MSQLMagic.h
===================================================================
--- trunk/MagicSoft/Mars/msql/MSQLMagic.h	(revision 8060)
+++ trunk/MagicSoft/Mars/msql/MSQLMagic.h	(revision 8061)
@@ -38,6 +38,10 @@
     Bool_t IsDummy() const { return fIsDummy; }
 
+    TString QueryValOf(TString col, const char *ext, const char *key);
+    TString QueryValOfKey(TString col, const char *key);
     TString QueryNameOfKey(TString col, const char *key);
     Int_t   QueryKeyOfName(const char *col, const char *name, Bool_t insert=kTRUE);
+    Int_t   QueryKeyOfVal(const char *col, const char *val);
+    Int_t   QueryKeyOf(const char *col, const char *ext, const char *val);
     Bool_t  ExistStr(const char *column, const char *table, const char *test);
 
