Index: trunk/MagicSoft/Mars/datacenter/macros/filldotraw.C
===================================================================
--- trunk/MagicSoft/Mars/datacenter/macros/filldotraw.C	(revision 8052)
+++ 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;
