Added support for import data from file.
							parent
							
								
									ace78877a3
								
							
						
					
					
						commit
						fe5eac9cd9
					
				@ -0,0 +1,93 @@
 | 
			
		||||
#include "csvimporter.h"
 | 
			
		||||
#include <QFile>
 | 
			
		||||
#include <QVariant>
 | 
			
		||||
 | 
			
		||||
CsvImporter::CsvImporter(const QMetaObject *metaObject, QObject *parent)
 | 
			
		||||
    :QObject(parent),
 | 
			
		||||
     IImporter(metaObject)
 | 
			
		||||
{
 | 
			
		||||
    m_parsed = false;
 | 
			
		||||
    m_currentRec = 1;
 | 
			
		||||
    m_error = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CsvImporter::setImportFile(const QString &fileName)
 | 
			
		||||
{
 | 
			
		||||
    m_fileName = fileName;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int CsvImporter::recordCount()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_parsed)
 | 
			
		||||
    {
 | 
			
		||||
        parseFile();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return m_lines.count() - 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
QSharedPointer<QObject> CsvImporter::nextRecord()
 | 
			
		||||
{
 | 
			
		||||
    if (!m_parsed)
 | 
			
		||||
    {
 | 
			
		||||
        parseFile();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QObject *entity = m_metaObject->newInstance();
 | 
			
		||||
 | 
			
		||||
    if (entity == NULL || m_currentRec > recordCount())
 | 
			
		||||
    {
 | 
			
		||||
        ++m_currentRec;
 | 
			
		||||
        return QSharedPointer<QObject>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QStringList props = m_header.split(m_separator);
 | 
			
		||||
    QString line = m_lines[m_currentRec];
 | 
			
		||||
    QStringList values = line.split(m_separator);
 | 
			
		||||
 | 
			
		||||
    for (int i = 0; i < props.size(); i++) {
 | 
			
		||||
        QString property = props[i];
 | 
			
		||||
        QString value = values[i];
 | 
			
		||||
        if (!entity->setProperty(property.toStdString().c_str(), QVariant(value)))
 | 
			
		||||
        {
 | 
			
		||||
            m_error = true;
 | 
			
		||||
            emit noSuchProperty(property);
 | 
			
		||||
 | 
			
		||||
            ++m_currentRec;
 | 
			
		||||
            return QSharedPointer<QObject>();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ++m_currentRec;
 | 
			
		||||
 | 
			
		||||
    return QSharedPointer<QObject>(entity);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool CsvImporter::isError()
 | 
			
		||||
{
 | 
			
		||||
    return m_error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CsvImporter::parseFile()
 | 
			
		||||
{
 | 
			
		||||
    QFile file(m_fileName);
 | 
			
		||||
 | 
			
		||||
    if (!file.open(QFile::ReadOnly | QFile::Text))
 | 
			
		||||
    {
 | 
			
		||||
        m_error = true;
 | 
			
		||||
        emit parseError();
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    QByteArray data = file.readAll();
 | 
			
		||||
    QString strData(data);
 | 
			
		||||
 | 
			
		||||
    m_lines = strData.split("\n");
 | 
			
		||||
    m_header = m_lines[0];
 | 
			
		||||
    m_parsed = true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void CsvImporter::setSeparator(const QString &separator)
 | 
			
		||||
{
 | 
			
		||||
    m_separator = separator;
 | 
			
		||||
}
 | 
			
		||||
@ -0,0 +1,40 @@
 | 
			
		||||
#ifndef CSVIMPORTER_H
 | 
			
		||||
#define CSVIMPORTER_H
 | 
			
		||||
 | 
			
		||||
#include "iimporter.h"
 | 
			
		||||
#include <QStringList>
 | 
			
		||||
#include <QObject>
 | 
			
		||||
 | 
			
		||||
class CsvImporter : public QObject, public IImporter
 | 
			
		||||
{
 | 
			
		||||
    Q_OBJECT
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
    explicit CsvImporter(const QMetaObject *metaObject, QObject *parent = NULL);
 | 
			
		||||
 | 
			
		||||
    // IImporter interface
 | 
			
		||||
public:
 | 
			
		||||
    void setImportFile(const QString &fileName);
 | 
			
		||||
    int recordCount();
 | 
			
		||||
    QSharedPointer<QObject> nextRecord();
 | 
			
		||||
    bool isError();
 | 
			
		||||
 | 
			
		||||
    void setSeparator(const QString &separator);
 | 
			
		||||
 | 
			
		||||
signals:
 | 
			
		||||
    void parseError();
 | 
			
		||||
    void noSuchProperty(QString propName);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    void parseFile();
 | 
			
		||||
 | 
			
		||||
    QString m_header;
 | 
			
		||||
    QString m_separator;
 | 
			
		||||
    QString m_fileName;
 | 
			
		||||
    QStringList m_lines;
 | 
			
		||||
    bool m_parsed;
 | 
			
		||||
    bool m_error;
 | 
			
		||||
    int m_currentRec;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // CSVIMPORTER_H
 | 
			
		||||
@ -0,0 +1,22 @@
 | 
			
		||||
#ifndef IIMPORTER_H
 | 
			
		||||
#define IIMPORTER_H
 | 
			
		||||
 | 
			
		||||
#include <QMetaObject>
 | 
			
		||||
#include <QObject>
 | 
			
		||||
#include <QSharedPointer>
 | 
			
		||||
 | 
			
		||||
class IImporter
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
    explicit IImporter(const QMetaObject *metaObject) { m_metaObject = metaObject; }
 | 
			
		||||
 | 
			
		||||
    virtual void setImportFile(const QString &fileName) = 0;
 | 
			
		||||
    virtual int recordCount() = 0;
 | 
			
		||||
    virtual QSharedPointer<QObject> nextRecord() = 0;
 | 
			
		||||
    virtual bool isError() = 0;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
    const QMetaObject *m_metaObject;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif // IIMPORTER_H
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue