Π’ SQLite Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° WASM для использования Π‘Π£Π‘Π” Π² web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ SQLite Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ возмоТности компиляции Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ WebAssembly, способный Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ Π² web-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΉ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π‘Π” ΠΈΠ· web-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° языкС JavaScript. Код для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ WebAssembly Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Π² основной Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ API WebSQL, Π² основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π»Π΅ΠΆΠΈΡ‚ SQLite, WASM SQLite ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½ ΠΎΡ‚ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° ΠΈ Π½Π΅ влияСт Π½Π° Π΅Π³ΠΎ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ (Google Ρ€Π΅ΡˆΠΈΠ» ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ WebSQL Π² Chrome послС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… уязвимостСй Π² SQLite, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΊΡΠΏΠ»ΡƒΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· WebSQL для Π°Ρ‚Π°ΠΊΠΈ Π½Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€).

ЦСлью ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° являСтся прСдоставлСниС Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ JavaScript-обвязки, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΠΉ ΠΏΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ с API SQLite. Web-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ прСдоставляСтся высокоуровнСвый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ интСрфСйс для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ Π² стилС sql.js ΠΈΠ»ΠΈ Node.js, обвязка Π½Π°Π΄ Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ C API ΠΈ API Π½Π° Π±Π°Π·Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Web Worker, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ асинхронныС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, выполняСмыС Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…. Для скрытия тонкостСй ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌΠΈ ΠΏΠΎΠ²Π΅Ρ€Ρ… API Π½Π° Π±Π°Π·Π΅ Web Worker Ρ‚Π°ΠΊΠΆΠ΅ развиваСтся Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ интСрфСйса Π½Π° основС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Promise.

Π”Π°Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ web-прилоТСния ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ Π² WASM-вСрсии SQLite, ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ сСанса (Ρ‚Π΅Ρ€ΡΡŽΡ‚ΡΡ послС ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страниц) ΠΈΠ»ΠΈ сохранСны Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ сСансами). Для постоянного хранСния ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Ρ‹ бэкСнды для размСщСния Π΄Π°Π½Π½Ρ‹Ρ… Π² локальной Π€Π‘ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ OPFS (Origin-Private FileSystem, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΊ API File System Access, доступноС ΠΏΠΎΠΊΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°Ρ… Π½Π° основС WebKit ΠΈ Chromium) ΠΈ Π² Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π½Ρ‹Ρ… Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°Ρ… Π½Π° Π±Π°Π·Π΅ API window.localStorage ΠΈ window.sessionStorage. Π’ случаС примСнСния localStorage/sessionStorage Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ ΠΊΠ»ΡŽΡ‡/Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° ΠΏΡ€ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ OPFS прСдусмотрСно Π΄Π²Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π°: симуляция Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Π€Π‘ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ WASMFS ΠΈ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ рСализация sqlite3_vfs, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰Π°Ρ слой SQLite VFS Π½Π° Π±Π°Π·Π΅ OPFS.

Для сборки SQLite Π² WASM-прСдставлСниС задСйствован компилятор Emscripten (достаточно ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ext/wasm: «./configure —enable-all; make sqlite3.c; cd ext/wasm; make»). На Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ„Π°ΠΉΠ»Ρ‹ sqlite3.js ΠΈ sqlite3.wasm, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π² свой JavaScript-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ (ΠΏΡ€ΠΈΠΌΠ΅Ρ€ HTML ΠΈ JavaScript).

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru