exec("pragma journal_mode=wal2;"); $db->exec("pragma synchronous=normal;"); /* TABLE OF CONTENTS ========== I. Cleanup II. Cache Requests III. Cache Updates IV. User Ban/Suspension Lookup V. User Ban/Susppension Management VI. Create Tables If Needed */ /* I. CLEANUP */ function deleteExpired(string $table): void { global $db; $db->exec('delete from '.$table.' where expires <= '.strtotime('now').';'); } /* II. CACHE REQUESTS */ function requestUserCache(string $value, string $field = "handle"): object|bool { global $db; findOrCreateUserTable(); deleteExpired('user_cache'); $result = $db->query("select * from user_cache where ".$field."='".$value."' limit 1;"); $arr = $result->fetchArray(SQLITE3_ASSOC); if (!is_array($arr) || count($arr) === 0) return false; $arr['displayName'] = $arr['display_name']; $arr['pinnedPost'] = $arr['pinned_post']; unset($arr['display_name']); unset($arr['pinned_post']); return (object) $arr; } function requestMinidocCache(string $value): object|bool { global $db; findOrCreateMinidocTable(); deleteExpired('minidoc_cache'); $result = $db->query("select * from minidoc_cache where did='".$value."' limit 1;"); $arr = $result->fetchArray(SQLITE3_ASSOC); if (!is_array($arr) || count($arr) === 0) return false; return (object) $arr; } function requestPlcCache(string $did): object|bool { global $db; findOrCreatePlcTable(); deleteExpired('plc_cache'); $result = $db->query("select * from plc_cache where did='".$did."' limit 1;"); $arr = $result->fetchArray(SQLITE3_ASSOC); if (is_array($arr) && count($arr) > 0) return (object) $arr; return false; } function requestFeedCache(string $atUri): object|bool { global $db; findOrCreateFeedsTable(); deleteExpired('feed_cache'); $result = $db->query("select * from feed_cache where at_uri='".$atUri."' limit 1;"); $arr = $result->fetchArray(SQLITE3_ASSOC); if (is_array($arr) && count($arr) > 0) return (object) $arr; return false; } function requestPostCache(string $rkey): object|bool { global $db; findOrCreatePostTable(); deleteExpired('post_cache'); $result = $db->query("select * from post_cache where rkey='".$rkey."' limit 1;"); $arr = $result->fetchArray(SQLITE3_ASSOC); if (is_array($arr) && count($arr) > 0) { $arr['embedType'] = $arr['embed_type']; $arr['embeds'] = $arr['embed_data']; $arr['createdAt'] = $arr['created_at']; unset($arr['embed_type']); unset($arr['embed_data']); unset($arr['created_at']); return (object) $arr; } return false; } /* III. CACHE UPDATES */ function updateUserCache(string $handle, string $did, ?string $displayName, string $pds, ?string $avatar, ?string $banner, ?string $description, ?string $pinned): void { global $db; findOrCreateUserTable(); $newExpiration = strtotime('now') + 60*60; if (requestUserCache($did, 'did')) { $db->exec("update user_cache set handle='".$handle."', display_name='".SQLite3::escapeString($displayName)."', pds='".$pds."', avatar='".$avatar."', banner='".$banner."', description='".SQLite3::escapeString($description)."', pinned_post='".$pinned."', expires='".$newExpiration."' where did='".$did."';"); } else { $db->exec("insert into user_cache (handle, did, display_name, pds, avatar, banner, description, pinned_post, expires) values ('".$handle."', '".$did."', '".SQLite3::escapeString($displayName)."', '".$pds."', '".$avatar."', '".$banner."', '".SQLite3::escapeString($description)."', '".$pinned."', '".$newExpiration."');"); } } function updateMinidocCache(string $handle, string $did, string $pds, string $signingKey): void { global $db; findOrCreateMinidocTable(); $newExpiration = strtotime('now') + 60*60*48; if (requestMinidocCache($handle)) { $db->exec("update minidoc_cache set handle='".$handle."', did='".$did."', pds='".$pds."', signing_key='".$signingKey."', expires=".$newExpiration.";"); } else { $db->exec("insert into minidoc_cache (handle, did, pds, signing_key, expires) values ('".$handle."', '".$did."', '".$pds."', '".$signingKey."', ".$newExpiration.");"); } } function updatePlcCache(string $did, string $plcdoc): void { global $db; findOrcreatePlcTable(); $newExpiration = strtotime('now') + 60*60*48; if (requestPlcCache($did)) { $db->exec("update plc_cache set plcdoc='".$plcdoc."', expires='".$newExpiration."' where did='".$did."';"); } else { $db->exec("insert into plc_cache (did, plcdoc, expires) values ('".$did."', '".$plcdoc."', '".$newExpiration."');"); } } function updateFeedCache(string $atUri, string $title, ?string $description, ?string $avatar, string $creator_did) { global $db; findOrCreateFeedsTable(); $newExpiration = strtotime('now') + 60*60*4; if (requestFeedCache($atUri)) { $db->exec("update feed_cache set title='".SQLite3::escapeString($title)."', description='".SQLite3::escapeString($description)."', avatar='".$avatar."', creator_did='".$creator_did."', expires='".$newExpiration."' where at_uri='".$atUri."';"); } else { $db->exec("insert into feed_cache (at_uri, title, description, avatar, creator_did, expires) values ('".$atUri."', '".SQLite3::escapeString($title)."', '".SQLite3::escapeString($description)."', '".$avatar."', '".$creator_did."', '".$newExpiration."');"); } } function updatePostCache(string $rkey, string $did, string $text, ?string $embedType, ?string $embedData, string $createdAt): void { global $db; findOrCreatePostTable(); $newExpiration = strtotime('now') + 60*60*48; if (requestPostCache($rkey)) { $db->exec("update post_cache set text='".SQLite3::escapeString($text)."', embed_type='".$embedType."', embed_data='".SQLite3::escapeString($embedData)."', expires='".$newExpiration."', created_at='".$createdAt."' where rkey='".$rkey."';"); } else { $db->exec("insert into post_cache (rkey, did, text, embed_type, embed_data, created_at, expires) values ('".$rkey."', '".$did."', '".SQLite3::escapeString($text)."', '".$embedType."', '".SQLite3::escapeString($embedData)."', '".$createdAt."', '".$newExpiration."');"); } } /* IV. USER BAN/SUSPENSION LOOKUP */ function isUserCensured($did, $pds) { global $db; deleteExpired("client_suspensions"); $ban = $db->query("select count(*) from bans where did='".$did."';"); $pdsban = $db->query("select count(*) from pds_bans where domain='".$domain."';"); $suspension = $db->query("select count(*) from client_suspensions where did='".$did."' and expires > ".strtotime('now').";"); if ($ban > 0 || $pdsban > 0 || $suspension > 0) { return true; } return false; } function getUserCensureInfo($did, $pds) { } /* V. USER BAN/SUSPENSION MANAGEMENT */ /* VI. CREATE TABLES IF NEEDED */ function checkTableExists(string $name):bool { global $db; $check = $db->query("select name from sqlite_master where type='table' and name='".$name."'"); return $check ? true : false; } function findOrCreateBansTable(): void { global $db; $check = checkTableExists('bans'); if (!$check) { $db->exec('CREATE TABLE "bans" ( "did" TEXT NOT NULL UNIQUE, "reason" TEXT, PRIMARY KEY("did") );'); } return; } function findOrCreateSuspensionsTable(): void { global $db; $check = checkTableExists('client_suspensions'); if (!$check) { $db->exec('CREATE TABLE "client_suspensions" ( "id" INTEGER NOT NULL UNIQUE, "did" TEXT NOT NULL, "reason" TEXT, "expires" INTEGER NOT NULL, PRIMARY KEY("id") );'); } return; } function findOrCreateFeedsTable(): void { global $db; $check = checkTableExists('feed_cache'); if (!$check) { $db->exec('CREATE TABLE "feed_cache" ( "at_uri" TEXT NOT NULL UNIQUE, "title" TEXT NOT NULL, "description" TEXT NOT NULL, "avatar" TEXT NOT NULL, "creator_did" TEXT NOT NULL, "expires" INTEGER NOT NULL, PRIMARY KEY("at_uri") );'); } return; } function findOrCreatePdsBans(): void { global $db; $check = checkTableExists('pds_bans'); if (!$check) { $db->exec('CREATE TABLE "pds_bans" ( "domain" TEXT NOT NULL UNIQUE, "reason" TEXT );'); } return; } function findOrCreatePlcTable(): void { global $db; $check = checkTableExists('user_cache'); if (!$check) { $db->exec('CREATE TABLE "plc_cache" ( "did" TEXT NOT NULL UNIQUE, "plcdoc" TEXT NOT NULL, "expires" INTEGER NOT NULL, PRIMARY KEY("did") );'); } return; } function findOrCreatePostTable(): void { global $db; $check = checkTableExists('user_cache'); if (!$check) { $db->exec('CREATE TABLE "post_cache" ( "rkey" TEXT NOT NULL UNIQUE, "did" TEXT NOT NULL, "text" TEXT, "embed_type" TEXT, "embed_data" TEXT, "created_at" TEXT, "expires" INTEGER, PRIMARY KEY("rkey") );'); } } function findOrCreateMinidocTable(): void { global $db; $check = checkTableExists('minidoc_cache'); if (!$check) { $db->exec('CREATE TABLE "minidoc_cache" ( "handle" TEXT NOT NULL UNIQUE, "did" TEXT NOT NULL UNIQUE, "pds" TEXT NOT NULL, "signing_key" NOT NULL, "expires" INTEGER, PRIMARY KEY("handle") );'); } return; } function findOrCreateUserTable(): void { global $db; $check = checkTableExists('post_cache'); if (!$check) { $db->exec('CREATE TABLE "post_cache" ( "rkey" TEXT NOT NULL UNIQUE, "did" TEXT NOT NULL, "text" TEXT, "embed_type" TEXT, "embed_data" TEXT, "expires" INTEGER, PRIMARY KEY("rkey") );'); } return; } ?>