Changeset 18927 for trunk/FACT++


Ignore:
Timestamp:
11/09/17 13:40:41 (7 years ago)
Author:
tbretz
Message:
Changed StoreQueryResult to UseQueryResult to allow access to huge tables.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/FACT++/src/rootifysql.cc

    r18892 r18927  
    169169
    170170    // -------------------------- Request data from database -------------------
    171     const mysqlpp::StoreQueryResult res =
    172         Database(uri).query(query).store();
    173     // -------------------------------------------------------------------------
    174 
    175     if (verbose>0)
    176     {
    177         cout << res.size() << " rows received." << endl;
    178         cout << "Query time: " << Time().UnixTime()-start2.UnixTime() << "s" << endl;
    179     }
    180 
    181     if (res.empty())
    182     {
    183         cerr << "Nothing to write." << endl;
    184         return 5;
    185     }
     171    Database connection(uri); // Keep alive while fetching rows
     172
     173    const mysqlpp::UseQueryResult res =
     174        connection.query(query).use();
     175    // -------------------------------------------------------------------------
    186176
    187177    if (verbose>0)
     
    191181    TFile tfile(path, update?"UPDATE":(force?"RECREATE":"CREATE"), "Rootify SQL", compression);
    192182    if (tfile.IsZombie())
     183        return 5;
     184
     185    // -------------------------------------------------------------------------
     186
     187    // get the first row to get the field description
     188    mysqlpp::Row row = res.fetch_row();
     189    if (!row)
     190    {
     191        cerr << "Empty set returned... nothing to write." << endl;
    193192        return 6;
    194     // -------------------------------------------------------------------------
    195 
    196     const mysqlpp::Row &r = res.front();
    197 
    198     if (verbose>0)
    199         cout << "Trying to setup " << r.size() << " branches..." << endl;
     193    }
     194
     195    if (verbose>0)
     196        cout << "Trying to setup " << row.size() << " branches..." << endl;
    200197
    201198    if (verbose>1)
    202199        cout << endl;
    203200
    204     const mysqlpp::FieldNames &l = *r.field_list().list;
     201    const mysqlpp::FieldNames &l = *row.field_list().list;
    205202
    206203    vector<double>  buf(l.size());
     
    213210    for (size_t i=0; i<l.size(); i++)
    214211    {
    215         const string t = r[i].type().sql_name();
     212        const string t = row[i].type().sql_name();
    216213
    217214        if (t.find("DATETIME")!=string::npos)
     
    258255
    259256    // ---------------------- Fill TTree with DB data --------------------------
    260     size_t skip = 0;
    261     for (auto row=res.begin(); row<res.end(); row++)
    262     {
     257    size_t count = 0;
     258    size_t skip  = 0;
     259    do
     260    {
     261        count++;
     262
    263263        ostringstream sout;
    264264
    265265        size_t idx=0;
    266         for (auto col=row->begin(); col!=row->end(); col++, idx++)
     266        for (auto col=row.begin(); col!=row.end(); col++, idx++)
    267267        {
    268268            if (display)
     
    302302        }
    303303
    304         if (idx==row->size())
     304        if (idx==row.size())
    305305        {
    306306            ttree->Fill();
     
    308308                cout << sout.str() << endl;
    309309        }
    310     }
     310
     311        row = res.fetch_row();
     312
     313    } while (row);
     314
    311315    // -------------------------------------------------------------------------
    312316
     
    316320    if (verbose>0)
    317321    {
     322        cout << count << " rows fetched." << endl;
    318323        if (skip>0)
    319324            cout << skip << " rows skipped due to NULL field." << endl;
Note: See TracChangeset for help on using the changeset viewer.