Compare commits
	
		
			5 Commits
		
	
	
		
			38d746b310
			...
			67d458bd38
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 67d458bd38 | |||
| d9684c7d62 | |||
| 5a818d2119 | |||
| 6f96d4ce65 | |||
| f72395756a | 
| @@ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
| 	"type": "tildefriends-app", | 	"type": "tildefriends-app", | ||||||
| 	"emoji": "🦀", | 	"emoji": "🦀", | ||||||
| 	"previous": "&YZCzXrfB6j+y0sXF4KspAibwjLsSCaMoB5rdO3mQl+Q=.sha256" | 	"previous": "&h9uzh3gVWy1KWIu6wFYCrBZkVmnQAi7QLAj5iIXffFM=.sha256" | ||||||
| } | } | ||||||
|   | |||||||
| @@ -175,63 +175,98 @@ class TfElement extends LitElement { | |||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		let abouts = await tfrpc.rpc.query( | 		const k_chunk_size = 1024; | ||||||
| 			` | 		let min_row_id = 0; | ||||||
| 				SELECT | 		console.log( | ||||||
| 					messages.author, json(messages.content) AS content, messages.sequence | 			'loading about for', | ||||||
| 				FROM | 			ids.length, | ||||||
| 					messages, | 			'accounts', | ||||||
| 					json_each(?1) AS following | 			cache.last_row_id, | ||||||
| 				WHERE | 			'=>', | ||||||
| 					messages.author = following.value AND | 			max_row_id | ||||||
| 					messages.content ->> 'type' = 'about' AND |  | ||||||
| 					messages.rowid > ?3 AND |  | ||||||
| 					messages.rowid <= ?4 |  | ||||||
| 				UNION |  | ||||||
| 				SELECT |  | ||||||
| 					messages.author, json(messages.content) AS content, messages.sequence |  | ||||||
| 				FROM |  | ||||||
| 					messages, |  | ||||||
| 					json_each(?2) AS following |  | ||||||
| 				WHERE |  | ||||||
| 					messages.author = following.value AND |  | ||||||
| 					messages.content ->> 'type' = 'about' AND |  | ||||||
| 					messages.rowid <= ?4 |  | ||||||
| 				ORDER BY messages.author, messages.sequence |  | ||||||
| 			`, |  | ||||||
| 			[ |  | ||||||
| 				JSON.stringify(ids.filter((id) => cache.about[id])), |  | ||||||
| 				JSON.stringify(ids.filter((id) => !cache.about[id])), |  | ||||||
| 				cache.last_row_id, |  | ||||||
| 				max_row_id, |  | ||||||
| 			] |  | ||||||
| 		); | 		); | ||||||
| 		for (let about of abouts) { | 		try { | ||||||
| 			let content = JSON.parse(about.content); | 			while (true) { | ||||||
| 			if (content.about === about.author) { | 				let abouts = await tfrpc.rpc.query( | ||||||
| 				delete content.type; | 					` | ||||||
| 				delete content.about; | 						SELECT * FROM ( | ||||||
| 				cache.about[about.author] = Object.assign( | 							SELECT | ||||||
| 					cache.about[about.author] || {}, | 								messages.rowid AS rowid, messages.author, json(messages.content) AS content, messages.sequence | ||||||
| 					content | 							FROM | ||||||
|  | 								messages, | ||||||
|  | 								json_each(?1) AS following | ||||||
|  | 							WHERE | ||||||
|  | 								messages.author = following.value AND | ||||||
|  | 								messages.content ->> 'type' = 'about' AND | ||||||
|  | 								messages.rowid > ?3 AND | ||||||
|  | 								messages.rowid <= ?4 | ||||||
|  | 							UNION | ||||||
|  | 							SELECT | ||||||
|  | 								messages.rowid AS rowid, messages.author, json(messages.content) AS content, messages.sequence | ||||||
|  | 							FROM | ||||||
|  | 								messages, | ||||||
|  | 								json_each(?2) AS following | ||||||
|  | 							WHERE | ||||||
|  | 								messages.author = following.value AND | ||||||
|  | 								messages.content ->> 'type' = 'about' AND | ||||||
|  | 								messages.rowid > ?6 AND | ||||||
|  | 								messages.rowid <= ?4 | ||||||
|  | 						) | ||||||
|  | 						ORDER BY rowid LIMIT ?5 | ||||||
|  | 					`, | ||||||
|  | 					[ | ||||||
|  | 						JSON.stringify(ids.filter((id) => cache.about[id])), | ||||||
|  | 						JSON.stringify(ids.filter((id) => !cache.about[id])), | ||||||
|  | 						cache.last_row_id, | ||||||
|  | 						max_row_id, | ||||||
|  | 						k_chunk_size, | ||||||
|  | 						min_row_id, | ||||||
|  | 					] | ||||||
| 				); | 				); | ||||||
|  | 				let max_seen; | ||||||
|  | 				for (let about of abouts) { | ||||||
|  | 					let content = JSON.parse(about.content); | ||||||
|  | 					if (content.about === about.author) { | ||||||
|  | 						delete content.type; | ||||||
|  | 						delete content.about; | ||||||
|  | 						cache.about[about.author] = Object.assign( | ||||||
|  | 							cache.about[about.author] || {}, | ||||||
|  | 							content | ||||||
|  | 						); | ||||||
|  | 					} | ||||||
|  | 					max_seen = about.rowid; | ||||||
|  | 				} | ||||||
|  | 				console.log( | ||||||
|  | 					'cache =', | ||||||
|  | 					cache.last_row_id, | ||||||
|  | 					'seen =', | ||||||
|  | 					max_seen, | ||||||
|  | 					'max =', | ||||||
|  | 					max_row_id | ||||||
|  | 				); | ||||||
|  | 				cache.last_row_id = Math.max(cache.last_row_id, max_seen ?? max_row_id); | ||||||
|  | 				min_row_id = Math.max(min_row_id, max_seen ?? max_row_id); | ||||||
|  | 				let new_cache = JSON.stringify(cache); | ||||||
|  | 				if (new_cache !== original_cache) { | ||||||
|  | 					let start_time = new Date(); | ||||||
|  | 					tfrpc.rpc.databaseSet('about', new_cache).then(function () { | ||||||
|  | 						console.log('saving about took', (new Date() - start_time) / 1000); | ||||||
|  | 					}); | ||||||
|  | 				} | ||||||
|  | 				users = users || {}; | ||||||
|  | 				for (let id of Object.keys(cache.about)) { | ||||||
|  | 					users[id] = Object.assign( | ||||||
|  | 						{follow_depth: following[id]?.d}, | ||||||
|  | 						users[id] || {}, | ||||||
|  | 						cache.about[id] | ||||||
|  | 					); | ||||||
|  | 				} | ||||||
|  | 				if (cache.last_row_id >= max_row_id) { | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} catch (e) { | ||||||
| 		cache.last_row_id = max_row_id; | 			console.log(e); | ||||||
| 		let new_cache = JSON.stringify(cache); |  | ||||||
| 		if (new_cache !== original_cache) { |  | ||||||
| 			let start_time = new Date(); |  | ||||||
| 			tfrpc.rpc.databaseSet('about', new_cache).then(function () { |  | ||||||
| 				console.log('saving about took', (new Date() - start_time) / 1000); |  | ||||||
| 			}); |  | ||||||
| 		} |  | ||||||
| 		users = users || {}; |  | ||||||
| 		for (let id of Object.keys(cache.about)) { |  | ||||||
| 			users[id] = Object.assign( |  | ||||||
| 				{follow_depth: following[id]?.d}, |  | ||||||
| 				users[id] || {}, |  | ||||||
| 				cache.about[id] |  | ||||||
| 			); |  | ||||||
| 		} | 		} | ||||||
| 		return Object.assign({}, users); | 		return Object.assign({}, users); | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -431,12 +431,17 @@ class TfMessageElement extends LitElement { | |||||||
| 					> | 					> | ||||||
| 						Copy ID | 						Copy ID | ||||||
| 					</button> | 					</button> | ||||||
| 					${this.drafts[this.message?.id] === undefined ? html` | 					${this.drafts[this.message?.id] === undefined | ||||||
| 						<button class="w3-button w3-bar-item" @click=${this.show_reply}> | 						? html` | ||||||
| 							⮢ Reply | 								<button class="w3-button w3-bar-item" @click=${this.show_reply}> | ||||||
| 						</button> | 									⮢ Reply | ||||||
| 					` : undefined} | 								</button> | ||||||
| 					<button class="w3-button w3-bar-item w3-border-bottom" @click=${this.react}> | 							` | ||||||
|  | 						: undefined} | ||||||
|  | 					<button | ||||||
|  | 						class="w3-button w3-bar-item w3-border-bottom" | ||||||
|  | 						@click=${this.react} | ||||||
|  | 					> | ||||||
| 						👍 React | 						👍 React | ||||||
| 					</button> | 					</button> | ||||||
| 					${formats.map( | 					${formats.map( | ||||||
| @@ -541,8 +546,7 @@ class TfMessageElement extends LitElement { | |||||||
| 				: undefined; | 				: undefined; | ||||||
| 		return html` | 		return html` | ||||||
| 			<div class="w3-section w3-container"> | 			<div class="w3-section w3-container"> | ||||||
| 				${reply} | 				${reply} ${this.render_children()} | ||||||
| 				${this.render_children()} |  | ||||||
| 			</div> | 			</div> | ||||||
| 		`; | 		`; | ||||||
| 	} | 	} | ||||||
|   | |||||||
| @@ -81,16 +81,22 @@ class TfTabNewsFeedElement extends LitElement { | |||||||
| 			`, | 			`, | ||||||
| 			[JSON.stringify(combined.map((x) => x.id))] | 			[JSON.stringify(combined.map((x) => x.id))] | ||||||
| 		); | 		); | ||||||
| 		return [].concat(combined, await tfrpc.rpc.query( | 		return [].concat( | ||||||
| 			` | 			combined, | ||||||
|  | 			await tfrpc.rpc.query( | ||||||
|  | 				` | ||||||
| 				SELECT FALSE AS is_primary, messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature | 				SELECT FALSE AS is_primary, messages.rowid, messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature | ||||||
| 				FROM messages | 				FROM messages | ||||||
| 				JOIN json_each(?2) refs ON messages.id = refs.value | 				JOIN json_each(?2) refs ON messages.id = refs.value | ||||||
| 				JOIN json_each(?1) AS following ON messages.author = following.value | 				JOIN json_each(?1) AS following ON messages.author = following.value | ||||||
| 				WHERE messages.content ->> 'type' = 'vote' | 				WHERE messages.content ->> 'type' = 'vote' | ||||||
| 			`, | 			`, | ||||||
| 			[JSON.stringify(this.following), JSON.stringify(refs2.map((x) => x.ref))] | 				[ | ||||||
| 		)); | 					JSON.stringify(this.following), | ||||||
|  | 					JSON.stringify(refs2.map((x) => x.ref)), | ||||||
|  | 				] | ||||||
|  | 			) | ||||||
|  | 		); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	async fetch_messages(start_time, end_time) { | 	async fetch_messages(start_time, end_time) { | ||||||
| @@ -253,7 +259,11 @@ class TfTabNewsFeedElement extends LitElement { | |||||||
| 		try { | 		try { | ||||||
| 			let more = []; | 			let more = []; | ||||||
| 			let last_start_time = this.time_range[0]; | 			let last_start_time = this.time_range[0]; | ||||||
| 			more = await this.fetch_messages(null, last_start_time); | 			try { | ||||||
|  | 				more = await this.fetch_messages(null, last_start_time); | ||||||
|  | 			} catch (e) { | ||||||
|  | 				console.log(e); | ||||||
|  | 			} | ||||||
| 			this.update_time_range_from_messages( | 			this.update_time_range_from_messages( | ||||||
| 				more.filter((x) => x.timestamp < last_start_time) | 				more.filter((x) => x.timestamp < last_start_time) | ||||||
| 			); | 			); | ||||||
|   | |||||||
| @@ -1594,27 +1594,20 @@ static void _tf_ssb_rpc_delete_feeds_work(tf_ssb_t* ssb, void* user_data) | |||||||
| 	db = tf_ssb_acquire_db_writer(ssb); | 	db = tf_ssb_acquire_db_writer(ssb); | ||||||
| 	sqlite3_stmt* statement; | 	sqlite3_stmt* statement; | ||||||
| 	if (sqlite3_prepare(db, | 	if (sqlite3_prepare(db, | ||||||
| 			"DELETE FROM messages WHERE author IN (" | 			"DELETE FROM messages WHERE id IN (" | ||||||
| 			"  SELECT author FROM messages WHERE author NOT IN (SELECT value FROM json_each(?)) GROUP BY author LIMIT 1" | 			"  SELECT id FROM messages WHERE author NOT IN (SELECT value FROM json_each(?)) ORDER BY rowid DESC LIMIT 1024" | ||||||
| 			") RETURNING author", | 			")", | ||||||
| 			-1, &statement, NULL) == SQLITE_OK) | 			-1, &statement, NULL) == SQLITE_OK) | ||||||
| 	{ | 	{ | ||||||
| 		int status = SQLITE_OK; |  | ||||||
| 		bool printed = false; |  | ||||||
| 		if (sqlite3_bind_text(statement, 1, arg, -1, NULL) == SQLITE_OK) | 		if (sqlite3_bind_text(statement, 1, arg, -1, NULL) == SQLITE_OK) | ||||||
| 		{ | 		{ | ||||||
| 			while ((status = sqlite3_step(statement)) == SQLITE_ROW) | 			if (sqlite3_step(statement) != SQLITE_DONE) | ||||||
| 			{ | 			{ | ||||||
| 				if (!printed) | 				tf_printf("deleting messages: %s\n", sqlite3_errmsg(db)); | ||||||
| 				{ |  | ||||||
| 					tf_printf("deleting %s\n", sqlite3_column_text(statement, 0)); |  | ||||||
| 					printed = true; |  | ||||||
| 					delete->deleted++; |  | ||||||
| 				} |  | ||||||
| 			} | 			} | ||||||
| 			if (status != SQLITE_DONE) | 			else | ||||||
| 			{ | 			{ | ||||||
| 				tf_printf("deleting feeds: %s\n", sqlite3_errmsg(db)); | 				delete->deleted += sqlite3_changes(db); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 		sqlite3_finalize(statement); | 		sqlite3_finalize(statement); | ||||||
| @@ -1627,7 +1620,7 @@ static void _tf_ssb_rpc_delete_feeds_work(tf_ssb_t* ssb, void* user_data) | |||||||
| 	JS_FreeRuntime(runtime); | 	JS_FreeRuntime(runtime); | ||||||
|  |  | ||||||
| 	delete->duration_ms = (uv_hrtime() - start_ns) / 1000000LL; | 	delete->duration_ms = (uv_hrtime() - start_ns) / 1000000LL; | ||||||
| 	tf_printf("Deleted %d feeds in %d ms.\n", delete->deleted, (int)delete->duration_ms); | 	tf_printf("Deleted %d message in %d ms.\n", delete->deleted, (int)delete->duration_ms); | ||||||
| 	_tf_ssb_rpc_checkpoint(ssb); | 	_tf_ssb_rpc_checkpoint(ssb); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user