भाग 1भाग ३इस भाग में, हम SQLite का उपयोग करने के कठिन मुद्दों को इसके प्रोग्राम इंटरफेस (एपीआई) के साथ काम करके संबोधित करेंगे।
SQLite API क्या है? यह C में
sqlite3_XXX फ़ंक्शंस का सेट है।
इन कार्यों के हेडर sqlite3.h में हैं, और एक बड़े एचटीएमएल के रूप में एपीआई का वर्णन
यहां है ।
हम एपीआई का उपयोग शुरू कर देंगे, और बाद में, हम इसे एक आरामदायक ढांचे में लपेटने के मुद्दों पर आगे बढ़ेंगे।
आइए C ++ में एक छोटा प्रोजेक्ट बनाने की कोशिश करें (मैंने इसे MS Visual Studio में किया) जो SQLite डेटाबेस के साथ कुछ करता है।
अपने प्रोजेक्ट में SQLite का उपयोग करने के दो तरीके हैं।
कोड को "संकलित करें" (यदि यह C या C ++ है)। या sqlite3.dll को डाउनलोड और उपयोग करें (आपको आसानी से SQLite अपडेट करने की अनुमति देता है और भाषा से बंधा नहीं है)।
किसी भी स्थिति में, आपको एक नया प्रोजेक्ट (कंसोल) एप्लिकेशन बनाने की आवश्यकता है (मैंने MS Visual Studio का उपयोग किया है) और यहाँ main.cpp जोड़ें:
# अलग करें <stdio.h>
# जीतना "sqlite3.h"
const char * SQL = "अगर Foo (a, b, c) से अधिक न हो तो सृजन कर सकते हैं; INSERT INTO FOO VALUES (1,2,3); INSERT INTO FOO Select * FROM FOO;" ;
int main ( int argc , char ** argv ) {
sqlite3 * db = 0 ; // डेटाबेस कनेक्शन ऑब्जेक्ट का हैंडल
char * ग़लती = 0 ;
// कनेक्शन खोलें
अगर ( sqlite3_open ( "my_cosy_database.dblite" , & db ) )
fprintf ( stderr , "डेटाबेस को खोलने / बनाने में त्रुटि:% s \ n" , sqlite3_errmsg ( db ) ) ;
// SQL निष्पादित करें
और यदि ( sqlite3_exec ( db , SQL , 0 , 0 , और इरेट ) )
{
fprintf ( stderr , "SQL Error:% sn" , इर ) ;
sqlite3_free ( इरेट ) ;
}
// कनेक्शन बंद करें
sqlite3_close ( db ) ;
वापसी 0 ;
}
इसके अलावा, यदि हम SQLite कोड के साथ प्रोजेक्ट को इकट्ठा करना चाहते हैं, तो हमें इसकी आवश्यकता है:
-
समामेलन के रूप में स्रोत कोड डाउनलोड करें;
- इसमें से sqlite3.h और sqlite3.c निकालें और उन्हें प्रोजेक्ट में जोड़ें।
यदि हम sqlite3.dll का उपयोग करना चाहते हैं, तो यह आवश्यक है:
-
SQLite DLL और अनज़िप डाउनलोड करें;
- "LIB.EXE /DEF:sqlite3.def" फ़ोल्डर में निष्पादित करें जहां वे sqlite3.lib पाने के लिए अनपैक किए गए थे (सुनिश्चित करें कि lib.exe के लिए पथ vcvars32.bat पर कॉल के माध्यम से पंजीकृत हैं);
- प्रोजेक्ट में sqlite3.lib शामिल करें;
-
समामेलन डाउनलोड करें और उससे sqlite3.h निकालें;
- प्रोजेक्ट में sqlite3.h को शामिल करें;
हम संकलित करते हैं, निष्पादित करते हैं (दूसरे मामले में, DLL निष्पादन योग्य फ़ाइल के लिए उपलब्ध होना चाहिए)।
पहली शुरुआत में, डेटाबेस के साथ "my_cosy_database.dblite" फ़ाइल बनाई जाएगी, इसमें एक तालिका और दो रिकॉर्ड हैं।
बाद के लॉन्च पर, प्रोग्राम मौजूदा डेटाबेस में शामिल हो जाएगा और तालिका में रिकॉर्ड की संख्या को दोगुना कर देगा।
आइए प्रोजेक्ट कोड से निपटते हैं।
SQLite का प्रयोग यह मानता है कि हम किसी प्रकार के डेटाबेस में SQL कमांड को निष्पादित करना चाहते हैं (आपका K.O!)।
एक SQLite डेटाबेस के साथ विंडोज में फाइलों के साथ काम करने की कल्पना कर सकता है। हम फाइल को खोलते हैं और फाइल का _handle_ प्राप्त करते हैं जिसमें एक निश्चित सिस्टम ऑब्जेक्ट (फाइल) "बाउंड" है। विभिन्न कार्यों के लिए इस हैंडल को पास करते हुए, हम सिस्टम को फाइल के साथ कुछ करने के लिए कहते हैं। फिर - फ़ाइल बंद करें। SQLite में भी। हम डेटाबेस से फ़ाइल खोलते हैं और "डेटाबेस से कनेक्शन" ऑब्जेक्ट का हैंडल प्राप्त करते हैं। फिर हम कॉल के माध्यम से कुछ SQL कमांड को इस हैंडल को प्राप्त करने वाले फ़ंक्शन के लिए निष्पादित करते हैं, और अंत में, कनेक्शन को बंद कर देते हैं।
जैसा कि आप देख सकते हैं, यहां मूल, विशेष या चालाक कुछ भी नहीं है।
SQLite डेटाबेस के साथ फ़ाइल एक्सटेंशन मानकीकृत नहीं है। कुछ इसे ".sqlite3" बनाते हैं, लेकिन आप कोई भी डाल सकते हैं।
समारोह
int sqlite3_open (
const char * फ़ाइल नाम , / * डेटाबेस फ़ाइल नाम (UTF-8) * /
sqlite3 ** ppDb / * OUT: SQLite db हैंडल * /
) ;
निर्दिष्ट फ़ाइल (UTF-8!) में एक डेटाबेस बनाता है या खोलता है और db में कनेक्शन संभालता है। यह 0 (सफलता) या एक त्रुटि कोड देता है। वैसे भी sqlite3_close को बंद करने की आवश्यकता है (यहां तक कि sqlite3_open त्रुटि के साथ)।
समारोह
int sqlite3_exec (
sqlite3 *, / * एक खुला डेटाबेस * /
const char * sql , / * SQL का मूल्यांकन किया जाना है (UTF-8) * /
int ( * कॉलबैक ) ( शून्य *, इंट , चार **, चार ** ) , / * कॉलबैक फ़ंक्शन * /
शून्य *, / * कॉलबैक के लिए 1 तर्क * /
चार ** ग़लती / * त्रुटि संदेश यहाँ लिखा है * /
) ;
निर्दिष्ट (खुले) डेटाबेस कनेक्शन के संदर्भ में एक SQL कमांड (UTF-8 में एक या अधिक एसक्यूएल बयानों को मिलाकर, ";") से निष्पादित होता है।
कॉलबैक फ़ंक्शन और इसके लिए एक कस्टम तर्क की आवश्यकता होती है यदि SELECT किया जाता है (डेटा पुनर्प्राप्त करने के लिए)। इस पर और बाद में, जब तक हम इसका उपयोग नहीं करते।
इरमेस्ग पैरामीटर में, आप त्रुटि पाठ प्राप्त कर सकते हैं और बाद में sqlite3_free के माध्यम से इसे साफ़ कर सकते हैं। यदि आप यहां NULL से गुजरते हैं, तो हमें त्रुटि पाठ नहीं मिलेगा।
जैसे sqlite3_open 0 या त्रुटि कोड देता है।
क्रिएट टेबल कमांड में IF NOT EXISTS क्लॉज होता है। इसका मतलब है कि यदि यह नहीं है तो तालिका बनाई जाती है। यदि है, तो कुछ भी नहीं होता है (और कोई त्रुटि नहीं है)।
बस इतना ही। इस तथ्य के बावजूद कि वास्तविक परियोजनाओं में न तो sqlite3_open का उपयोग किया जाता है (sqlite3_open_v2 के लिए अधिक शक्तिशाली कॉल है), और न ही sqlite3_exec (आमतौर पर SQL, बाइंडिंग पैरामीटर आदि को संकलित करने वाले कॉल का एक गुच्छा) काफी काम करने वाली परियोजना है।
यह एक और महत्वपूर्ण मिशन को वहन करता है। जैसा कि प्रत्येक शुरुआत में पहले ही उल्लेख किया गया है, यह फू तालिका में पंक्तियों की संख्या को दोगुना करता है। 20 शुरू होने के बाद, तालिका में ~ 2 मिलियन रिकॉर्ड होंगे।
यानी 21 वें लॉन्च में ~ 2 मिलियन रिकॉर्ड सम्मिलित हैं।
मेरी मशीन पर (विंडोज 7 x64, i5 2.8 Ghz, HDD, SSD नहीं) ~ 15 सेकंड लगे। हालांकि यह एक दयनीय और सिंथेटिक परीक्षण है, लेकिन यह फिर भी SQLite प्रदर्शन का एक निश्चित विचार देता है।
जारी रखा जाए।