-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIndexDatabase.cpp
More file actions
161 lines (133 loc) · 3.69 KB
/
IndexDatabase.cpp
File metadata and controls
161 lines (133 loc) · 3.69 KB
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#include "IndexDatabase.h"
#include <QVariant>
#include "ChineseLetterHelper.h"
IndexDatabase::IndexDatabase(QString name)
{
m_database = QSqlDatabase::addDatabase("QSQLITE",name);
m_database.setDatabaseName("IndexCache.db");
}
IndexDatabase::IndexDatabase(QString conName, QString dbName)
{
m_database = QSqlDatabase::addDatabase("QSQLITE",conName);
m_database.setDatabaseName(dbName);
}
IndexDatabase::~IndexDatabase()
{
QString connectionName = m_database.connectionName();
m_database.close();
m_database = QSqlDatabase();
QSqlDatabase::removeDatabase(connectionName);
}
bool IndexDatabase::load()
{
if (!m_database.open())
{
return false;
}
QStringList tableList = m_database.tables();
if (tableList.isEmpty())
{
QSqlQuery query(m_database);
// Windows 沿用发布版的原始结构,升级零影响;Linux 为新平台,额外存图标与
// .desktop 路径,两套结构互不干扰。
#ifdef Q_OS_LINUX
const char* createSql = "create table program(id integer primary key autoincrement,pyname text,name text,path text,iconpath text,desktoppath text)";
#else
const char* createSql = "create table program(id integer primary key autoincrement,pyname text,name text,path text)";
#endif
if (!query.exec(createSql))
{
return false;
}
}
return true;
}
bool IndexDatabase::insert(ProgramInfo& info)
{
QSqlQuery query(m_database);
#ifdef Q_OS_LINUX
QString strQuery = QString("insert into program values(null,\"%1\",\"%2\",\"%3\",\"%4\",\"%5\")").
arg(info.pyname).arg(info.name).arg(info.path).arg(info.iconPath).arg(info.desktopPath);
#else
QString strQuery = QString("insert into program values(null,\"%1\",\"%2\",\"%3\")").
arg(info.pyname).arg(info.name).arg(info.path);
#endif
if (!query.exec(strQuery))
{
return false;
}
return true;
}
bool IndexDatabase::insert(QVector<ProgramInfo> &infos)
{
if (!m_database.transaction())
{
return false;
}
foreach (ProgramInfo info,infos)
{
insert(info);
}
if (!m_database.commit())
{
return false;
}
return true;
}
bool IndexDatabase::query(QString querystr, QVector<ProgramInfo> &vecInfo)
{
QString pyStr = ChineseLetterHelper::GetFirstLetters(querystr);
QSqlQuery query(m_database);
query.setForwardOnly(true);
QString strQuery = "select * from program where pyname like \"";
for (int i = 0; i <pyStr.length(); i++)
{
QChar c = pyStr[i];
strQuery = strQuery + QString("%%%1").arg(c);
}
strQuery = strQuery + "%%\"";
if (!query.exec(strQuery))
{
return false;
}
while(query.next())
{
ProgramInfo info;
info.pyname = query.value(1).toString();
info.name = query.value(2).toString();
info.path = query.value(3).toString();
#ifdef Q_OS_LINUX
info.iconPath = query.value(4).toString();
info.desktopPath = query.value(5).toString();
#endif
vecInfo.append(info);
}
return true;
}
bool IndexDatabase::clear()
{
QSqlQuery query(m_database);
QString strQuery = "delete from program";
if (!query.exec(strQuery))
{
return false;
}
strQuery = "update sqlite_sequence set seq = 0 where name ='program'";
if (!query.exec(strQuery))
{
return false;
}
return true;
}
IndexDatabase* GetIndexDatabase()
{
static IndexDatabase* indexdb = nullptr;
static bool s_initialed = false;
if (!s_initialed)
{
s_initialed = true;
indexdb = new IndexDatabase("MainQuery");
indexdb->load();
}
return indexdb;
}