Author Topic: Sqlite3 & C  (Read 1032 times)

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 188
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Sqlite3 & C
« on: August 21, 2009, 04:00:21 AM »
Sqlite3 C API

درس النهرده هيتكلم عن التعامل مع قواعد البيانات باستخدام API {Application programming interface} خاصة بمكتبة Sqlite3
بس قبل منتكلم عن ال API هنكلم عن مكتبة ال Sqlite3 نفسها وهعرفك بيها

مبدئيا تخيل نفسك دلوقتي في سيناريو مطلوب منك برنامج بيعمل تقريريات يومية عن الايردات والمصروفات وكمية البضاعه المباعه الخ الخ الي اخره
طبعا اول مسمعت الكلام دوت عينك راحت علي ال Mysql او شبيهاتها من ال data bases وبدأت فعلا في كتابة البرنامج باستخدام ال api الخاصه بال mysql
وبالفعل نزلت ال Mysql server وظبته وعملت user name و  password وعملت configuration للسرفر وكل حاجه تمام وبرنامجك شغال تمام ورحت وديته للراجل  8) وكن تحصل مشكلة رهيبه انك في كل مره هتودي البرنامج دوت لاي عميل هتضر تعمل اعداد وتنزيل لل mysql server وتقوم من اول وجديد بعمل configuration ليها في كل مره بتشغل البرنامج عن حد ! بس ارجع بالسيناريو دوت من اول وجديد وتخيل نفسك بتستخدم sqlite3
الي هنعرفها دلوقتي ونقول عنها
sqlite3 : مكتبة تحليل داخليه تقوم بتطبيق sql engine لا يحتاج الي configuration ولايعمل ك server/client

يعني بالعربي كده sqlite3 بتقوم بعمل قواعد البيانات وتخزينها في ملفات علي ال hard disk بتاعك انت مش بتاع حد تاني وتقدر تستخدم الملف دوت في برنامجك علي اساس انه قاعدة البيانات ديت وتنفيذ ال sql statements الي بتمر عل ال sql engine الي بدوره موجود بداخل ال sqlite3 الي بدورها بتقوم بعمل  ملف قاعدة البيانات وتنفيذ ال sql statments عليه  ??? ركز عشان تفهم

دلوقتي خلينا ناخد مثال بسيط علي استخدام sqlite3 تابع
اولا افتح الشيل بتاعك واكتب sqlite3 هيظهرلك interactive command line تقدر منه تنفذ ال sql statements بتاعتك وحاجات تانيه بس احنا هنتكلم عن ال sql statments بس
بنقوم بعمل ملف قاعدة بيانات جديده عن طريق تزويد اسمها كمعطي لل sqlite3
 :) يعني قاعدة البيانات بتاعتنا هتكون ملف مرفق مع البرنامج نقدر نتعامل معاه عادي جدا بدون client/server زي mysql ولا اي نوع من انواع ال configuration
Code: [Select]
root@St0rM:/home/sources/c# sqlite3 file.db
SQLite version 3.6.6.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
نبدأ بتنفيذ بعض ال sql statements
CLICK HERE

طبعا كل الكلام واضح وكده اكيد انت فهمت الي انا اقصده ولو مفهمتش اي حاجه متاخدش في بالك واقفل البراوزر لو سمحت  ???

دلوقتي نبدأ باستخدام ال api بتاعت ال sqlite3
عشان نقدر نتعامل بال sqlite3 من خلال ال c لازم يكون في header file بيقوم بتعريف ال api ومحلقاتها وال objects "استخدام الاسم هنا مضلل" الي بنستخدمها معاها
وعشان نقدر نستخدم ال interface ديت لازم نعمل link معاها
ودلوقتي هوريك ال 3 دوال الي هسنتخدمها واشرحهم واديك الكود
اولا
Code: [Select]

int sqlite3_open(const char *filedb , sqlite3** db);
داله بتقوم فتح ملف قاعدة البيانات في المسار المرر اليها في filedb وبتقوم بعمل connection handler اي حامل اتصال لقاعدة البيانات الموجوده بداخل الملف "طبعا الدرس عن استخدام المكتبه مش شرحها وبذلك مش حشرح ال handler والي بيحتويه كل الي هقوله ان بالفعل handler بيقوم بحمل الاتصال بين ال sqlite3 والملف الموجود علي الهارد ديسك بتاعك والي بيتم التعامل معاه ققاعدة بيانات
تاني داله
Code: [Select]
int sqlote3_close(sqlite3* db);
اظن واضحه قوي ! بتعمل destruction لل handler دوت يعني تحرير البيانات المخزنه فيه وقفل الاتصال بين قاعدة البيانات وال sqlite3
الداله الثالثه

Code: [Select]
int sqlite3_exec(sqlite3 *db , const char *Sql , int (*callback)(void *farg , int argc , char **argv , char **col) , void *arg , char **errmsg);
الداله ديت وظيفتها هي تنفيذ ال sql statements سواء ان كانت واحده او عدة
اول متغير هو ال connection handler
الثاني هو ال sql statement(s)
الثالث هو call back function دالة استدعاء بيتم استدعائها لما بيتم تنفيذ sql statement بتقوم بارجاع نتيجه
من ماثلة تلك ال statements هي select حيث تقوم بارجاع ماطلبته , ولما بيتم تنفيذ statement زي ديت بيتم استدعاء الداله ديت وتمرير
1-متغير من اي نوع وده انت الي بتمرره
2- عدد ال columns الي تم ارجاعها
3- ال data
4- اسماء ال columns

اما بالنسبه رابه متغير في الداله نفسها فهو المتغير الي بيتم تمريره وقت استدعاء دالة الاستدعاء
المتغير الخامس هو string buffer بيتم عمل حجز ذاكره ليه ووضع بداخله رسالة حين حدوث الخطأ

قيمة الارجاع من اي داله من دول بتكون اما SQLITE_OK وديت بيتم تعريفها علي اساس انها #define SQLLITE_OK 0 اي قيمة ارجاع صفر معناها تم نجاح العمليه
اي قيمة تانيه فهي خطأ تقدر تطلع عليها من ال documentation بتاعت ال sqlite3
ودلوقتي تطبيقنا هو برناممج صغير بيقوم بفتح مللف قاعدة بيانات وبيقوم باخذ sql statements وتنفيذها عليها , وقت متخلص وتنتهي مجرد ENTER واحده علي سطر فاضي هتنهي البرنامج
Code: [Select]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>

#define MAX_SQL_LENGTH BUFSIZ
static void usage(const char *name)
{
        fprintf(stderr , "%s \"data base file name\"\n",name);
        exit(-1);
}

static int show(void *arg , int argc , char **data , char **colname)
{
        int i;
        for(i=0 ; i < argc ; i++)
                printf("COL = %s {%s}\n",colname[i] , data[i] ? data[i] : NULL);

        return SQLITE_OK;
}

int main(int argc , char **argv)
{
        sqlite3 *handler;
        char    buffer[MAX_SQL_LENGTH] = {'\0'};
        char    *errmsg = NULL;

        if(argc < 2)
                usage(argv[0]);
        if(sqlite3_open(argv[1] , &handler) != SQLITE_OK)
        {
                fprintf(stderr , "Error:%s\n",sqlite3_errmsg(handler));
                exit(-1);
        }

        printf("Enter your sql statements to quit press ENTER\n");
        printf(":");
        while(fgets(buffer , MAX_SQL_LENGTH , stdin) != NULL)
        {
                if(buffer[0] == '\n')
                        break;
                /* remove the the new line from the sql statement , not that it bothers it
                 * but it bothers me ;)
                 */
                buffer[strlen(buffer) - 1] = '\0';
                if(sqlite3_exec(handler , buffer , show , NULL , &errmsg) != SQLITE_OK)
                {
                        fprintf(stderr ,"Error:%s\n",errmsg);
                        sqlite3_free(errmsg);
                }

                printf(":");
        }

        sqlite3_close(handler);
        return 0;
}

الكود طبعا شارح نفسه , اولا فتحنا قاعدة البيانات وتحققنا من نجاح العمليه , اذا لم تنج نقوم بطبع رسالة الخطأ الموجود بداخل حامل الاتصال عن طريق sqlite3_errmsg(sqlite3 *);
ثم بعد ذلك قمنا بعمل loop لاستقبال ال statements وتنفيذها واحده تلو الاخر
واذا حدث خطأ ما يتم التحقق من خلال if statement واذا وجد خطأ يتم طباعته وتحرير ذاكرته من خلال sqlite3_free حتي لايحدث تسرب في الذاكره
وعند الانتهاء نقوم بضغط ENTER
والان لكي تقوم بترجمة البرنامج اتبع الخطوات الاتيه

Code: [Select]
gcc -o test_program source.c -lsqlite3 

في بعض الاحيان تحدث مشاكل في ال linking وذلك راجع الي عدم تضمين مكتبة التحميل ld في ترجمة البرنامج وحلها بسيط استخدم هذا الامر
Code: [Select]
gcc -o test_program source.c -lsqlpte3 -ldl
الان سوف اعطيك مثال قمت  بتطبيقه
اللينك ده بيحتوي علي sql statements قمت بتطبيقها
حمله واحفظ متحوياته في ملف واعمل الاتي

Code: [Select]
./test file.db < sql.sql
وبعدين افتح البرنامج من اول وجديد علي نفس قاعدة البيانات واستخدم الامر select
Code: [Select]
root@St0rM:/home/sources/c# ./test file.db
Enter your sql statements to quit press ENTER
:SELECT * FROM PF;
COL = id {0}
COL = name {St0rM}
COL = job {Programmer}
COL = title {Super psycho}
COL = bio {Blah Blach blah blah}
COL = id {1}
COL = name {Striker}
COL = job {Programmer}
COL = title {The saint}
COL = bio {His bio}
:SELECT * FROM pf WHERE id=0;
COL = id {0}
COL = name {St0rM}
COL = job {Programmer}
COL = title {Super psycho}
COL = bio {Blah Blach blah blah}
:

انتهي
[/code]
« Last Edit: August 21, 2009, 04:33:59 AM by St0rM »
Logged

Ahmed Youssef

  • Helping Freak
  • Administrator
  • Active Member
  • *****
  • Posts: 242
    • View Profile
    • WWW
    • Email
Re: Sqlite3 & C
« Reply #1 on: August 21, 2009, 04:46:32 AM »
gosh!
تسلم ايديك يامعلم
Logged

Life is just a chance to grow a soul. - A. Powell
Weblog: http://ahmedyoussef.wordpress.com/

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 188
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: Sqlite3 & C
« Reply #2 on: August 21, 2009, 08:01:23 AM »
thank you ya prince  :D
Logged

black ray

  • Just Joined
  • *
  • Posts: 9
  • Be Stupid As Much As You Can
    • View Profile
Re: Sqlite3 & C
« Reply #3 on: August 29, 2009, 09:39:09 PM »
لو محدش فاهم سى وفاهم داتا بيس مظنش هيفهم ! ولا انا غلطان

Logged
Why Does Unripe Fruit Looks So Delicious ?

St0rM

  • [C programmer]
  • Administrator
  • Active Member
  • *****
  • Posts: 188
  • Why So serious ?
    • View Profile
    • WWW
    • Email
Re: Sqlite3 & C
« Reply #4 on: August 30, 2009, 05:37:11 AM »
ايوه فعلا , مش هيفهم لازم يكون معرفته بالسي مظبوته يعني فاهم يعني ايه دوال وفاهم يعني ايه متغيرات وكده , ولازم يكون عارف sql يعني عارف يعني ايه INSERT , UPDATE etc
منور
Logged