/
database.cpp
493 lines (451 loc) · 16.5 KB
/
database.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
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
#include "database.h"
#include <QFile>
void DataBase::connect()
{
if (!twitterDB.open()) {
twitterDB.open();
}
}
void DataBase::disconnect()
{
if (twitterDB.open()) {
twitterDB.close();
}
}
void DataBase::process()
{
}
bool DataBase::checkUser(QString parameter, userparameters queryType)
{
bool result = false;
connect();
QString queryString;
switch (queryType) {
case BY_ID:
{
queryString = "SELECT userID FROM users WHERE userID=\""+parameter+"\"";
break;
}
case BY_DISPLAY_NAME:
{
queryString = "SELECT userID FROM users WHERE displayName=\""+parameter+"\"";
break;
}
case BY_TWITTER_ID:
{
queryString = "SELECT userID FROM users WHERE twitterID="+parameter;
break;
}
case BY_NAME:
{
queryString = "SELECT userID FROM users WHERE userName=\""+parameter+"\"";
break;
}
}
QSqlQuery checkUserQuery;
checkUserQuery.prepare(queryString);
checkUserQuery.exec();
checkUserQuery.first();
if (checkUserQuery.value(0).toString() =="")
result = false;
else
result = true;
disconnect();
return result;
}
bool DataBase::checkReadableUser(QString userID, QString twitterID)
{
bool result = false;
connect();
QString queryString = "SELECT readableUsers.twitterID FROM readableUsers, users WHERE readableUsers.twitterID=users.twitterID AND readableUsers.userID="+userID+" AND users.twitterID="+twitterID;
QSqlQuery checkReadableUserQuery;
checkReadableUserQuery.prepare(queryString);
checkReadableUserQuery.exec();
checkReadableUserQuery.first();
if (checkReadableUserQuery.value(0).toString() =="")
result = false;
else
result = true;
disconnect();
return result;
}
QString DataBase::getLastID()
{
QString ID;
QSqlQuery getLastIDQuery("SELECT userID FROM users");
ID = getLastIDQuery.lastInsertId().toString();
disconnect();
return ID;
}
void DataBase::updateNewUserData(QString id, Twitter::userData *data )
{
connect();
QSqlQuery updateUserDataQuery;
QString queryString = "UPDATE users SET userName=\""+data->name\
+"\", twitterID="+data->twitterID\
+", desription=\""+data->description \
+"\", tweets="+data->statuses_count \
+", friends="+data->friends_count \
+", followers="+data->followers_count \
+", image=:image" \
+", imageUrl=\""+data->profile_image_url +"\" WHERE userID="+id;
updateUserDataQuery.prepare(queryString);
updateUserDataQuery.addBindValue(data->profile_image_data);
updateUserDataQuery.exec();
updateUserDataQuery.finish();
queryString = "INSERT INTO settings (userID, timelineTweetsByPage," \
"searchTweetsByPage, searchUsersByPage, "\
"tweetsToDatabase, refreshTime) VALUES ("+id+",5,10,5,100,1)";
updateUserDataQuery.prepare(queryString);
updateUserDataQuery.exec();
disconnect();
emit workFinished();
}
void DataBase::addReadableUser(Twitter::userData *data, QString senderID, queryTypes typeQuery)
{
connect();
QSqlQuery updateUserDataQuery;
QString queryString;
if (typeQuery == NEW_USER)
{
queryString = "INSERT INTO users(userName,displayName,twitterID,desription,tweets,friends,followers,image,imageUrl,usertype) VALUES(\""+data->name\
+"\",\""+data->screen_name\
+"\","+data->twitterID\
+", \""+data->description \
+"\", "+data->statuses_count \
+", "+data->friends_count \
+", "+data->followers_count \
+", :image"
+", \""+data->profile_image_url +"\",0)";
updateUserDataQuery.prepare(queryString);
updateUserDataQuery.addBindValue(data->profile_image_data);
updateUserDataQuery.exec();
updateUserDataQuery.finish();
}
queryString = "INSERT INTO readableUsers (userID,twitterID) VALUES("+senderID+","+data->twitterID+")" ;
updateUserDataQuery.prepare(queryString);
updateUserDataQuery.exec();
disconnect();
}
void DataBase::insertTweetsToDatabase(QList<tweets> *dataToInsert)
{
connect();
QSqlQuery insertTweetsToDatabaseQuery;
QString queryString = "";
insertTweetsToDatabaseQuery.prepare("INSERT INTO tweets (tweetID, tweetTime, username, text, userID) "\
" VALUES(:tweetID,:tweetTime,:username,:text,:twitterUserID)" );
QVariantList tweetID,tweetTime,username,text,twitterUserID;
for (int i=0; i< dataToInsert->count();i++)
{
tweetID.append(dataToInsert->at(i).tweetID);
tweetTime.append(dataToInsert->at(i).tweetTime);
username.append(dataToInsert->at(i).username);
text.append(dataToInsert->at(i).text);
twitterUserID.append(dataToInsert->at(i).twitterUserID);
}
insertTweetsToDatabaseQuery.addBindValue(tweetID);
insertTweetsToDatabaseQuery.addBindValue(tweetTime);
insertTweetsToDatabaseQuery.addBindValue(username);
insertTweetsToDatabaseQuery.addBindValue(text);
insertTweetsToDatabaseQuery.addBindValue(twitterUserID);
if(!insertTweetsToDatabaseQuery.execBatch())
qDebug() << insertTweetsToDatabaseQuery.lastError();
twitterDB.commit();
disconnect();
}
QList<Twitter::tweetsData> DataBase::getTimeline(QString maxTweetID, QString userID, int leftLimit, int rightLimit,queryTypes type)
{
QList<Twitter::tweetsData> result;
Twitter::tweetsData queryResult;
QString leftLimitData;
QString appendCondition;
if (maxTweetID != "")
appendCondition = " AND tweets.tweetID >"+maxTweetID;
QString rightLimitData = QString::number(rightLimit);
connect();
QSqlQuery getTimelineQuery;
if (leftLimit==0)
{
leftLimitData="";
}
else
{
leftLimitData=QString::number(leftLimit)+",";
}
QString queryString;
switch (type) {
case BY_ID:
break;
case NEW_USER:
break;
case VIRTUAL_TIMELINE:
{ queryString = "SELECT tweets.tweetTime, tweets.username, tweets.text FROM tweets, users, readableUsers " \
"WHERE tweets.userID=readableUsers.twitterID AND readableUsers.userID = users.userID AND users.userID="+userID +appendCondition \
+" ORDER BY tweets.tweetID DESC LIMIT "+leftLimitData+rightLimitData;
break;
}
case USER_TIMELINE:
{
queryString = "SELECT tweets.tweetTime, tweets.username, tweets.text FROM tweets WHERE tweets.userID="+userID+ appendCondition \
+" ORDER BY tweets.tweetID DESC LIMIT "+leftLimitData+rightLimitData;
break;
}
}
getTimelineQuery.prepare(queryString);
getTimelineQuery.exec();
while (getTimelineQuery.next())
{
queryResult.tweetTime = getTimelineQuery.value(0).toString();
queryResult.username = getTimelineQuery.value(1).toString();
queryResult.text = getTimelineQuery.value(2).toString();
result.append(queryResult);
}
return result;
}
void DataBase::deleteUser(QString twitterID, QString readerID)
{
connect();
QString queryString = "SELECT count() FROM readableUsers WHERE twitterID="+twitterID;
QSqlQuery deleteUserQuery;
deleteUserQuery.prepare(queryString);
deleteUserQuery.exec();
deleteUserQuery.first();
int count = deleteUserQuery.value(0).toInt();
if (count == 1)
{
deleteUserQuery.finish();
queryString = "DELETE FROM tweets WHERE userID="+twitterID;
deleteUserQuery.prepare(queryString);
deleteUserQuery.exec();
deleteUserQuery.finish();
queryString = "DELETE FROM users WHERE usertype=0 AND twitterID="+twitterID;
deleteUserQuery.prepare(queryString);
deleteUserQuery.exec();
}
deleteUserQuery.finish();
queryString = "DELETE FROM readableUsers WHERE twitterID="+twitterID + " AND userID="+readerID;
deleteUserQuery.prepare(queryString);
deleteUserQuery.exec();
deleteUserQuery.finish();
disconnect();
}
int DataBase::countRecordsInTimeLine(QString userID, QString maxTweetID, queryTypes type)
{
int result;
connect();
QString appendCondition;
QString queryString;
if (maxTweetID != "")
appendCondition = " AND tweets.tweetID >"+maxTweetID;
if (type==VIRTUAL_TIMELINE)
queryString = "SELECT count() FROM tweets, users, readableUsers " \
"WHERE tweets.userID=readableUsers.twitterID AND readableUsers.userID = users.userID AND users.userID="+userID+ appendCondition;
else
queryString = "SELECT count() FROM tweets WHERE userID=\""+userID+"\"" + appendCondition;
QSqlQuery countRecordsInTimeLineQuery;
countRecordsInTimeLineQuery.prepare(queryString);
countRecordsInTimeLineQuery.exec();
countRecordsInTimeLineQuery.first();
if (countRecordsInTimeLineQuery.value(0).toString() =="")
result = 0;
else
result = countRecordsInTimeLineQuery.value(0).toInt();
disconnect();
return result;
}
int DataBase::countReadableUsers(QString userID)
{
int result;
connect();
QString queryString = "SELECT count() FROM readableUsers WHERE userID="+userID;
QSqlQuery countReadableUsersQuery;
countReadableUsersQuery.prepare(queryString);
countReadableUsersQuery.exec();
countReadableUsersQuery.first();
if (countReadableUsersQuery.value(0).toString() =="")
result = 0;
else
result = countReadableUsersQuery.value(0).toInt();
disconnect();
return result;
}
void DataBase::updateUserData(QString twitterID, QString parameter, QVariant value)
{
connect();
QSqlQuery updateUserDataQuery;
if (parameter !="image")
{
QString queryString = "UPDATE users SET " + parameter+"=\""+value.toString()+"\" WHERE twitterID="+twitterID;
updateUserDataQuery.prepare(queryString);
}
else
{
QString queryString = "UPDATE users SET image=:image WHERE twitterID="+twitterID;
updateUserDataQuery.prepare(queryString);
updateUserDataQuery.addBindValue(value.toByteArray());
}
updateUserDataQuery.exec();
updateUserDataQuery.finish();
disconnect();
}
QList<Twitter::userData> DataBase::getReadableUsers(QString userID)
{
QList<Twitter::userData> result;
Twitter::userData node;
connect();
QSqlQuery getReadableUsersQuery("SELECT users.userName, users.displayName, users.twitterID, users.image FROM users," \
" readableUsers WHERE users.twitterID = readableUsers.twitterID AND readableUsers.userID="+userID);
while (getReadableUsersQuery.next()) {
node.name = getReadableUsersQuery.value(0).toString();
node.screen_name = getReadableUsersQuery.value(1).toString();
node.twitterID = getReadableUsersQuery.value(2).toString();
node.profile_image_data = getReadableUsersQuery.value(3).toByteArray();
result.append(node);
}
disconnect();
return result;
}
QStringList DataBase::getUsersForSync(QString userID)
{
connect();
QStringList result;
QSqlQuery getUsersForSyncQuery("SELECT twitterID FROM readableUsers WHERE userID="+userID);
while (getUsersForSyncQuery.next()) {
result.append(getUsersForSyncQuery.value(0).toString());
}
disconnect();
return result;
}
QString DataBase::getLastTweetID(QString twitterID)
{
connect();
QString result;
QSqlQuery getLastTweetIDQuery;
QString getLastTweetID;
if (twitterID == "")
getLastTweetID = "SELECT tweetID FROM tweets ORDER BY tweetID DESC LIMIT 1";
else
getLastTweetID = ("SELECT tweetID FROM tweets WHERE userID="+twitterID+" ORDER BY tweetID DESC LIMIT 1");
getLastTweetIDQuery.prepare(getLastTweetID);
getLastTweetIDQuery.exec();
getLastTweetIDQuery.first();
result = getLastTweetIDQuery.value(0).toString();
disconnect();
return result;
}
QStringList DataBase::getUsers()
{
connect();
QStringList result;
QSqlQuery getUsersQuery("SELECT username FROM users WHERE usertype=1");
while (getUsersQuery.next()) {
result.append(getUsersQuery.value(0).toString());
}
result.append("Новый пользователь");
disconnect();
return result;
}
Twitter::userSettings DataBase::getSettings(QString userID)
{
connect();
Twitter::userSettings result;
QSqlQuery getUsersQuery("SELECT * FROM settings WHERE userID="+userID);
while (getUsersQuery.next()) {
result.timelineTweetsByPage = getUsersQuery.value(1).toString();
result.searchTweetsByPage = getUsersQuery.value(2).toString();
result.searchUsersByPage = getUsersQuery.value(3).toString();
result.refreshTime = getUsersQuery.value(5).toString();
}
disconnect();
return result;
}
void DataBase::setSettings(QString userID, QStringList settings)
{
connect();
QSqlQuery setSettingsQuery;
setSettingsQuery.exec("UPDATE settings SET timelineTweetsByPage="+settings.value(0)\
+", searchTweetsByPage="+settings.value(1)\
+", searchUsersByPage="+settings.value(2) \
+ ", refreshTime="+settings.value(3)+" WHERE userID="+userID);
disconnect();
emit workFinished();
}
Twitter::userData DataBase::getData(QString parameter , userparameters type)
{
Twitter::userData result;
connect();
QString queryString;
switch (type) {
case BY_NAME:
{
queryString = "SELECT * FROM users WHERE username='"+parameter+"'";
break;
}
case BY_ID:
{
queryString = "SELECT * FROM users WHERE userID='"+parameter+"'";
break;
}
case BY_DISPLAY_NAME:
{
queryString = "SELECT * FROM users WHERE displayName='"+parameter+"'";
break;
}
case BY_TWITTER_ID:
{
queryString = "SELECT * FROM users WHERE twitterID='"+parameter+"'";
break;
}
}
QSqlQuery getUserParametersQuery(queryString);
while (getUserParametersQuery.next()) {
result.id = getUserParametersQuery.value(0).toString();
result.name = getUserParametersQuery.value(1).toString();
result.twitterID = getUserParametersQuery.value(2).toString();
result.accessTokenKey = getUserParametersQuery.value(3).toString();
result.accessTokenSecret = getUserParametersQuery.value(4).toString();
result.screen_name = getUserParametersQuery.value(5).toString();
result.description = getUserParametersQuery.value(6).toString();
result.profile_image_data = getUserParametersQuery.value(7).toByteArray();
result.profile_image_url = getUserParametersQuery.value(8).toString();
result.statuses_count = getUserParametersQuery.value(9).toString();
result.friends_count = getUserParametersQuery.value(10).toString();
result.followers_count = getUserParametersQuery.value(11).toString();
}
disconnect();
return result;
}
void DataBase::addNewUser(QString accessToken, QString accessTokenSecret, QString displayName)
{
connect();
QSqlQuery addNewUserQuery("INSERT INTO users (accessTokenKey, accessTokenSecret, displayName, usertype) VALUES(\""+accessToken+"\",\""+accessTokenSecret+"\",\""+displayName+"\",1)");
addNewUserQuery.finish();
emit userAdded();
}
DataBase::DataBase()
{
twitter = Twitter::getcls();
twitterDB = twitter->getDatabase();
if (!twitter->getDatabaseStatus())
{
createDatabase();
}
}
void DataBase::createDatabase()
{
connect();
QSqlQuery createQuery;
createQuery.exec("CREATE TABLE readableUsers (userID INTEGER, twitterID INTEGER)");
createQuery.finish();
twitterDB.commit();
createQuery.exec("CREATE TABLE users (userID INTEGER UNIQUE PRIMARY KEY AUTOINCREMENT, userName VARCHAR (255), twitterID INTEGER, accessTokenKey VARCHAR (255), accessTokenSecret VARCHAR (255), displayName VARCHAR (150), desription VARCHAR (255), image BLOB, imageUrl VARCHAR (255), tweets INTEGER, friends INTEGER, followers INTEGER, usertype INT)");
createQuery.finish();
twitterDB.commit();
createQuery.exec("CREATE TABLE settings (userID INTEGER, timelineTweetsByPage INTEGER, searchTweetsByPage INTEGER, searchUsersByPage INTEGER, searchTweetsToDatabase INTEGER, refreshTime INTEGER)");
createQuery.finish();
twitterDB.commit();
createQuery.exec("CREATE TABLE tweets (tweetID INTEGER, tweetTime VARCHAR (100), username VARCHAR (255), text VARCHAR (255), userID INTEGER DEFAULT (0))");
createQuery.finish();
twitterDB.commit();
disconnect();
}