SQLite
Simpan data di file lokal dengan SQLite, sinkron atau asinkron.
SQLite tidak butuh server: database adalah sebuah file. Ideal untuk server kecil dan menengah.
Buka dan buat
knight
let DB = 0;
system::start() {
DB = sqlite_open("data/server.db");
sqlite_exec(DB, "CREATE TABLE IF NOT EXISTS accounts (name TEXT PRIMARY KEY, hash TEXT, score INTEGER DEFAULT 0)");
};
Query sinkron
knight
// Mengembalikan indeks hasil, atau null bila error.
let r = sqlite_query(DB, "SELECT score FROM accounts WHERE name = ?", PlayerName(playerid));
if (r != null) {
let score = cache_get_value_name_int(r, 0, "score");
}
// Mengembalikan null bila sukses, atau string error.
let err = sqlite_exec(DB, "INSERT OR REPLACE INTO accounts (name, score) VALUES (?, ?)", PlayerName(playerid), 10);
Warning
Query sinkron berjalan di tick loop. Query lambat menahan semua pemain. Gunakan bentuk asinkron untuk apa pun yang mungkin lambat.
Query asinkron
knight
function onLoaded(result, err) {
if (err != "") { Log("error: " + err); return; }
Log("baris = " + str(cache_get_row_count(result)));
}
player::command("/load") {
sqlite_query_async(DB, "onLoaded", "SELECT * FROM accounts");
};
Path
Path relatif terhadap direktori kerja server. Gunakan path absolut atau buat foldernya lebih dulu.
Backup
- File SQLite bisa disalin saat server berjalan jika Anda memakai
VACUUM INTO 'backup.db'. - Password di-hash dengan
hash_password/verify_password(bcrypt). - Jangan pernah menyimpan password plaintext.