سلام.
مقدمه ای بر رابط C/C++ در SQLite
توی ورژن های قدیمی تر SQLite فقط 5 تا تابع API وجود داشت و خیلی ملت حال میکردن باهاشون و آب خوردن و از اینا. ولی توی این ورژن های جدید با رشد قابلیت های SQLite توابع هم زیاد شدن و تا حالا که رسیدن به 150 تابع API منحصربفرد. حالا وحشت نکنید، اکثر این توابع خیلی تخصصی و بعید الکاربرده و شما همچنان با چند تا تابع معدود میتونید کاراتون پیش ببرید و نیازی به بقیهشون نداشته باشید. حتی میتونید خودتون کدشو بگیرید و توابع اضافه رو حذف کنید تا حجم هم پایین بیاد.
توی اینجا
http://www.sqlite.org.com/c3ref/intro.html یه مرجع کاملی از توابع وجود داره. من فکر نکنم بخوام همه اونا رو اینجا توضیح بدم
شما این مطلب رو که بخونید دیگه راه میفتید و میتونید از اون صفحه ای که گفتم به عنوان مرجع استفاده کنید و هر تابعی که خواستید رو توضیحاتشو ببینید. خب
1- اشیاء داخلی و رابط ها
( همونطور که میدونید توی C شیئ نداریم و منظور همون ساختمون های داده و Struct ها هسته )
از مهمترین وظایف یه سیستم دیتابیس اجرای دستورات SQL هسته. برای انجام این کار باید با دو تا از object های SQLite آشنا بشید.
- شیئ نگه دارنده ارتباط با دیتابیس : sqlite3
- شیئ نگه دارنده دستورات : sqlite3_stmt
البته تا زمانی که با توابع خلاصه ای مثل sqlite3_exec یا sqlite3_get_table کار میکنید عملا نیازی به کار با sqlite3_stmt نیست ولی برای استفاده کامل از SQLite بهتره که اینم رو یاد بگیرید.
این دو تا شیئ با استفاده از چند تا تابع زیر کنترل میشن :
کد:
•
sqlite3_open()
•
sqlite3_prepare()
•
sqlite3_step()
•
sqlite3_column()
•
sqlite3_finalize()
•
sqlite3_close()
اگر شما کار با این شش تابع و اون دو تا شیئ رو بلد باشید، تمامی عملیات اصلی SQLite رو میتونید انجام بدید.
البته باید بگم که تعداد توابع بیشتر از اینا است . یعنی هر کدوم از اینا ممکنه ورژن های مختلفی داشته باشند. مثلا sqlite3_open به نمایندگی از سه تابع sqlite3_open ، sqlite3_open16 و sqlite3_open_v2 اومده. و یا مثلا، اصلا تابعی به نام sqlite3_column وجود نداره و این اسم بصورت عنوانی برای یه خانواده از توابع اومده ( الان 10 تا ). کار اصلی این توابع یکیه و فقط تفاوت های جرئی درشون وجود داره.
یه توضیحی از این توابع :
1- sqlite3_open
این تابع یه دیتابیس SQLite رو باز میکنه ( یا میسازه) و یه شیئ sqlite3بر میگردونه (اعم از دیتابیس معمولی، موقت و موقت حافظه ای ). این اولین تابعیه که برای برقراری ارتباط استفاده میشه و ارتباط با دیتابیس رو برقرار میکنه و نتیجه رو توی sqlite3 قرار میده.
2- sqlite3_prepare
این تابع یه عبارت SQL رو به یه شیئ نگه دارنده دستورات (sqlite3_stmt) تبدیل میکنه. تابع با گرفتن دستور SQL و شیئ sqlite3 که قبلا با sqlite3_open ایجاد شده، اون دستورو در قالب یه شیئ sqlite3_stmt تحویل میده. توجه کنید که این تابع دستور رو اجرا نمیکنه بلکه اونو برای اجرا آماده میکنه و به فرمت اجرا شدنی در میاره.
در ضمن توصیه میکنن که برای کار با این تابع از نسخه های دوم (v2) اون استفاده کنید.
3- sqlite3_step
این تابع دستور آماده شده توسط sqlite3_prepare رو اجرا ميكنه. و یه سطر یا همون رکورد رو میخونه و در حافظه قرار میده که بعدا میتونید با توابع sqlite3_colum فیلدهاش رو بخونید. همینطور باید این دستور رو اجرا کنید تا یه SQLITE_DONE برگردونه که یعنی تموم شد. هر بار اجرای این تابع هم رکورد بعدی رو برمیگردونه. برای دستوراتی که بازگشتی ندارن ( مثل UPDATE و INSERT و DELETE ) یه بار اجرا کافیه.
4- sqlite3_colum
با استفاده از این خانواده از دستورات مقادیر فیلد های رکورد آماده شده توسط تابع قبلی رو میتونن برای ما بگیرن. هر تابع برای نوع خاصی به کار میره به اضافه یه تابع که تعداد فیلد ها رو بر میگردونه و چند تا کاربرد خاص که همون تابعا دارن. الانه میشن رو هم 11 تا :
کد:
•
sqlite3_column_blob()
•
sqlite3_column_bytes()
•
sqlite3_column_bytes16()
•
sqlite3_column_count()
•
sqlite3_column_double()
•
sqlite3_column_int()
•
sqlite3_column_int64()
•
sqlite3_column_text()
•
sqlite3_column_text16()
•
sqlite3_column_type()
•
sqlite3_column_value()
اینجام یه اهم لازمه
5- sqlite3_finalize
این تابع شیئ دستور (sqlite3_stmt) ساخته شده توسط sqlite3_prepare رو نابود میکنه. اگه حافظه تونو دوست دارید باید از این تابع بعد از اتمام دریافت اطلاعات استفاده کنید یا اینکه سیستمو ریست کنید تا حافظه آزاد بشه.
6- sqlite3_close
ایشون هم همونطور که از قیافه شون بر میاد، یه ارتباط با دیتابیس رو که با sqlite3_open ایجاد شده رو میبندن. باید توجه داشته باشید که تمامی شیئ های نگه دارنده دستور (sqlite3_stmt) که قبلا ایجاد کردید رو باید قبل از بستن ارتباط با دیتابیس، توسط sqlite3_finalize نابود کنید.
1.1 کاربرد توابع و اسیاء پایه معرفی شده
برنامه ای که بخواد از یه دیتابیس SQLite استفاده کنه اول باید با sqlite3_open یه ارتباط با یه دیتابیس برقرار کنه. البته میتونه با چندی بار فراخوانی به طور هم زمان چند تا دیتابیس رو هم باز کنه یا یه دیتابیس رو چندین بار. البته میشه با استفاده از دستور ATTACH چندین دیتابیس رو هم با یه شیئ نگهدارنده ارتباط ( sqlite3 ) باز کنه.
برنامه ها اغلب با بسته شدنشون رابط SQLite رو هم با sqlite3_close نابود میکنن. البته ممکنه باز کردن دیتابیس رو با عمل File->Open انجام دادن و نابود کردن رابط رو هم با File->Close .
برنامه برای اجرای یه دستور SQL باید مراحل زیر رو طی کنه:
1- یه شیئ نگهدارنده دستور (sqlite3_stmt) رو با sqlite3_prepare ایجاد کنه
2- دستور آماده شده رو با تابع sqlite3_step برای یک یا چندین بار اجرا کنه
3- بین هر اجرای sqlite3_step با استفاده از sqlite3_column مقادیر رکورد رو بگیره
4- و در نهایت شیئ نگهدارند دستور رو با تابع sqlite3_finalize نابود کنه
خب برای کار کردن با SQLite دونست اینایی که گفتیم لازمه.
2 توابع کار راحت کن
اینجا دو تا تابع کار راحت کن هم داریم که بد نیست معرقیشون کنیم. اولیش sqlite3_exec هسته. این تابع تمام چهار مرحله بالا رو خودش یه تنه انجام میده. فقط یه اشاره گر به یه تابع دریافت میکنه تا برای هر رکوردی که در میاره اون تابعو براش صدا کنه. دومین تابع sqlite3_get_table هسته که کل نتایج رو یکجا برمیگردونه و اینم تمام اون چهار مرحله رو در جا میره.
خب البته شایان ذکر هست که بگیم که هیچ کدوم از این دو تابع، خیلی از امکاناتی رو که اون توابع قبلی در اختیار کاربر میگذارن رو ندارن.
3 چسباندن پارامتر ها و استفاده مجدد از شیئ نگهدارنده دستور
همونطور که گفته شد دیدید که یه دستور SQL یه بار اماده میشهف اجرا میشه ، و نابود میشه. خب در SQLite میتونید یه دستور اماده شده رو چندین بار اجرا کنید. این امر با استفاده از دو تابع زیر امکانپذیره:
کد:
•
sqlite3_reset()
•
sqlite3_bind()
بعد از این که یه شیئ نگه دارنده دستور توسط sqlite3_step اجرا شد، میشه اونو با تابع sqlite3_reset به حالت اولیه در اورد و دوباره اونو از ابتدا اجرا کرد. اینوطری دیگه نیازی به ساخت دوباره یه شیئ نگه دارنده دستور برای همون دستور ندارید. توجه داشته باشید که در اغلب دستورات SQL ، اجرای دستور sqlite3_prepare زمانی برابر یا بیشتر از دستور sqlite3_step صرف میکنه. بنابراین به کاربردن sqlite3_reset میتونه کارایی برنامه رو خیلی بالاتر ببره.
خب. همیشه دستور ها دقیقا یکسان نیستن یعنی در واقع این امر خیلی نادره. در اکثر موارد دستورات یکی هستن و فقط مقادیر تفاوت دارن. برای این مورد هم میتونید از پارامتر ها و توابع خانواده sqlite3_bind استفاده کنید. شما میتونید به جای مقدار دهی مستقیم در دستورات SQL از پارامتر ها استفاده کنید و بعدا با استفاده از دستورات sqlite3_bind مقادیر مورد نظر رو به دستور بچسبونید. با این روش شما دیگه نیازی به ساخت مکرر شیئ نگه دارنده دستور ندارید. در عوض هر بار با استفاده از توابع sqlite3_bind مقادیر مورد نظرتونو به دستور میچسبونید و بعد از اجرا با تابع sqlite3_reset دستور رو به حالت اولیه برمیگردونید و دوباره مقدار دهی میکنید و همینطور ادامه میدید. توجه داشته باشید که با اجرای دستور sqlite3_reset مقادیر چسبانده شده به دستور حذف نمیشن. این مقادیر با استفاده مجدد از sqlite3_bind رونوشت میشن و یا میتونید با sqlite3_clear_bindings اونا رو حذف کنید ( که اکثرا نیاز نیست ).
شما میتونید پارامتر ها رو به 5 روش در دستور SQL مشخص کنید:
1-
با علامت سوال: ?
2-
با علامت سوال و شمارنده: ?NNNN
3-
با علامت دو نقطه و یک نام : :AAA
4-
با علامت دلار و یک نام : $AAA
5-
با علامت @ و یک نام : @AAA
که در مثالهای بالا NNNN یه عدده بین 1 تا SQLITE_MAX_VARIABLE_NUMBER ( که قبلا معرفی شده ) و AAA یه اسم منحصر به فرده. یه پارامتر به صورت پیشفرض مقدار NULL داره.
البته با همه اینا SQLite محدودیتی در تولید شیئ نگهدارنده دستور نداره. ولی استفاده از موارد بالا سرعت و کارایی برنامه تونو بالا میبره.
4 توسعه SQLite
SQLite توابعی داره که میتونید به وسیله اونها کارکرد SQLite رو ارتقا ببخشید :
کد:
•
sqlite3_create_collation()
•
sqlite3_create_function()
•
sqlite3_create_module()
با sqlite3_create_collation میتونید یه collation جدید برای مرتب سازی متون ایجاد کنید.
با تابع sqlite3_create_module میتونید یه سیستم مجازی پیاده سازی جدول (virtual table implementation ) ایجاد کنید.( البته این تابع هنوز تثبیت شده نیست و ممکنه در اینده تغییر کنه یا حذف بشه )
و با تابع sqlite3_create_function میتونید یه تابع SQL درست کنید، جایگزین کنید و یا حذف کنید. هم از نوع scalar و هم از نوع aggregate ( اگه به سرتون زد که این کارو بکنید خودتون برید فرق این دو تا رو هم پیدا کنید. من نه حوصله شو دارم توضیح بدم و نه جاشه) البته برای این کار به توابع زیر هم نیاز پیدا میکنید :
کد:
•
sqlite3_aggregate_context()
•
sqlite3_result()
•
sqlite3_user_data()
•
sqlite3_value()
تمامی توابع داخلی SQLite دقیقا با همین روش ایجاد شدند. میتونید به فایل های date.c یا func.c مراجعه کنید.
5 رابط های دیگر
خب این جا ما یه سری از توابع پایه ای و اصلی SQLite رو بررسی کردیم. SQLite هنوز تعداد زیادی تابع دیگه داره که اگه خواستید آستینا رو میزنید بالا و میرید اینجا :
http://www.sqlite.org/c3ref/intro.html که یه مرجع کامله و هرچی دلتون میخواد رو یاد میگیرید.
در ضمن یه لیست کامل از توابع رو هم میتونید اینجا ببینید :
http://www.sqlite.org/c3ref/funclist.html
توجه داشته باشید توابعی که جلوشون نوشته (exp) یعنی تثبیت شده نیستن و ممکنه در آینده تغییر کنن یا حذف بشن و توابعی که جلشون نوشته (obs) توابعی هستن که از رده خارج شدن و فقط برای پشتیبانی از نسخه های قبلی هنوز وجود دارن. ضمن این که این توابع توضیح ندارن و نباید ازشون استفاده کرد.
یه بررسیی بکنیم ببینیم چیکارا میخوایم بکنیم.
خب میخوام اینجا رو بکنم یه مرجع کامل برای SQLite . البته فکر نکنم ( یعنی نمیکنم
) بخوام تمامی توابع SQLite رو توضیح بدم. چون زیادن. البته تجربه نشون داده من گاهی وقتا به سرم میزنه.
خب من یه لیست از مواردی که هست درست کردم. ( نا مرتبه )
1- Compilation Options For SQLite
2- Datatypes In SQLite Version 3
3- Result Codes
4- Extended Result Codes
5- NULL Handling in SQLite Versus Other Database Engines
6- SQL Syntax : SQL As Understood By SQLite
اینم دست کمی از توابع (مورد ) نداره. ولی دلم میخواد که بگذارم. تا ببینیم چی میشه
7- Pragma statements supported by SQLite
اگه مورد 6 رو گفتم که این موردم جزوشه.
8- SQL Features That SQLite Does Not Implement
این وابسته به مورد 6 هسته پس اگه اونو گفتم اینم میگم
9- List Of SQLite Objects
این و
10- List Of SQLite Constants
این و
11- List Of SQLite Functions
این. این سه مورد ( 9 و 10 و 11) هم نیازن. اگه قرار باشه بگم همهشو با هم میگم. ولی احتمالش خیلی کمه.
12- Using the SQLite Online Backup API
13- SQLite Shared-Cache Mode
14- sqlite3: A command-line access program for SQLite databases
خب. فعلا برای پست بعدی مورد 3 رو در نظر گرفتم.
اولویت هم برای موردای 1 و 2 و 3 و 4 و 5 و 12 و 14 هسته.
احتمالا تا چند وقت دیگه یه تایپیک دیگه هم میزنم به عنوان "SQLite در دیگر زبانها" ( یعنی غیر از C/C++ ).
راستی اینا رو که میگم چشم انداز 5 ساله هستا. خدا داند تا کی طول بکشه. ( شایدم وسط کارش کشمون پاره شد )
خب چطوره؟
راستی منم همکار مترجم قبول میکنما
. آخر کار یه کتاب SQLite میزنیم پولشم 50-50 . چطوره ؟
فعلا. به امید دیدار.