Ejemplo n.º 1
0
int Database::setBars (Bars *symbol)
{
    if (! symbol)
        return 0;

    if (! getSymbol(symbol))
    {
        if (! newSymbol(symbol))
            return 0;
    }
    else
    {
        // check if we need to save the name
        if (! symbol->name().isEmpty())
            setName(symbol);
    }

    if (! init())
        return 0;

    _db.transaction();

    QSqlQuery q(_db);

    QList<int> keys = symbol->keys();

    BarType bt;
    int loop = 0;
    for (; loop < keys.size(); loop++)
    {
        CBar *bar = symbol->bar(keys.at(loop));

        QDateTime dt = bar->date();

        QString date = dt.toString("yyyyMMddHHmmss");

        // first check if record exists so we know to do an update or insert
        QString s = "SELECT date FROM " + symbol->table() + " WHERE date =" + date;
        q.exec(s);
        if (q.lastError().isValid())
        {
            qDebug() << "Database::setBars:" << q.lastError().text();
            qDebug() << s;
            continue;
        }

        if (q.next()) // record exists, use update
        {
            s = "UPDATE " + symbol->table() + " SET ";

            QStringList tl;
            double v = 0;
            if (bar->get(bt.indexToString(BarType::_OPEN), v))
                tl << "open=" + QString::number(v);

            v = 0;
            if (bar->get(bt.indexToString(BarType::_HIGH), v))
                tl << "high=" + QString::number(v);

            v = 0;
            if (bar->get(bt.indexToString(BarType::_LOW), v))
                tl << "low=" + QString::number(v);

            v = 0;
            if (bar->get(bt.indexToString(BarType::_CLOSE), v))
                tl << "close=" + QString::number(v);

            v = 0;
            if (bar->get(bt.indexToString(BarType::_VOLUME), v))
                tl << "volume=" + QString::number(v);

            s.append(tl.join(","));
            s.append(" WHERE date=" + date);
        }
        else // new record, use insert
        {
            QStringList tl;
            s = "INSERT INTO " + symbol->table() + " (date,open,high,low,close,volume) VALUES(";

            tl << date;

            double v = 0;
            bar->get(bt.indexToString(BarType::_OPEN), v);
            tl << QString::number(v);

            v = 0;
            bar->get(bt.indexToString(BarType::_HIGH), v);
            tl << QString::number(v);

            v = 0;
            bar->get(bt.indexToString(BarType::_LOW), v);
            tl << QString::number(v);

            v = 0;
            bar->get(bt.indexToString(BarType::_CLOSE), v);
            tl << QString::number(v);

            v = 0;
            bar->get(bt.indexToString(BarType::_VOLUME), v);
            tl << QString::number(v);

            s.append(tl.join(","));
            s.append(")");
        }

        q.exec(s);
        if (q.lastError().isValid())
        {
            qDebug() << "Database::setBars:" << q.lastError().text();
            qDebug() << s;
            continue;
        }
    }
    _db.commit();
    return 1;
}