امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
SQLite
نویسنده پیام
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #1
SQLite
سلام.
احتمالا شما هم مثل من تا حالا اسم SQLite رو نشنیدید.
SQLite یه سیستم مدیریت پایگاه داده ها است که خیلی چیز خوبیه حسن. البته کاربرد خودشو داره و چیزی در حد SQLServer یا MySQL نیست.
قراره اینجا اینو کامل بررسی کنیم. ببینیم چی میشه.
( آقا فریدون گفت کسی اینجا مقاله نمیگذاره دلم سوخت براش گفتم یه چیزی بنویسم Whistle Biggrin Question)
فعلا.
SQLITE. Small. Fast. Reliable.
SQLite is a software library that implements a self-contained, serverless, zero-configuration, transactional SQL database engine
.

خب از تعاریف بالا فهمیدید که این SQLITE چیه دیگه. یه سیستم مدیریت بانک اطلاعاتی بدون نیاز به سرور، بدون نیاز به تنظیمات، بدون نیاز به لوازم جانبی(مستقل) است. و ادعا میکنن که پر مصرف ترین سیستم مدیریت دیتابیس دنیا است. و خب اگه این لیستو ببینید مطمئنا متقاعد میشید. لیست موارد مصرف SQLITE در دنیا:
- 125 میلیون کپی از فایرفاکس
- 20 میلیون کامپیوتر MAC که تو هر کدومش ممکنه چند تا کپی از SQLITE باشه
- 20 میلیون سایت توی دنیا هست که با PHP هست و PHP هم SQLITE داره! میدونم شما هم مثل من میگید خب که چی؟ خب اینا میگن که احتمالا یه کسری از اینا از SQLITE استفاده میکنن دیگه.!
- 300 میلیون نسخه دنلود شده Skype و 100 میلیون کاربرSkype . Skype هم مثل این که از SQLITE استفاده میکنه.
- 20 میلیون نسخه از Symbian smartphone هم فروش رفته توی 2007 که این SQLITE داره. یک چهارمش رو که میتونن به عنوان فعال به حساب بیارن؟
- 10 میلیون کاربر AOL و
- 10 میلیون Solaris 10 هم نصبیده شده که اگه SQLITE نباشه اصلا بالا نمیان.
- میلیون ها نسخه فروخته شده ( و میلیونها نسخه کرک شده دیگه ) از McAfee که همشون SQLITE کارن.
- میلیونها iPhone هم SQLITE دارن. خجالت بکشید این با یه کلید SQLITE داره. شما با 114 تا کلید به بالا SQLITE ندارید.
- میلیون ها نسخه از دیگر سیستم عاملهای تلفن های همراه و کامپیوتر جیبی ها که از SQLITE استفاده میکنن
- در ضمن تعداد زیادی از موارد دیگه ای که اینا و ما و اونا نمیدونن و هست و همچنین تعدادی دیگه که خودشونم نمیدونن و همچنین یه تعداد دیگه که خودشم نمیدونه ( یعنی اسمشو عوض کردن ).
بنا بر این شواهد و مدارک حتما پر کاربرد ترین دیتابیسه دیگه.
این روز ها همه SQLITE کار میکنند. شما چطور؟

کپی رایت هم public domain : http://en.wikipedia.org/wiki/Public_Domain
فایلشو میتونید توی هر سیستم عاملی کپی کنیدWink. کتابخونش برای چند تا سیستم عامل کمپایل شده هست. در ضمن این که کدش به زبان C استاندارد موجوده و میتونید هرجا که دلتون خواست اونو کمپایل کنید یا اصلا مستقیما تو پروژه تون استفاده کنید. یا توی سیستم عاملی که درست کردید استفاده کنید یا توی وسایل و smartphone هایی که میسازید.(رفتم iAjili بسازم ).

میزان رای دشمن است!
[تصویر:  cff100.png]
(آخرین ویرایش در این ارسال: ۲۰-فروردین-۱۳۸۸, ۱۲:۵۵:۰۴، توسط ajlajlajl.)
۲۰-فروردین-۱۳۸۸, ۱۲:۲۲:۵۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : far_222000, amirjan, hoax3r, sav68, lord_viper, man4toman, alaska
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #2
تعدادی از کاربران معروف SQLite
تعدادی از کاربران معروف SQLite

در اینجا تعدادی از کاربران معروف SQLite رو لیست شده میبینید. البته مطمئنا این همش نیست.
- Adobe
این شرکت در برنامه Photoshop Lightroom از SQLite به عنوان فرمت فایل استفاده کرده (توی About خود برنامه اعلام شده ). همچنین اعلام کرده که در AIR project هم از اون استفاده میکنه. بهمچنین میگن که Acrobat Reader هم از SQLite استفاده میکنه.
- Apple
Apple از SQLite در بسیاری از جا ها در Mac OS-X استفاده کرده مثل Apple Mail ، safari و Aperture . بهمچنین گفته میشه که در iPhone و iPod toch هم از SQLite استفاده شده.
- Mozilla Firefox
Mozilla Firefox همداره کم کم حدود دو ساله داره سیستم فایل های قدیمیش (mork ) رو با SQLite عوض میکنه ( من فایلهای SQLite رو دیدم توی پوشه اون )
- General Electric
General Electric هم مثل این که داره ازش استفاده میکنه به دلایلی که تو سایت نوشته و نم حال ندارم بنویسم
- Google
گوگل هم توی بعضی محصولاتش مثل Desktop for mac، Google gears ، Google Chrome و سیستم عامل Android از SQLite استفاده میکنه.
- McAfee
هم توی آنتی ویروس معروفش از SQLite استفاده کرده.
- Microsoft
میگن بر اساس یکی از پیغام ها یه گروه در مایکروسافت برای یه بازی از SQLite استفاده کرده. البته هنوز معلوم نیست که اون بازی پخش شده یا نه یا اصلا هنوز از SQLite استفاده میکنن یا نه
- Monotone
من که نمیدونم این چیه. شما میدونید؟ اینم سایتش : http://monotone.ca اگه فهمیدید بگید.
- Philips MP3 Players
این تو هم برای ذخیره اطلاعات موسیقی هم از SQLite استفاده میشه
- PHP
PHP بطور کامل هم از SQLite2 و هم از SQLite3 پشتیبانی میکنه.(استفاده نمیکنه ها)
- Python
اینم داره SQLite رو
- REALbasic
REALbasic هم یه نسخه دستکاری شده SQLite رو داره که AES هم رو پشتیبانی میکنه
- Skype
داره دیگه. توضیح نمیخواد که
- Sun Microsystems
توی Solaris 10 ازش استفاده کرده
- Symbian
یکی از اجزاء داخلی این سیستم عامله
- TOSHIBA
اینم حتما یه جاییش از SQLite استفاده میکنه. اینم از رو پیغاماشون در آوردن.

تو بی کانتینیود ... Tongue

میزان رای دشمن است!
[تصویر:  cff100.png]
۲۰-فروردین-۱۳۸۸, ۱۹:۱۷:۰۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : far_222000, hoax3r, sav68, lord_viper, man4toman, alaska
amirjan آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,105
موضوع‌ها: 24
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 348
( 697 تشکر در 251 ارسال )
ارسال: #3
RE: SQLite
نقل قول: - میلیونها iPhone هم SQLITE دارن. خجالت بکشید این با یه کلید SQLITE داره. شما با 114 تا کلید به بالا SQLITE ندارید.
حالا چرا میزنی ! من تازه باهاش آشنا شدم ...

نقل قول: - Monotone
من که نمیدونم این چیه. شما میدونید؟ اینم سایتش : http://monotone.ca اگه فهمیدید بگید.
یه چیز تو مایه های subversion ، برای مدیریت سورس ها ، داکیومنت ها ، ... کلا کل پروژه ، که مثلا بتونی دقیقا تفاوت بین دو تا ورژن سورس کد خودتو ببینی ، ترکیب کنی ... تو پروژه ها بزرگ که یه تیم روی یه پروژه کار می کنه خیلی به کار میاد ... بهش میگن revision control

سید امیر حسین حسنینی

Human knowledge belongs to the world ...
۲۰-فروردین-۱۳۸۸, ۲۳:۰۲:۵۸
ارسال‌ها
پاسخ
تشکر شده توسط : ajlajlajl
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #4
ویژگی ها
ویژگی ها :
- Transactional
میگن که ایشون atomic, consistent, isolated, and durable هستن. و طبق توضیحاتشون چیزی که فهمیدم اینه که دستوری که میدید بهش یا کامل اجرا میشه یا اصلا اجرا نمیشه ( بر اثر هنگ یا چیز دیگه ) . یعنی نصفه کاره نداره.
- Zero-configuration
این بنده خدا نه فایل نصب داره. نه نیازی به نصب داره. نه نیازی به تنظیم سیستم داره. نه نیاز به مشخص کردن تنظیمات داره. نه راه اندازی سرور و stop و run کردن و از اینا داره. نه بعد از هنگ و ریست نیاز به عملیات خاصی داره. به قول خودش : SQLite just works
میدونم شما هم وقتی میخواید SQLServer یا MySQL نصب کنید ...
- اکثر دستورات SQL92 رو غیر از چند مورد پشتیبانی میکنه. برای مشاهده استاندارد SQL92 برید به http://www.contrib.andrew.cmu.edu/~shado...ql1992.txt یا http://savage.net.au/SQL/sql-92.bnf.html و برای اون چند مورد برید به http://www.sqlite.org/omitted.html .
مواردی که پشتیبانی نمیکنه :
1- FOREIGN KEY constraints من که نفهمیدم یعنی چی
2- Complete trigger support یعنی نه کامل. هستش ولی یه خرده نیستش
3- Complete ALTER TABLE support اینم فقط از rename table و add column پشتیبانی میکنه.
4- RIGHT and FULL OUTER JOIN مدل Left رو داره.
5- Writing to VIEWs اینا هم فقط خوندنی هستن. ولی مثل این که با trigger میشه یه کارایی کرد.
6- GRANT and REVOKE اینام که اصلا به کار این نمیاد چون تنها چیزی که داره همون سطح دسترسی فایله.
- دیتابیستون کامل توی یه فایل غیر وابسته به سیستم عامل ذخیره میشه. یعنی این فایلو هر جایی میتونین ببرین. توی سیستم ها ی 32 بیتی یا 64 بیتی. معماری big-endian یا little-endian هم فرقی براش نداره. در ضمن این که ورژن فعلی که دارید از تمام ورژن های قبلی (SQLITE 3) یعنی تا ورژن 3.0.0.0 پشتیبانی میکنه. همچنین به احتمال قوی ورژن های بعدی رو هم.
- حجم دیتابیس رو تا چندین ترابایت و حجم رشته ها و BLOB رو تا چندید گیگابایت پشتیبانی میکنه ( محدودیت ها رو بعدا به طور کامل شرح میدم )
- Small code footprint : مثل این که منظور حافظه اشغالی هسته که میگه کمتر از 300KB کاملش و کمتر از 180KB با حذف برخی امکانات.
- سریعتر از بعضی از برنامه های کلاینت/سرور معمول در اکثر موارد کاربرد ( مراجعه شود به http://www.sqlite.org/cvstrac/wiki?p=SpeedComparison )
- توابع آسان و راحت الحلقوم
- نوشته شده توسط ANSI-C . من که نمیدونم TCL چیه ( مثل این ک یه نوع اسکریپت نویسیه ) ، گفته که رابط اونم رو داره. در ضمن این که اگه به این صفحه : http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers یه سر بزنید میبینید که واسط برای اکثر زبون براش ساخته شده. از ActionScript2 گرفته تا Delphi و PowerBasic و Matlab و .NET و ... . راستی Mono و PHP بصورت داخلی رابطش رو دارن.
- کدش هم با توضیحات کامل و تست شده موجوده
- کد کامل بصورت یه فایل C موجوده که میتونید خیلی راحت ازش توی هر پروژه ای (با توجه به Public Domain بودن ) استفاده کنید.
- میگه که کاملا Self-Contained و بدون وابستگی هسته و توسط زبان ANSI-C نوشته شده که بنابراین به راحتی توی هر کمپایلری میتونه کمپایل بشه و تنها توابعی که از کتابخونه استاندارد C به کار برده memset, memcpy, memcmp, strcmp, malloc, free, realloc هستند.
- Cross-platform : هر سیستم عاملی که فکرشو بکنید دیگه. البته Windows و Linux و OS/2 بصورت رسمی پشتیبانی میکنه.
- سورس بصورت Public Domain ارائه شده بنابراین هر کاری میخوای بکن.
- یه standalone command-line interface هم داره که میتونید باهاش راحت دیتابیساتونو انگولک کنید.
- Serverless : بدون نیاز به سرور
- Single Database File: دیتابیس تک فایله
- Manifest typing : خب بر اساس این ویژگی SQLite شما توی هر خونه ای از یه جدول بدون توجه به نوع داده ای ستون مربوطه میتونید هر نوع داده ای رو بریزید. یعنی نوع داده کشک. البته چند تا استثنا وجود داره مثلا برای یه INTEGER PRIMARY KEY فقط میتونید یه نوع Integer ذخیره کنید.
- Variable-length records : جناب SQLite بر خلاف بعضی دیگر از دیتابیس ها رکورد هاشون متغیره و نه ثابت. یعنی مثلا توی اون بعضی ها اگه یه فیلد رو از نوع VRACHAR(100) تعریف کنید بدون توجه به این که چقدر اطلاعات توش بریزید همون 100 بایت رو روی هارد اشغال میکنه و بهمین ترتیب ... . ولی SQLite رکورد هاشون متغیره یعنی اگه یه فیلد از نوع VRACHAR(100) باشه و یه بایت چیزی بریزید توش همون یه بایت رو روی هارد اشغال میکنه. بنابر این دیتابیس جای کمتری میگیره، سرعت کار میره بالاتر و استفاده از Manifest typing مقدور میشه.
- میگن که دستورات SQL رو به کد virtual machine تبدیل میکنن و این خیلی چیز خوبیه حسن. اینو حال نداشتم بخونم خودتون بخونید http://www.sqlite.org/different.html#vdbe
تا بعد.

میزان رای دشمن است!
[تصویر:  cff100.png]
۲۱-فروردین-۱۳۸۸, ۱۷:۰۸:۴۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hoax3r, sav68, amirjan, far_222000, man4toman
far_222000 آفلاین
مدير بخش ديتابيس
*****

ارسال‌ها: 955
موضوع‌ها: 68
تاریخ عضویت: شهریور ۱۳۸۴

تشکرها : 468
( 1249 تشکر در 422 ارسال )
ارسال: #5
RE: SQLite
(۲۱-فروردین-۱۳۸۸, ۱۷:۰۸:۴۴)ajlajlajl نوشته است: ویژگی ها :
- Transactional
میگن که ایشون atomic, consistent, isolated, and durable هستن. و طبق توضیحاتشون چیزی که فهمیدم اینه که دستوری که میدید بهش یا کامل اجرا میشه یا اصلا اجرا نمیشه ( بر اثر هنگ یا چیز دیگه ) . یعنی نصفه کاره نداره.

اگه بخوام یه توضیح کوچولو از Transactional بودن این دیتابیس بدم، باید یه مثال بزنم:
فرض کنین می رین پای دستگاه ATM (خودپرداز بانک) و از دستگاه می خواین تا 100 هزار تومان پول بهتون بده. دستگاه می ره از موجودی حساب شما 100 هزار رو کم می کنه و به سیستم شمارشگر پول دستور می ده که 100 هزار تومان رو بشمره و به شما بده، اگه در این بین که شمارشگر داره پول شما رو می شمره، برق بره! پولتون پریده. چون از حسابتون 100 هزار تومان کم شده ولی پولی به شما ندادن!
ولی خوشحال باشین چون این اتفاق نخواهد افتاد! با دستورات Transaction یا همه کارها بدون Error اجرا می شن یا اگه حتی یک کار در این وسط Error داد، همه کارها غیر فعال می شن.
برای اینکه درک برنامه نویسیشم القا کنم اینجوری می نویسین که:
1. Transact کن
2. دستوراتی که هم باید بدون Error اجرا بشن
3. Commit کن

پارک24
مرجع خرید و فروش خودرو
۲۲-فروردین-۱۳۸۸, ۱۰:۲۰:۴۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : amirjan, ajlajlajl, sav68, hoax3r, man4toman
amirjan آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 1,105
موضوع‌ها: 24
تاریخ عضویت: تير ۱۳۸۳

تشکرها : 348
( 697 تشکر در 251 ارسال )
ارسال: #6
RE: SQLite
(۲۲-فروردین-۱۳۸۸, ۱۰:۲۰:۴۴)far_222000 نوشته است:
(۲۱-فروردین-۱۳۸۸, ۱۷:۰۸:۴۴)ajlajlajl نوشته است: ویژگی ها :
- Transactional
میگن که ایشون atomic, consistent, isolated, and durable هستن. و طبق توضیحاتشون چیزی که فهمیدم اینه که دستوری که میدید بهش یا کامل اجرا میشه یا اصلا اجرا نمیشه ( بر اثر هنگ یا چیز دیگه ) . یعنی نصفه کاره نداره.

اگه بخوام یه توضیح کوچولو از Transactional بودن این دیتابیس بدم، باید یه مثال بزنم:
فرض کنین می رین پای دستگاه ATM (خودپرداز بانک) و از دستگاه می خواین تا 100 هزار تومان پول بهتون بده. دستگاه می ره از موجودی حساب شما 100 هزار رو کم می کنه و به سیستم شمارشگر پول دستور می ده که 100 هزار تومان رو بشمره و به شما بده، اگه در این بین که شمارشگر داره پول شما رو می شمره، برق بره! پولتون پریده. چون از حسابتون 100 هزار تومان کم شده ولی پولی به شما ندادن!
ولی خوشحال باشین چون این اتفاق نخواهد افتاد! با دستورات Transaction یا همه کارها بدون Error اجرا می شن یا اگه حتی یک کار در این وسط Error داد، همه کارها غیر فعال می شن.

و در یک کلام : "all-or-nothing"

سید امیر حسین حسنینی

Human knowledge belongs to the world ...
۲۲-فروردین-۱۳۸۸, ۱۶:۲۶:۲۶
ارسال‌ها
پاسخ
تشکر شده توسط : ajlajlajl, sav68, far_222000
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #7
کاربرد ها
کاربرد ها :
خب همونطور که میبینید SQLite اهدافش کوچک بودن، سرعت بالا و مطمئن بودن هست. ولی اصلی ترین هدف اون سادگی است. SQLite خصیصه اصلیش سادگی اونه. خب این سادگی میتونه مزیت اون یا ضعف اون به حساب بیاد ، بسته به مورد کاربرد اون. بله SQLite کاربرد های خاص خودشو داره . SQLite قرار نیست که یک سیستم مدیریت دیتابیس پیشرفته به حساب بیاد و هرگز ساخته نشده تا با سیستمهایی مانند Oracle یا PostgreSQL رقابت کنه. اگه به دنبال امکاناتی مانند سیستم امنیتی کامل، یه مجموعه کاملی از توابع داخلی، stored procedures ، امکانات اضافی زبان SQL ، افزودنی های Java یا XML ، حجم ترابایتی(2 به توان 40) یا پتابایتی (2 به توان 50 ) و اینگونه موارد هستید SQLite انتخاب خوبی نیست. در کل این که هر جا نیاز به سادگی در عین سرعت و کوچکی داشتید بیاید سراغ SQLite. یه جمله جالب از سایتش:l
SQLite is not designed to replace Oracle. It is designed to replace fopen().
موارد کاربرد SQLite :
ه
- Application File Format :
میشه گفت یکی از بهترین کاربرد های SQLite همین عمل به عنوان فرمت فایل برنامه است. اعمالی مثل باز کردن و ذخیره و بازیافت اطلاعات و بستن فایل رو میتونید به سادگی و خیلی آسان تر از قبل انجام بدید. بعلاوه این که کار مطمئن، سریع و مرتب انجام میشه. در ضمن این که میتونید به راحتی با استفاده از trigger ها یه سیستم Undo,Redo هم بصورت نامحدود ایجاد کنید.
- Embedded devices and applications :
خب به علت این که SQLite نیازی به هیچگونه پیکربندی یانصب نداره، گزینه ای عالی برای موبایل ها ، رایانه های جیبی، set-top boxes ( یه چیزی در ارتباط با ماهواره و تلویزیون کابلی و اینجور چیزا !!) و همچنین اختراعات شما است. بهمچنین برای جاسازی اطلاعات در برنامه های کوچک بسیار هم خیلی خوبه حسن.
- Websites
SQLite میتونه گزینه خوبی برای وبسایت های کوچک و متوسط باشه (که میشه 99% سایت ها). میزان ترافیکی که SQLite میتونه پشتیبانی کنه به میزان استفاده از اون توسط وب سایت بستگی داره. به طور کلی SQLite میتونه تعداد 100 هزار بازدید در روز رو به طور کامل پشتیبانی کنه. البته این حداکثر نیست بلکه یه تخمین محافظه کارانه است. SQLite نشون داده که میتونه تا ده برابر اون رو هم پشتیبانی کنه.
- Replacement for ad hoc disk files
خیلی از برنامه ها از fopen و fwrite وfread برای ذخیره اطلاعاتشون توی فایل ها استفاده میکنن. برای اینگونه فایلهای تک منظوره هم SQLite گزینه بسیار خوبیه.
- Internal or temporary databases
اگه برنامه ای دارید که در اون روی مقادیر زیادی از اطلاعات ، قراره عملیات مختلف و پی در پی مثل مرتب سازی انجام بدید، باز هم SQLite با فراهم کردن امکان ایجاد دیتابیس مقیم در حافظه و ایجاد دیتابیس های موقت بهترین گزینه است.
- Database Pedagogy
برای آموزش SQL و دیتابیس هم SQLite گزینه بسیار خوبیه چون که هم کاملا مجانیه، نیاز به نصب نداره و کار باهاش شدید آسونه و خیلی راحت میشه یه دیتابیسش رو ساخت و ازش استفاده کرد و همچنین برای دانش آموزای فعال، کدش هم با توضیحات خط به خط کامل موجوده.
- Experimental SQL language extensions
به علت سادگیش میتونید برای آزمایش ویژگی های زبان دیتابیس یا ایده ها هم ازش استفاده کنید.

مواردی که سیستم های دیگه بهتر از SQLite عمل میکنن
- Client/Server Applications
خب واضح و مبرهن هسته که SQLite اصلا بدرد عملیات تحت شبکه نمیخوره چه برسه به Client/Server ه
- High-volume Websites
همون طور که گفته شد قبلا. برای سایت های سنگین هم به فکر SQLite نیفتید ( همونطور که قبلا هم نمیفتیدید ( الان همینو تو ذهنتون میگفتید ( حال میکنید پرانتزارو؟ )))
- Very large datasets
برای دیتابیس های خیلی بزرگ ( بزرگ تر از چندید گیگابایت ) ممکنه با مشکل اشغال بیش از حد حافظه مواجه بشید که در این صورت بهتره برید سراغ یه سیستم دیگه
- High Concurrency
اگه میخواید تعداد زیادی عملیات به صورت هم زمان روی دیتابیستون انجام بدید باز هم باید سیستم دیگه ای رو انتخاب کنید. SQLite تا حد زیادی این کارو براتون انجام میده. ولی به علت این که دیتابیس رو در مواقع خوندن/نوشتن قفل میکنه و عملیات دیگه ای نمیتونه همزمان اجرا بشه ، با این که هر کدوم از عملیات شاید کمتر از چندین میلی ثانیه طول بکشه ، اگه همزمانی بیشتر از این میخواید باید فکری دیگه بردارید.

در آخر بگم مثل زبان های برنامه نویسی که میگیم VB رو نمیشه با C++ مقایسه کرد چون کارشون متفاوته، SQLite رو هم نمیشه با سیستم هایی مثل Oracle و MySQL و SQLServer مقایسه کرد چون اینها هم کارشون و موارد کاربردشون متفاوته.
...

میزان رای دشمن است!
[تصویر:  cff100.png]
(آخرین ویرایش در این ارسال: ۳۰-فروردین-۱۳۸۸, ۲۱:۱۶:۰۲، توسط ajlajlajl.)
۲۲-فروردین-۱۳۸۸, ۱۸:۵۲:۲۲
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sav68, hoax3r, far_222000, amirjan, man4toman
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #8
محدودیت ها در SQLite
محدودیت ها در SQLite
محدودیت ها یکی از چیز هاییه ما میخوایم قبل از استفاده از یه سیستم ازشون اطلاع داشته باشیم. SQLite ابتدا در ساختارش چیزی به اسم محدودیت نداشت. البته هر کامپیوتری یه سری محدودیت داره. ولی در SQLite چنین چیزی وجود نداشت. قانون کلی این بود که اگه میتونستید اونو توی حافظه جا بدید و بتونید اونو با یه Integer 32 بیتی بشمارید پس میشه!.
البته این مسئله مشکلاتی داشت. که به همین خاطر در نسخه های جدید تر محدودیت ها به طور دقیق مشخص و کاملا تست شدند.
بعضی از محدودیت ها رو میشه در زمان اجرا و توسط تابع sqlite3_limit تغییر داد.
خب لیستش:
1- Maximum length of a string or BLOB
حداکثر طول یا همون تعداد بایتهای یه رشته یا BLOB(Binary Large Object ) رو مشخص میکنه. و از اونجا که توی دستورای select و insert کل یک رکورد به صورت یه BLOB در میاد در نتیجه حداکثر طول یه رکورد هم رو همین مقدار مشخص میکنه.
مقدار پیشفرض یک میلیارد (1,000,000,000) هسته و بر اساس ساختار کنونی حداکثر مقداری که میتونه بگیره 231-1 یا 2147483647 هسته. هرچند بهضی از تابع های درونی مثل hex قبل از رسیدن به این مقدار کم میارند. در حالت معمول اگه نیازی بهش ندارید بهتره مقدارشو در حد و حدود چند میلیون بیشتر نگذارید . مقدار این محدودیت رو میشه در زمان کمپایل و توسط پارامتر زیر مشخص کرد :
-DSQLITE_MAX_LENGTH=123456789
در زمان run-time هم میشه با استفاده از تابع sqlite3_limit به شکل زیر این مقدارو مشخص کرد:
کد:
sqlite3_limit(db,SQLITE_LIMIT_LENGTH,size)
اهم
2- Maximum Number Of Columns
با استفاده از پارامتر SQLITE_MAX_COLUMN در زمان کمپایل میتونید یه حد بالایی برای :
- تعداد ستون های یک جدول
- تعداد ستون های یک Index
- تعداد ستون های یک view
- تعداد term های بخش SET در دستور UPDATE ( term رو بعدا توضیح میدم تو بند 7 )
- تعداد ستون های نتیجه در یک دستور SELECT
- تعداد term های یه GROUP BY یا یه ORDER BY
- تعداد مقادیر در یه دستور INSERT
مقدار پیشفرض 2000 هسته و حداکثر این هم 32676 هسته. و البته با تعریف دستیش میتونید کاری کنید که تا بیلیون هم افزایش کنه: البته چون هنوز هیچکی یه همچین کاری نکرده معلون نیست که چی میشه. همچنین با توجه به این که الگوریتمشون جزو دسته O(N²) هست بنابر این اگه این محدودیت رو خیلی بالا ببرید و از یه دستور با تعداد زیاد ستون استفاده کنید میبینید که sqlite3_prepare_v2 اهسته عمل میکنه (نگفتن منظور از آهسته چقدره Biggrin ).
البته همه اینا در حالیه که یه دیتابیس استاندارد هیچوقت بیشتر از (فوقش) 100 تا ستون نیاز نداره.
همچنین میتونید با همون تابعه این شکلی در زمان Run-Time هم این مقدارو کاهش بدید:
کد:
sqlite3_limit(db,SQLITE_LIMIT_COLUMN,size)
اهم
3- Maximum Length Of An SQL Statement
SQLITE_MAX_SQL_LENGTH هم حداکثر طول یه دستور SQL رو بر حسب بایت مشخص میکنه که در حالت پیشفرض روی 1000000 هسته. و میتونید تغییرش بدید و تا حد اکثر مقدار 1073741824 ( یا اگه SQLITE_MAX_LENGTH کمتره تا حداکثر مقدار اون ) افزایش بدید.
حالا اگه دستورتون خیلی بزرگه و از رشته های شونصد میلیون رقمی توش دارید و کارتون گیره بازم نگران نباشید. میتونید با استفاده از متغیر ها این مشکلو رفع کنید. به شکلی که به جای نوشتن رشته توی دستور متغیر رو بگذارید و بعدا با sqlite3_bind_XXXX مقادیرو به دستور اضافه کنید. اینجوری هم سریعتر اجرا میشه هم نباید کوتیشن ها رو درست کنید و احتمال SQL injection کم میشه.
اینو هم میشه اینجوری در زمان اجرا کمش کرد :
کد:
sqlite3_limit(db,SQLITE_LIMIT_SQL_LENGTH,size)
اهم
4- Maximum Number Of Tables In A Join
تو SQLite توی دستور JOIN بیشتر از 64 تا جدول نمیتونید استفاده کنید. ساختارش اینجوره. اول و آخرش همینه. نه میشه کمش کرد و نه زیاد. مشکل خودتونه. اصلا نمیخواد بدوزی بده خودم ( به یاد آقا مهدی Biggrin. راستی سربازی رفت آخرش؟)

5- Maximum Depth Of An Expression Tree
جناب SQLite دستوراتو میریزن تو یه TREE و مابقی قضایا. بنابراین بنابر این که زیادی از Stack اشغال نکنن و از اینا میتونید حد اکثر عمق درخت رو با SQLITE_MAX_EXPR_DEPTH مشخص کنید که مقدار پیشفرضش 1000 هسته و اگه صفرش -0- کنید به عنوان نامحدود تعبیر میشه. ( آخ از دست این دودکش و قالب کفش. یه جا نشد اینا سر و کلشون پیدا نشه )
در زمان اجرا هم میتونید با این :
کد:
sqlite3_limit(db,SQLITE_LIMIT_EXPR_DEPTH,size)
محدودش کنید البته در صورتی که SQLITE_MAX_EXPR_DEPTH مثبت باشه . یعنی اگه SQLITE_MAX_EXPR_DEPTH صفر باشه sqlite3_limit میشه یه no-op (بر اساس پردازش های سنگینی که داشتم نتیجه گرفتم که این همون کشک خودمونه)

6- Maximum Number Of Arguments On A Function
با SQLITE_MAX_FUNCTION_ARG میتونید حداکثر تعداد پارامتر های ورودی به یه تابع SQLite رو محدود کنید. که پیشفرضش 100 هسته. البته اینو به این خاطر گذاشتن که به نتیجه رسیدن که کسی به مقداری بیشتر از این نیاز داره که بخواد حفره های امنیتی رو تو SQLite پیدا کنه ( همون کرم ریختن خودمون ). بنابراین مقدارشو کم گذاشتن.(جمله بعدی جالبه). البته چون تعداد پارامتر ها بعضی مواقع توی یه کارکتر علامت دار ریخته میشه حداکثر مقداری که میشه به SQLITE_MAX_FUNCTION_ARG داد مقدار 127 هسته ( حالا رجوع شود به جمله قبلی و قبلیش. خفه کردند خودشونو با این دلیل آوردنشون )
اینم رو میتونید اینجوری در زمان اجرا کم کنید : (حال میکنید. مورد به مورد دارم طول این جمله رو کم میکنم. به این میگن Optimize . سال اصلاح الگوی مصرفه دیگه. اصلا مورد بعدی خلاصه سازی شدید میکنم بصورت اختصاری مینویسم : ارمادزاکک : خوبه؟)
کد:
sqlite3_limit(db,SQLITE_LIMIT_FUNCTION_ARG,size)
اهم
7- Maximum Number Of Terms In A Compound SELECT Statement
اینجا مورد هفت. تعریف term : یه Select مرکب ( جوهر نه ها، منظور مخلوطه)(به این میگن شفاف سازی)(این پرانتزو کی اختراع کرد؟)، یه SELECT هسته که توش دو تا یا بیشتر SELECT دیگه با استفاده از عملگرهای UNION ، UNION ALL ، EXCEPT و یا INTERSECT به هم متصل شدند. حالا ما به هر کدوم از این SELECT های مفرد که توی یه SELECT مرکب قرار دارن میگیم "term " . حالا متفرق شید.
خب توی SQLite برای پردازش یه دستور مرکب SELECT از یه الگوریتم بازگشتی استفاده میشه و بنابراین به خاطر محدود کردن حافظه Stack ما تعداد term ها رو محدود کردیم (ما نه ها. اونا). این مقدار توسط SQLITE_MAX_COMPOUND_SELECT مشخص شده و پیشفرضش 500 هسته. اونا همچنین فکر میکنن که این زیادی سخاوتمندانه هست.
ارمادزاکک : ( مگه باهاتون شوخی دارم؟)
کد:
sqlite3_limit(db,SQLITE_LIMIT_COMPOUND_SELECT,size)
اهم
8- Maximum Length Of A LIKE Or GLOB Pattern
الگوریتم pattern matching اینا یه الگوریتم O(N²) (که N تعداد کاراکتر در pattern هسته) هسته. حالا بر اساس مسائل امنیتی. برای جلوگیری از حملات denial-of-service از طرف افراد خبیث و خدا نشناس (عین کلمه ترجمه کردما) که این قابلیت رو دارن که طول pattern رو مشخص کنن، طول pattern در LIKE و GLOB محدود میشه به SQLITE_MAX_LIKE_PATTERN_LENGTH بایت. که مقدار پیشفرض 50000 هسته. الانه یه کامپیوتر یه pattern 50000 بایتی رو هم خیلی سریع حساب میکنه. مشکل برای وقتیه که طول pattern بره روی چند ملیون بایت. البته در حالت عادی اکثرا چیزی بیشتر از 10 ،20 بایت اسفاده نمیشه بنابراین میتونید این مقدارو کمتر هم بکنید.
دزاهبادمکک : ( حالا اینو بگید مخفف چیه؟ زیاد زور نزنید. برید مورد بعدی)
کد:
sqlite3_limit(db,SQLITE_LIMIT_LIKE_PATTERN_LENGTH,size)
اهم
9- Maximum Number Of Host Parameters In A Single SQL Statement
Host Parameter همون متغیر خودمونه. که میتونید توی یه دستور SQL به جای یه مقدار قرارش بدید و مقدارو بعدا با توابع sqlite3_bind_XXXX مشخص کنید. میگن که اکثر برنامه نویسا با استفاده از ? به عنوان متغیر آشنا هستن(من که نیستم). همچنین میتونید با : و @ و $ متغیر های نامدار بسازید و با ? هم متغیر های شماره دار.
آقای SQLite حافظه لازم برای ذخیره تمام متغیر ها از صفر تا بزرگترین شماره متغیری که در دستور هست رو اشغال میکنن بنابراین اگه یه متغیر تعریف کنید اینجوری: ?1000000000 کامپیوترتون روی ارتفاعات گیر میکنه. بنابراین اومدن لطف کردن و اینم رو محدود کردن به SQLITE_MAX_VARIABLE_NUMBER که پیشفرضش هم 999 هست.
در زمان اجرا هم با این دستور میتونید کمترش کنید :
کد:
sqlite3_limit(db,SQLITE_LIMIT_VARIABLE_NUMBER,size)
اهم
10- Maximum Number Of Attached Databases
با استفاده از عبارت ATTACH میشه چند تا دیتابیس رو به یه connection چسبوند و در نتیجه ازشون به صورت یه دیتابیس واحد استفاده کرد. اینم محدود میشه به SQLITE_MAX_ATTACHED که پیشفرضش 10 هسته و حد اکثرشم 30 . خلاص.
اینم در زمان اجراش : ( جهت کسب اطلاعات بیشتر مراجعه شود با یه خط مونده به آخر های موارد بالا )
کد:
sqlite3_limit(db,SQLITE_LIMIT_ATTACHED,size)
اهم
11- Maximum Database Page Size
یه فایل SQLite از صفحات تشکیل شده. که طول این صفحات توانی از دو هسته و بین 512 و SQLITE_MAX_PAGE_SIZE . که مقدار پیشفرض برای SQLITE_MAX_PAGE_SIZE 32768 هسته و فعلا هم از این حد بیشتر نمیتونه بشه. و مثل این که پیش فرضش هم 1024 هسته

12- Maximum Number Of Pages In A Database File
اینم برای محدود کردن حجم فایل دیتابیس به کار میره. SQLITE_MAX_PAGE_COUNT حداکثر تعداد صفحات رو مشخص میکنه که پیشفرض 1073741823 هسته و اگه به این اندازه رسید فایل دیگه دستور برای اضافه کردن چیزی باعث یه خطا میشه.
در زمان اجرا هم با استفاده از PROGMA به شکل زیر میتونید این محدودیت رو کم و زیاد کنید:
کد:
PRAGMA max_page_count = N;
البته حواستون باشه که مقدار این نمیتونه از سایز فعلی فایل کمتر بشه.


پاورقی:
زیاد به این "اهم" ها گیر ندید. برای درست شدن راست به چپ و اینا است.
به امید دیدار.

میزان رای دشمن است!
[تصویر:  cff100.png]
(آخرین ویرایش در این ارسال: ۳۰-فروردین-۱۳۸۸, ۲۱:۱۸:۳۸، توسط ajlajlajl.)
۲۴-فروردین-۱۳۸۸, ۱۸:۰۶:۴۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : amirjan, hoax3r, far_222000, man4toman
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #9
یه تست
یه تست
خب بهتره حالا دیگه یه تستی بزنیم. همونطور که میدونید و گفتیم SQLite با زبون C نوشته شده. پس اینجا هم با همین زبون مثال و ... میاریم. برای زبونای دیگه هم اگه شد بعدا.
خب پس مراحل زیر رو طی کنید:
1- فایل dll مربوط به سیستم عاملتونو از سایت www.sqlite.org/download.html بگیرید. همچنین میتونید کدشو بگیرید و خودتون کمپایلش کنید. ابزار SQLite رو هم بگیرید. ( یه فایل اجرایی تحت داس. در مورد اینم اگه شد بعدا توضیح میدم )
2- خب حالا باید یه دیتابس جدید بسازیم. با ابزار SQLite یه دیتابیس میسازیم به این شکل :
کد:
sqlite3 test.db
هر اسمی خواستید به جای test.db بگذارید. خب حالا دستورات SQL رو توی محیط اون وارد کنید و هر چی میخواید بهش اضافه کنید ( یا بگذارید بعدا با برنامه نویسی اینکارو بکنید ).
3- خب میرسیم به قسمت برنامه نویسیش.
یه برنامه نمونه با C رو میتونید پایین ببینید.
کد:
#include <stdio.h>
#include <sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("\n");
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  if( argc!=3 ){
    fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    exit(1);
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    exit(1);
  }
  rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}
چیزای قابل توجهش یکی sqlite3_open هست که دیتابیسو باز میکنه. sqlite3_exec هم برای اجرای دستور SQL وی دیتابیس به کار میره و sqlite3_close هم برای بستنشه.
توی پست بعدی یه مروری میکنیم روی ساختار SQLite تا قضیه بیشتر روشن بشه.

میزان رای دشمن است!
[تصویر:  cff100.png]
(آخرین ویرایش در این ارسال: ۲۵-فروردین-۱۳۸۸, ۱۶:۰۹:۳۴، توسط ajlajlajl.)
۲۵-فروردین-۱۳۸۸, ۱۶:۰۳:۰۰
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : amirjan, hoax3r, far_222000, man4toman
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #10
مقدمه ای بر رابط C/C++ در SQLite
سلام.
مقدمه ای بر رابط C/C++ در SQLite
توی ورژن های قدیمی تر SQLite فقط 5 تا تابع API وجود داشت و خیلی ملت حال میکردن باهاشون و آب خوردن و از اینا. ولی توی این ورژن های جدید با رشد قابلیت های SQLite توابع هم زیاد شدن و تا حالا که رسیدن به 150 تابع API منحصربفرد. حالا وحشت نکنید، اکثر این توابع خیلی تخصصی و بعید الکاربرده و شما همچنان با چند تا تابع معدود میتونید کاراتون پیش ببرید و نیازی به بقیهشون نداشته باشید. حتی میتونید خودتون کدشو بگیرید و توابع اضافه رو حذف کنید تا حجم هم پایین بیاد.
توی اینجا http://www.sqlite.org.com/c3ref/intro.html یه مرجع کاملی از توابع وجود داره. من فکر نکنم بخوام همه اونا رو اینجا توضیح بدم Biggrin
شما این مطلب رو که بخونید دیگه راه میفتید و میتونید از اون صفحه ای که گفتم به عنوان مرجع استفاده کنید و هر تابعی که خواستید رو توضیحاتشو ببینید. خب

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 . البته فکر نکنم ( یعنی نمیکنم Biggrin ) بخوام تمامی توابع 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 ساله هستا. خدا داند تا کی طول بکشه. ( شایدم وسط کارش کشمون پاره شد )
خب چطوره؟
راستی منم همکار مترجم قبول میکنما Biggrin . آخر کار یه کتاب SQLite میزنیم پولشم 50-50 . چطوره ؟Laugh BiggrinTongue
فعلا. به امید دیدار.

میزان رای دشمن است!
[تصویر:  cff100.png]
(آخرین ویرایش در این ارسال: ۳۰-فروردین-۱۳۸۸, ۲۱:۲۱:۱۹، توسط ajlajlajl.)
۳۰-فروردین-۱۳۸۸, ۲۱:۰۰:۴۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : far_222000, man4toman, hoax3r
ajlajlajl آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,192
موضوع‌ها: 70
تاریخ عضویت: مهر ۱۳۸۴

تشکرها : 932
( 2618 تشکر در 1020 ارسال )
ارسال: #11
Result Codes
سلام.
چه خبرا. امتحاناتم تقریبا تموم شد. یه زبان مونده که مهم نیست. تازه ترجمه میکنم تقویت هم میشم Biggrin . خب بریم سر مورد 3 یعنی Result Codes ( که زیاد هم مهم نیست )

کد:
#define SQLITE_OK           0   /* Successful result */
/* beginning-of-error-codes */
#define SQLITE_ERROR        1   /* SQL error or missing database */
#define SQLITE_INTERNAL     2   /* Internal logic error in SQLite */
#define SQLITE_PERM         3   /* Access permission denied */
#define SQLITE_ABORT        4   /* Callback routine requested an abort */
#define SQLITE_BUSY         5   /* The database file is locked */
#define SQLITE_LOCKED       6   /* A table in the database is locked */
#define SQLITE_NOMEM        7   /* A malloc() failed */
#define SQLITE_READONLY     8   /* Attempt to write a readonly database */
#define SQLITE_INTERRUPT    9   /* Operation terminated by sqlite3_interrupt()*/
#define SQLITE_IOERR       10   /* Some kind of disk I/O error occurred */
#define SQLITE_CORRUPT     11   /* The database disk image is malformed */
#define SQLITE_NOTFOUND    12   /* NOT USED. Table or record not found */
#define SQLITE_FULL        13   /* Insertion failed because database is full */
#define SQLITE_CANTOPEN    14   /* Unable to open the database file */
#define SQLITE_PROTOCOL    15   /* NOT USED. Database lock protocol error */
#define SQLITE_EMPTY       16   /* Database is empty */
#define SQLITE_SCHEMA      17   /* The database schema changed */
#define SQLITE_TOOBIG      18   /* String or BLOB exceeds size limit */
#define SQLITE_CONSTRAINT  19   /* Abort due to constraint violation */
#define SQLITE_MISMATCH    20   /* Data type mismatch */
#define SQLITE_MISUSE      21   /* Library used incorrectly */
#define SQLITE_NOLFS       22   /* Uses OS features not supported on host */
#define SQLITE_AUTH        23   /* Authorization denied */
#define SQLITE_FORMAT      24   /* Auxiliary database format error */
#define SQLITE_RANGE       25   /* 2nd parameter to sqlite3_bind out of range */
#define SQLITE_NOTADB      26   /* File opened that is not a database file */
#define SQLITE_ROW         100  /* sqlite3_step() has another row ready */
#define SQLITE_DONE        101  /* sqlite3_step() has finished executing */
/* end-of-error-codes */

فکر کنم اکثرا خودتون میفهمید اینا چیه و نیاز به توضیح اضافه تری ندارید.
اینا ثابت هایی هستن که توابع مختلف sqlite ( مثل sqlite3_exec ) به عنوان نتیجه عملیات برمیگدونن. ترجمه شونو بخوام بنویسم بینشون فکر کنم بیریخت تر بشه. توضیحاتش هم ساده است . پس ترجمه نمیکنم. (زبان چیه. تقلب میکنیم Rolleyes )

یه مدل جدید کد خطا هم هست با عنوان Extended Result Codes که بعدا میگذارم.
الان خیلی زحمت کشیدم. برم خستگی در کنم Biggrin

میزان رای دشمن است!
[تصویر:  cff100.png]
۰۸-تير-۱۳۸۸, ۱۶:۱۳:۳۴
وب سایت ارسال‌ها
پاسخ


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  سوال : چگونگی محافظت از بانک اطلاعاتی sqlite c0mmander 11 8,254 ۱۷-شهریور-۱۳۹۶, ۲۲:۲۰:۵۹
آخرین ارسال: رها96
  SQLite _Lotus_ 2 2,891 ۰۳-مرداد-۱۳۹۴, ۰۷:۵۹:۳۷
آخرین ارسال: _Lotus_
  نحوه انتقال DLL پایگاه داده Sqlite acreza 5 7,875 ۰۴-آبان-۱۳۹۱, ۲۳:۳۲:۱۰
آخرین ارسال: f.beigirad
  برنامه های مدیریت SQLite ajlajlajl 1 6,495 ۱۰-تير-۱۳۸۸, ۱۵:۱۸:۴۶
آخرین ارسال: ajlajlajl
  SQLite در دیگر زبان ها ajlajlajl 1 3,922 ۱۰-تير-۱۳۸۸, ۱۳:۱۶:۲۸
آخرین ارسال: ajlajlajl

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 1 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS