عنوان:

‫کالبدشکافی تغییرات بزرگ در SQLitePCLRaw 3.0


نویسنده: وحید نصیری
تاریخ: ۱۴۰۵/۰۴/۰۱ ۱۴:۱۵
آدرس: www.dntips.ir
یکی از کلیدی‌ترین کتابخانه‌های زیرساختی در دنیای NET.، کتابخانه‌ی SQLitePCLRaw است. اگر تا به حال در پروژه‌های دات‌نت، موبایل (زامارین یا MAUI) یا دسکتاپ با پایگاه داده SQLite کار کرده باشید، این کتابخانه همان لایه واسط یا پُلی است که کدهای #C شما را به موتور نیتیو (Native) و سی‌پلاسیِ SQLite متصل می‌کند. اخیراً نسخه ۳.۰ این کتابخانه منتشر شده که تغییرات ساختاری و بیزینسی بسیار مهمی داشته‌است. شایعاتی مبنی بر پولی شدن کامل آن وجود داشت، اما در ادامه می‌خواهیم ببینیم واقعیت چیست و چه تغییراتی رخ داده است.

چه چیزهایی تغییر «نکرده» است؟ (شایعه یا واقعیت؟)
بگذارید همین ابتدا یک ابهام‌زدایی بزرگ کنیم: هسته اصلی کتابخانه کاملاً رایگان و متن‌باز باقی مانده است.
  • کد هسته مرکزی (SQLitePCLRaw.core) هیچ تغییری نکرده.
  • اگر از بسته استاندارد و رایگان یعنی bundle_e_sqlite3 استفاده می‌کنید، مهاجرت به نسخه ۳ بدون هیچ دردسری انجام می‌شود و فقط کافیست شماره نسخه را آپدیت کنید.

پس چه چیزی تغییر کرده؟ تغییرات در سه بخش بوده است: حذف بخش‌های قدیمی، معماری بسته‌ها، و سیاست‌های بخش امنیت و رمزنگاری.

خانه‌تکانی و حذف کدهای اضافه
در نسخه ۳.۰، توسعه‌دهنده‌ی اصلی تصمیم گرفته بار اضافی کتابخانه را کم کند:
۱. خداحافظی با زامارین کلاسیک: پشتیبانی از Xamarin قدیم به طور کامل حذف شده است.
۲. حذف بسته‌های ترکیبی مبهم: بسته‌هایی مثل bundle_green (که روی iOS رفتار متفاوتی داشت) یا بسته‌های تک‌خطی مثل bundle_sqlite3 حذف شده‌اند تا ساختار پروژه شفاف‌تر شود.
۳. ارتقای فریم‌ورک: نسخه هدف .NET Framework از 4.6.2 به 4.7.1 ارتقا یافته است.

تغییر بزرگ در معماری بسته‌ها
بزرگ‌ترین تغییر فنی، تفکیک وظایف بسته‌هاست. تا قبل از این، وقتی شما بسته را نصب می‌کردید، هم کد واسط دات‌نت و هم فایل باینری (Native) پایگاه داده یکجا نصب می‌شدند. در نسخه ۳.۰ این دو از هم جدا شده‌اند:
  • بسته .config.e_sqlite3: فقط حاوی کدهای پیکربندی و واسط دات‌نت است.
  • بسته SourceGear.sqlite3: حاوی خودِ موتور SQLite است (که توسط شرکت سازنده کامپایل می‌شود).
مزیت این کار چیست؟ از این به بعد نسخه این دو بسته مستقل است. اگر SQLite یک آپدیت امنیتی بدهد، شما فقط بسته نیتیو را آپدیت می‌کنید و نیازی نیست منتظر آپدیت کل کتابخانه SQLitePCLRaw بمانید.

بخش چالش‌برانگیز: داستان رمزنگاری و مدل درآمدی
و اما می‌رسیم به بخشی که باعث سوءتفاهم شده: بحث امنیت و رمزگذاری (Encryption). تا پیش از این، توسعه‌دهنده این کتابخانه تنها کسی در دنیا بود که نسخه‌های رمزنگاری‌شده مجهز به SQLCipher را به صورت کاملاً رایگان و آماده در قالب NuGet پکیج به جامعه دات‌نت ارائه می‌داد. اما در نسخه ۳.۰ اعلام شد که توزیع رایگان نسخه‌های رمزنگاری‌شده متوقف شده است. دلیل آن هم هزینه بالا و زمان‌بر بودن نگهداری این بسته‌هاست.
حالا راه‌حل چیست؟
۱. خدمات پولی شرکت SourceGear: سازنده کتابخانه حالا برای شرکت‌های بزرگ، سرورهای NuGet اختصاصی و پشتیبانی فنی پولی ارائه می‌دهد.
۲. افزونه رسمی SEE: پیشنهاد اول، خرید لایسنس تجاری افزونه رسمی رمزنگاری خودِ SQLite است.
۳. نسخه‌های دیگر: برای استفاده از SQLCipher یا باید لایسنس تجاری از شرکت Zetetic بخرید و یا خودتان آستین بالا زده و کدها را کامپایل کنید.

نحوه مهاجرت در کد (Migration)
برای جمع‌بندی، بیایید ببینیم در عمل چطور پروژه‌هایمان را آپدیت کنیم:
  • روش سنتی و ساده: کافیست نسخه را در فایل پروژه به شکل زیر تغییر دهید:
<PackageReference Include="sqlitepclraw.bundle_e_sqlite3" Version="3.0.1" />
  • روش پیشنهادی و منعطف (جدا کردن سازه از باینری): توصیه می‌شود بسته قبلی را حذف و این دو بسته را جایگزین کنید:
<PackageReference Include="sqlitepclraw.config.e_sqlite3" Version="3.0.1" />
<PackageReference Include="sourcegear.sqlite3" Version="3.50.3" />
با این کار، در آینده برای آپدیت پایگاه داده، فقط خط دوم را تغییر می‌دهید.

نتیجه‌گیری
نتیجه اینکه SQLitePCLRaw پولی نشده، بلکه مدل بیزینسی خود را اصلاح کرده است. هسته اصلی برای پروژه‌های استاندارد و عادی همچنان رایگان، سریع‌تر و بهینه‌تر از قبل است؛ اما اگر پروژه‌ای با امنیت بالا و رمزنگاری داده‌ها در سطح انترپرایز می‌نویسید، باید بودجه‌ای برای خرید لایسنس یا خدمات پشتیبانی آن کنار بگذارید.