/
sqlitestemlist.cpp
117 lines (96 loc) · 3.58 KB
/
sqlitestemlist.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "sqlitestemlist.h"
#include <QSqlQuery>
#include <QSqlDriver>
#include <QSqlError>
#include "create-allomorphs/createallomorphs.h"
#include "morphology.h"
#include "morphologyxmlreader.h"
#include <QXmlStreamReader>
#include <QtDebug>
SqliteStemList::SqliteStemList(const MorphologicalModel *model)
: AbstractSqlStemList(model)
{
}
QString SqliteStemList::elementName()
{
return "sqlite-stem-list";
}
AbstractNode *SqliteStemList::readFromXml(QXmlStreamReader &in, MorphologyXmlReader *morphologyReader, const MorphologicalModel *model)
{
Q_ASSERT( in.isStartElement() );
SqliteStemList* sl = new SqliteStemList(model);
sl->readInitialNodeAttributes(in, morphologyReader);
if( in.attributes().value("accepts-stems").toString() == "true" )
morphologyReader->recordStemAcceptingNewStems( sl );
/// the default here is true
if( in.attributes().value("include-glosses").toString() == "false" )
{
qCritical() << "The include-glosses=\"false\" is giving errors. Do not use it until it is fixed.";
sl->setReadGlosses(false);
}
morphologyReader->recordStemList( sl );
while(!in.atEnd() && !(in.tokenType() == QXmlStreamReader::EndElement && in.name() == elementName() ) )
{
in.readNext();
if( in.tokenType() == QXmlStreamReader::StartElement )
{
if( in.name() == AbstractStemList::XML_FILENAME )
{
sl->setConnectionString( in.readElementText() );
}
else if( in.name() == XML_EXTERNAL_DATABASE )
{
sl->setExternalDatabase( in.readElementText() );
}
else if( in.name() == AbstractStemList::XML_MATCHING_TAG )
{
sl->addConditionTag( in.readElementText() );
}
else if( in.name() == AbstractNode::XML_ADD_ALLOMORPHS )
{
sl->addCreateAllomorphs( morphologyReader->createAllomorphsFromId( in.attributes().value("with").toString() ) );
}
else if( CreateAllomorphs::matchesElement(in) )
{
sl->addCreateAllomorphs( CreateAllomorphs::readFromXml(in, morphologyReader) );
}
}
}
sl->readStems( morphologyReader->morphology()->writingSystems() );
Q_ASSERT( in.isEndElement() && in.name() == elementName() );
return sl;
}
bool SqliteStemList::matchesElement(QXmlStreamReader &in)
{
return in.isStartElement() && in.name() == elementName();
}
void SqliteStemList::openDatabase(const QString &connectionString, const QString &databaseName)
{
SqliteStemList::openSqliteDatabase(connectionString, databaseName);
}
void SqliteStemList::openSqliteDatabase(const QString &connectionString, const QString &databaseName)
{
if(!QSqlDatabase::isDriverAvailable("QSQLITE"))
{
qWarning() << "SqliteStemList::openDatabase()" << "The QSQLITE driver is not available.";
return;
}
/// if the database is already open, no need to replace that connection
/// with another one (and trigger a warning message)
if( QSqlDatabase::database(databaseName).isValid() )
{
return;
}
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", databaseName );
db.setDatabaseName( connectionString );
db.setConnectOptions("QSQLITE_ENABLE_REGEXP");
if(!db.open())
{
qWarning() << "SqliteStemList::openDatabase()" << "Database failed to open." << connectionString;
return;
}
if( !db.isValid() )
{
qWarning() << "SqliteStemList::openDatabase()" << "Invalid database: " << connectionString;
}
}