Lots of SQLite fixes

This commit is contained in:
Natsumi
2021-07-07 21:27:27 +12:00
parent ad9b367b1c
commit 12065de305
3 changed files with 141 additions and 87 deletions
+76 -79
View File
@@ -1755,21 +1755,6 @@ speechSynthesis.getVoices();
// API: Friend // API: Friend
API.friends200 = new Set();
API.friends404 = new Map();
API.isFriendsLoading = false;
API.$on('LOGIN', function () {
this.friends200.clear();
this.friends404.clear();
this.isFriendsLoading = false;
});
API.$on('USER', function (args) {
this.friends200.add(args.ref.id);
this.friends404.delete(args.ref.id);
});
API.$on('FRIEND:LIST', function (args) { API.$on('FRIEND:LIST', function (args) {
for (var json of args.json) { for (var json of args.json) {
this.$emit('USER', { this.$emit('USER', {
@@ -1781,65 +1766,45 @@ speechSynthesis.getVoices();
} }
}); });
API.isAllFriendsRetrived = function (flag) { API.refreshFriends = async function () {
if (flag) { var onlineFriends = await this.refreshOnlineFriends();
for (var id of this.currentUser.friends) { var offlineFriends = await this.refreshOfflineFriends();
if (this.friends200.has(id) === false) { return onlineFriends.concat(offlineFriends);
var n = this.friends404.get(id) || 0;
if (n < 2) {
this.friends404.set(id, n + 1);
}
}
}
} else {
for (var id of this.currentUser.friends) {
if (this.friends200.has(id) === false ||
this.friends404.get(id) < 2) {
return false;
}
}
}
return true;
}; };
API.refreshFriends = function () { API.refreshOnlineFriends = async function () {
var friends = [];
var params = { var params = {
n: 50, n: 50,
offset: 0, offset: 0,
offline: false offline: false
}; };
var N = this.currentUser.onlineFriends.length; var N = this.currentUser.onlineFriends.length + this.currentUser.activeFriends.length;
if (N === 0) { var count = Math.trunc(N / 50);
N = this.currentUser.friends.length; for (var i = count; i > -1; i--) {
if (N === 0 || var args = await this.getFriends(params);
this.isAllFriendsRetrived(false)) { friends = friends.concat(args.json);
return; params.offset += 50;
} }
params.offline = true; return friends;
};
API.refreshOfflineFriends = async function () {
var friends = [];
var params = {
n: 50,
offset: 0,
offline: true
};
var onlineCount = this.currentUser.onlineFriends.length + this.currentUser.activeFriends.length;
var N = this.currentUser.friends.length - onlineCount;
var count = Math.trunc(N / 50);
for (var i = count; i > -1; i--) {
var args = await this.getFriends(params);
friends = friends.concat(args.json);
params.offset += 50;
} }
if (this.isFriendsLoading) { return friends;
return;
}
this.isFriendsLoading = true;
this.bulk({
fn: 'getFriends',
N,
params,
done(ok, options) {
if (this.isAllFriendsRetrived(params.offline)) {
this.isFriendsLoading = false;
return;
}
var { length } = this.currentUser.friends;
options.N = length - params.offset;
if (options.N <= 0) {
options.N = length;
}
params.offset = 0;
params.offline = true;
this.bulk(options);
}
});
}; };
/* /*
@@ -5284,18 +5249,20 @@ speechSynthesis.getVoices();
} }
}; };
$app.methods.migrateMemos = function () { $app.methods.migrateMemos = async function () {
var json = JSON.parse(VRCXStorage.GetAll()); var json = JSON.parse(VRCXStorage.GetAll());
database.begin();
for (var line in json) { for (var line in json) {
if (line.substring(0, 8) === 'memo_usr') { if (line.substring(0, 8) === 'memo_usr') {
var userId = line.substring(5); var userId = line.substring(5);
var memo = json[line]; var memo = json[line];
if (memo) { if (memo) {
this.saveMemo(userId, memo); await this.saveMemo(userId, memo);
VRCXStorage.Remove(`memo_${userId}`); VRCXStorage.Remove(`memo_${userId}`);
} }
} }
} }
database.commit();
}; };
$app.methods.loadMemo = async function (userId) { $app.methods.loadMemo = async function (userId) {
@@ -6134,17 +6101,21 @@ speechSynthesis.getVoices();
} }
API.$on('LOGIN', async function (args) { API.$on('LOGIN', async function (args) {
$app.friendLogInitStatus = false;
await database.init(args.json.id); await database.init(args.json.id);
$app.feedTable.data = await database.getFeedDatabase(); $app.feedTable.data = await database.getFeedDatabase();
$app.sweepFeed(); $app.sweepFeed();
//remove old data from json file and migrate them to SQLite if (configRepository.getBool(`friendLogInit_${args.json.id}`)) {
VRCXStorage.Remove(`${args.json.id}_feedTable`); $app.getFriendLog();
$app.migrateMemos();
if (VRCXStorage.Get(`${args.json.id}_friendLogUpdatedAt`)) {
$app.migrateFriendLog(args.json.id);
} else { } else {
$app.initFriendLog(); $app.initFriendLog();
} }
//remove old data from json file and migrate them to SQLite
if (VRCXStorage.Get(`${args.json.id}_friendLogUpdatedAt`)) {
VRCXStorage.Remove(`${args.json.id}_feedTable`);
$app.migrateMemos();
$app.migrateFriendLog(args.json.id);
}
}); });
API.$on('USER:UPDATE', async function (args) { API.$on('USER:UPDATE', async function (args) {
@@ -7116,9 +7087,36 @@ speechSynthesis.getVoices();
$app.data.friendLogInitStatus = false; $app.data.friendLogInitStatus = false;
$app.methods.initFriendLog = async function () {
if (this.friendLogInitStatus) {
return;
}
if (configRepository.getBool(`friendLogInit_${API.currentUser.id}`)) {
this.friendLogInitStatus = true;
return;
}
var sqlValues = [];
var friends = await API.refreshFriends();
for (var friend of friends) {
var ref = API.applyUser(friend);
var row = {
userId: ref.id,
displayName: ref.displayName,
trustLevel: ref.$trustLevel
};
this.friendLog.set(friend.id, row);
sqlValues.unshift(row);
}
database.setFriendLogCurrentArray(sqlValues);
configRepository.setBool(`friendLogInit_${API.currentUser.id}`, true);
this.friendLogInitStatus = true;
};
$app.methods.migrateFriendLog = function (userId) { $app.methods.migrateFriendLog = function (userId) {
VRCXStorage.Remove(`${userId}_friendLogUpdatedAt`);
this.friendLog = new Map(); this.friendLog = new Map();
var oldFriendLog = VRCXStorage.GetObject(`${userId}_friendLog`); var oldFriendLog = VRCXStorage.GetObject(`${userId}_friendLog`);
var friendLogCurrentValues = [];
for (var i in oldFriendLog) { for (var i in oldFriendLog) {
var friend = oldFriendLog[i]; var friend = oldFriendLog[i];
var row = { var row = {
@@ -7127,19 +7125,18 @@ speechSynthesis.getVoices();
trustLevel: friend.trustLevel trustLevel: friend.trustLevel
}; };
this.friendLog.set(friend.id, row); this.friendLog.set(friend.id, row);
database.setFriendLogCurrent(row); friendLogCurrentValues.unshift(row);
} }
database.setFriendLogCurrentArray(friendLogCurrentValues);
VRCXStorage.Remove(`${userId}_friendLog`); VRCXStorage.Remove(`${userId}_friendLog`);
this.friendLogTable.data = VRCXStorage.GetArray(`${userId}_friendLogTable`); this.friendLogTable.data = VRCXStorage.GetArray(`${userId}_friendLogTable`);
for (var line of this.friendLogTable.data) { database.addFriendLogHistoryArray(this.friendLogTable.data);
database.addFriendLogHistory(line);
}
VRCXStorage.Remove(`${userId}_friendLogTable`); VRCXStorage.Remove(`${userId}_friendLogTable`);
VRCXStorage.Remove(`${userId}_friendLogUpdatedAt`); configRepository.setBool(`friendLogInit_${API.currentUser.id}`, true);
this.friendLogInitStatus = true; this.friendLogInitStatus = true;
}; };
$app.methods.initFriendLog = async function () { $app.methods.getFriendLog = async function () {
this.friendLog = new Map(); this.friendLog = new Map();
var friendLogCurrentArray = await database.getFriendLogCurrent(); var friendLogCurrentArray = await database.getFriendLogCurrent();
for (var friend of friendLogCurrentArray) { for (var friend of friendLogCurrentArray) {
@@ -7239,6 +7236,7 @@ speechSynthesis.getVoices();
}; };
this.friendLogTable.data.push(friendLogHistory); this.friendLogTable.data.push(friendLogHistory);
database.addFriendLogHistory(friendLogHistory); database.addFriendLogHistory(friendLogHistory);
}
var friendLogCurrent = { var friendLogCurrent = {
userId: ref.id, userId: ref.id,
displayName: ref.displayName, displayName: ref.displayName,
@@ -7246,7 +7244,6 @@ speechSynthesis.getVoices();
}; };
this.friendLog.set(ref.id, friendLogCurrent); this.friendLog.set(ref.id, friendLogCurrent);
database.setFriendLogCurrent(friendLogCurrent); database.setFriendLogCurrent(friendLogCurrent);
}
ctx.displayName = ref.displayName; ctx.displayName = ref.displayName;
this.notifyMenu('friendLog'); this.notifyMenu('friendLog');
} }
+57
View File
@@ -103,6 +103,14 @@ class Database {
return feedDatabase; return feedDatabase;
} }
begin() {
sqliteService.executeNonQuery('BEGIN');
}
commit() {
sqliteService.executeNonQuery('COMMIT');
}
async getMemo(userId) { async getMemo(userId) {
var row = {}; var row = {};
await sqliteService.execute((dbRow, userId) => { await sqliteService.execute((dbRow, userId) => {
@@ -159,6 +167,25 @@ class Database {
); );
} }
setFriendLogCurrentArray(inputData) {
var sqlValues = '';
var items = ['userId', 'displayName', 'trustLevel'];
for (var line of inputData) {
for (var item of items) {
if (typeof line[item] !== 'undefined') {
line[item] = line[item].replace(/'/g, "\''");
} else {
line[item] = '';
}
}
sqlValues += `('${line.userId}', '${line.displayName}', '${line.trustLevel}'), `;
}
sqlValues = sqlValues.slice(0, -2);
sqliteService.executeNonQuery(
`INSERT OR REPLACE INTO ${Database.userId}_friend_log_current (user_id, display_name, trust_level) VALUES ${sqlValues}`
);
}
deleteFriendLogCurrent(userId) { deleteFriendLogCurrent(userId) {
sqliteService.executeNonQuery( sqliteService.executeNonQuery(
`DELETE FROM ${Database.userId}_friend_log_current WHERE user_id = @user_id`, `DELETE FROM ${Database.userId}_friend_log_current WHERE user_id = @user_id`,
@@ -204,6 +231,36 @@ class Database {
); );
} }
addFriendLogHistoryArray(inputData) {
var sqlValues = '';
var items = ['created_at', 'type', 'userId', 'displayName', 'previousDisplayName', 'trustLevel', 'previousTrustLevel'];
for (var i = 0; i < inputData.length; ++i) {
var line = inputData[i];
sqlValues += '(';
for (var k = 0; k < items.length; ++k) {
var item = items[k];
var field = '';
if (typeof line[item] !== 'undefined') {
field = `'${line[item].replace(/'/g, "\''")}'`;
} else {
field = null;
}
sqlValues += field;
if (k < items.length - 1) {
sqlValues += ', ';
}
}
sqlValues += ')';
if (i < inputData.length - 1) {
sqlValues += ', ';
}
//sqlValues `('${line.created_at}', '${line.type}', '${line.userId}', '${line.displayName}', '${line.previousDisplayName}', '${line.trustLevel}', '${line.previousTrustLevel}'), `
}
sqliteService.executeNonQuery(
`INSERT OR IGNORE INTO ${Database.userId}_friend_log_history (created_at, type, user_id, display_name, previous_display_name, trust_level, previous_trust_level) VALUES ${sqlValues}`
);
}
deleteFriendLogHistory(rowId) { deleteFriendLogHistory(rowId) {
sqliteService.executeNonQuery( sqliteService.executeNonQuery(
`DELETE FROM ${Database.userId}_friend_log_history WHERE id = @row_id`, `DELETE FROM ${Database.userId}_friend_log_history WHERE id = @row_id`,
+2 -2
View File
@@ -62,7 +62,7 @@ html
.detail .detail
span.extra span.extra
span.time {{ feed.created_at | formatDate('HH:MI') }} span.time {{ feed.created_at | formatDate('HH:MI') }}
| 📨 #[span.name(v-text="feed.senderUsername")] #[location(:location="feed.details.worldId")] #[span(v-text="feed.details.inviteMessage")] | 📨 #[span.name(v-text="feed.senderUsername")] #[location(:location="feed.details.worldId" :hint="feed.details.worldName")] #[span(v-text="feed.details.inviteMessage")]
div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail .detail
span.extra span.extra
@@ -184,7 +184,7 @@ html
.detail .detail
span.extra span.extra
span.time {{ feed.created_at | formatDate('HH:MI') }} span.time {{ feed.created_at | formatDate('HH:MI') }}
| #[span.name(v-text="feed.senderUsername")] has invited you to #[location(:location="feed.details.worldId")] #[span(v-text="feed.details.inviteMessage")] | #[span.name(v-text="feed.senderUsername")] has invited you to #[location(:location="feed.details.worldId" :hint="feed.details.worldName")] #[span(v-text="feed.details.inviteMessage")]
div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }") div(v-else-if="feed.type === 'requestInvite'" class="x-friend-item" :class="{ friend: feed.isFriend, favorite: feed.isFavorite }")
.detail .detail
span.extra span.extra