הוצאה משימוש והסרה של Web SQL

Web SQL Database API, שמאפשר לאחסן נתונים באופן מובנה במחשב של המשתמש (מבוסס באופן פנימי על מנוע מסד הנתונים SQLite), הושק בחודש אפריל 2009 והוצא משימוש בנובמבר 2010. התכונה הזו הופעלה ב-WebKit (המפעיל את Safari) ונשארה פעילה במנוע Blink (המפעיל את Chrome), אבל היא אף פעם לא הופעלה ב-Gecko (המפעיל את Firefox) וWebKit הסירה אותה ב-2019.

מומלץ לאנשים שזקוקים למסדי נתונים באינטרנט להשתמש בטכנולוגיות של Web Storage API, כמו localStorage ו-sessionStorage, או ב-IndexedDB. הטכנולוגיות האלה מציגות את נקודות החוזק שלהן כשמדובר במאגרי מפתח/ערך ובנתונים מובְנים, אבל יש להן גם נקודות חולשה, כמו היעדר שפת שאילתות חזקה. יש סיבה לכך שאנשים רוצים להשתמש ב-SQL באינטרנט.

שלבי ההוצאה משימוש וההסרה של Web SQL

  • [ בוצע.] Web SQL הוצא משימוש והוסר מהקשרים של צד שלישי ב-Chromium 97 (4 בינואר 2022).
  • [ בוצע.] הגישה ל-Web SQL בהקשרים לא מאובטחים הוצאה משימוש החל מ-Chromium 105 (4 בינואר 2022), ומאותו רגע הוצגה הודעת אזהרה בחלונית הבעיות של Chrome DevTools.

חלונית הבעיות של Chrome DevTools עם אזהרה על כך ש-Web SQL בהקשרים לא מאובטחים הוצא משימוש.

  • [ בוצע.] הגישה ל-Web SQL בהקשרים לא מאובטחים לא זמינה יותר החל מ-Chromium 110 (4 בינואר 2022). מדיניות ארגונית שמאפשרת להמשיך להשתמש בתכונה זמינה מ-Chromium 110 ( 4 בינואר 2022) עד ל-Chromium 123 ( 4 בינואר 2022).
  • [ בוצע.] הגישה ל-Web SQL בכל ההקשרים הוצאה משימוש החל מ-Chromium 115 (4 בינואר 2022), ומופיעה אזהרה בחלונית הבעיות של כלי הפיתוח ל-Chrome.
  • [ בוצע.] תקופת ניסיון להוצאה משימוש כדי להמשיך להשתמש ב-Web SQL הייתה זמינה מ-Chromium 117 (4 בינואר 2022) עד ל-Chromium 123 (4 בינואר 2022). למידע נוסף על תקופות ניסיון להוצאה משימוש, קראו את המאמר תחילת העבודה עם תקופות ניסיון למקורות.
  • [ בוצע.] הגישה ל-Web SQL בכל ההקשרים לא זמינה יותר החל מ-Chromium 119.

מה עושים עכשיו

כפי שצוין בהקדמה, טכנולוגיות של Web Storage API כמו localStorage ו-sessionStorage, או התקן IndexedDB הן חלופות טובות במקרים רבים, אבל לא בכל המקרים.

הסיבה לכך שאנחנו משאירים את האחסון למפתחי אתרים

עם הופעתו של Wasm, פתרונות SQL או NoSQL יכולים להגיע לאינטרנט. דוגמה אחת היא DuckDB-Wasm, ודוגמה אחרת היא absurd-sql. על סמך היצירות האלה, אנחנו סבורים שקהילת המפתחים יכולה ליצור פתרונות אחסון חדשים ולשפר אותם מהר יותר ובאופן טוב יותר מאשר ספקי הדפדפנים.

אנחנו לא מתכננים רק להסיר את Web SQL. למעשה, החלפנו אותו במשהו שקהילת הקוד הפתוח תשמור עליו, ותגיש אותו כחבילת קוד שאפשר לעדכן לפי הצורך – בלי הצורך להוסיף תיקונים ותכונות חדשות ישירות לדפדפנים. המטרה שלנו היא לאפשר למפתחים להביא את מסד הנתונים שלהם לאינטרנט.

בנוסף, אנחנו מקווים שהדוגמה הזו תעזור לפתח סביבה עסקית חדשה של מסדי נתונים בקוד פתוח. השקת אמצעי הגישה למערכת הקבצים מספקת סוף סוף את הרכיב הבסיסי החדש שאפשר לבנות עליו פתרונות אחסון בהתאמה אישית.

הסיבות להוצאת Web SQL משימוש

חששות לגבי קיימות ואבטחה

אי אפשר להטמיע את מפרט Web SQL באופן בר-קיימא, מה שמגביל את החדשנות והתכונות החדשות. בגרסה האחרונה של התקן כתוב "סוכנויות משתמשים חייבות להטמיע את הדיאלקט של SQL שנתמך על ידי Sqlite 3.6.19".

SQLite לא תוכנן במקור להריץ הצהרות SQL זדוניות, אבל הטמעת Web SQL מחייבת את הדפדפנים לעשות בדיוק את זה. כדי לעמוד בקצב של תיקוני האבטחה והיציבות, צריך לעדכן את SQLite ב-Chromium. הדבר עומד בניגוד ישיר לדרישה של Web SQL לפעול בדיוק כמו SQLite 3.6.19.

צורת ה-API

Web SQL הוא גם ממשק API שמראה את הגיל שלו. ה-callback הוא צאצא של סוף שנות ה-2000, והוא דוגמה מצוינת ל'גיהנום ה-callback', כפי שמוצג בקטע הקוד הבא (באדיבות Nolan Lawson). כפי שאפשר לראות, הצהרות ה-SQL (באמצעות הדיאלקט של SQL ב-SQLite) מועברות כמחרוזות לשיטות של מסד הנתונים.

openDatabase(
  // Name
  'mydatabase',
  // Version
  1,
  // Display name
  'mydatabase',
  // Estimated size
  5000000,
  // Creation callback
  function (db) {
    db.transaction(
      // Transaction callback
      function (tx) {
        // Execute SQL statement
        tx.executeSql(
          // SQL statement
          'create table rainstorms (mood text, severity int)',
          // Arguments
          [],
          // Success callback
          function () {
            // Execute SQL statement
            tx.executeSql(
              // SQL statement
              'insert into rainstorms values (?, ?)',
              // Arguments
              ['somber', 6],
              // Success callback
              function () {
                // Execute SQL statement
                tx.executeSql(
                  // SQL statement
                  'select * from rainstorms where mood = ?',
                  // Arguments
                  ['somber'],
                  // Success callback
                  function (tx, res) {
                    // Do something with the result
                    var row = res.rows.item(0);
                    console.log(
                      'rainstorm severity: ' +
                        row.severity +
                        ',  my mood: ' +
                        row.mood,
                    );
                  },
                );
              },
            );
          },
        );
      },
      // Error callback
      function (err) {
        console.log('Transaction failed!: ' + err);
      },
      // Success callback);
      function () {
        console.log('Transaction succeeded!');
      },
    );
  },
);

אם מריצים את הקוד הזה ובודקים את הטבלה שנוצרה באמצעות כלי הפיתוח של Chrome, זו התוצאה:

בדיקה של הקטע Web SQL בכלי הפיתוח ל-Chrome מראה מסד נתונים שנקרא mydatabase עם טבלה שנקראת rainstorms עם העמודות mood (טקסטואלי) ו-severity (מספר שלם) שיש בה רשומה אחת עם הערך של mood‏ somber ו-severity‏ six.

חוסר תמיכה במטמיעים

מלבד הצורה המורכבת של ה-API (לפחות מנקודת המבט של היום), ל-Mozilla היו הרבה חששות לגבי Web SQL שנבנה על SQLite:

"אנחנו לא חושבים ש-[SQLite] הוא הבסיס הנכון ל-API שחשוף לתוכן אינטרנט כללי, בין היתר כי אין תקן מהימן ומקובל שמציג קבוצות משנה של SQL באופן שימושי. בנוסף, אנחנו לא רוצים ששינויים ב-SQLite ישפיעו על האינטרנט בהמשך, ולא חושבים ששימוש במהדורות ראשיות של דפדפנים (וכן בתקן אינטרנט) ב-SQLite הוא מועיל".

אפשר לקרוא על החששות של Mozilla בפוסט בבלוג של Vladimir Vukićević, לשעבר עובד Mozilla. למידע נוסף על ההיסטוריה, אפשר לעיין בפרוטוקולים של קבוצת העבודה של W3C לאפליקציות אינטרנט (ואם אתם רוצים להיכנס לפרטים, כדאי לקרוא את יומני ה-IRC) ובארכיונים של רשימת התפוצה. בנוסף, בפוסט בבלוג של Nolan Lawson יש סקירה כללית טובה של מה שקרה.

משוב

אם יש לכם שאלות לגבי השלבים להוצאה משימוש שמפורטים בפוסט הזה, אתם יכולים לפנות אלינו ברשימת התפוצה blink-dev. כל אחד יכול להצטרף לקבוצה הזו, וכל אחד יכול לפרסם בה.

תודות

המאמר הזה נבדק על ידי Joe Medley ו-Ben Morss, וגם על ידי Joshua Bell.