Skip to content

Basics_ar

رامي مناف edited this page Sep 8, 2020 · 12 revisions

دورة حياة قاعدة البيانات:

بعد تنزيل قاعدة بيانات صفوف يجب عليك إضافتها إلى مسار الصّفوف ClassPath, بعدها يمكنك استخدامها لإنشاء, تشغيل, تنفيذ الأوامر على قواعد البيانات. تتبع صفوف نهجًا كما في باقي قواعد البيانات لاستخدامها, وهذا ما يوضحه المخطّط في الأسفل:

دورة حياة قاعدة البيانات

أوّلًا: إنشاء قاعدة البيانات

يتمّ تمثيل قاعدة البيانات بالصّفّ Server في الحزمة org.sofof الذي يوفر خدمة إعداد قاعدة البيانات, ويمكن إنشاء قاعدة البيانات من خلال كائن Server تم تمرير ملف قاعدة البيانات إليه من خلال الباني وتنفيذ الدّالّة createDatabase, وإن كان الملفّ الممرّر موجودًا بالفعل ستعيد الدّالّة القيمة خاطئ False ولن تقوم بعمل شيءٍ, أما في غير تلك الحالة فستعيد القيمة صحيح True وستقوم بإنشاء قاعدة البيانات, وفي حال حدوث أي خطأ إدخالٍ وإخراجٍ IO ستطلق الّدالّة الاستثناء SofofException. وهذا مثالٌ يبيّن ذلك:

import java.io.File;
import org.sofof.SofofException;
import org.sofof.Server;

public class CreateDatabase{
    public static void main(String[] args){
        try{
            new Server(new File("C:/Users/LENOVO PC/Desktop/sofofDB")).createDatabase();
        }catch(SofofException ex){
            System.err.println(ex.getMessage());
        }
    }
}

وعند فتح المجلد sofofDB ستجد ما في الصورة التالية:

يحتوي الملفّ binds على إعدادات قاعدة البيانات ومعلوماتٍ خاصةٍ بها.

ثانيًا: خادم صفوف

يقوم خادم صفوف بتوفير خدمات قاعدة البيانات, ويُوجد في الحزمة org.sofof واسمه Server, وهو عبارةٌ عن Thread, وله عدة بناة أحدهم يطلب ثلاث معاملات هم مجلد قاعدة البيانات, رقم المنفذ الّذي سيستمع الخادم له, ونوع الاتصال إن كان محميا SSL أم لا, ويمكن تشغيل الخادم من خلال الدّالّة startUp والّتي قد تطلق الاستثناء SofofException إذا حدثت مشكلة إدخالٍ وإخراجٍ أثناء قراءة إعدادات قاعدة البيانات, وهذا مثالٌ يبين طريقة تشغيل الخادم:

import java.io.File;
import org.sofof.Server;
import org.sofof.SofofException;

public class ServerStartUp{
    public static void main(String[] args) throws SofofException{
        Server server = new Server(new File("C:/Users/LENOVO PC/Desktop/sofofDB"), 6969, false);
        server.startUp();
    }
}
عند تشغيل الخادم سيقوم بقراءة إعدادات قاعدة البيانات من مجلد قاعدة البيانات, ثم سيستمع إلى المنفذ الممرّر وهو في حالتنا هذه 6969 عبر اتصال غير محمي SSL والذي حددناه من المعامل الثالث في الباني, وبما أنّ الخادم هو Thread ويتمّ وضعه تلقائيًا في حالة الخفيّة Daemon فإنّ الخادم سيُغلق تلقائيًا عند إغلاق جميع الThreads الّتي لا تحمل الصّفة Daemon, ولمنع ذلك يمكننا استخدام الدّالّة setDaemon وتمرير قيمة false لها, وعندها لن يتمّ إغلاق الخادم تلقائيًا, لذلك يجب عليك عند الانتهاء من استخدام قاعدة البيانات إغلاق الخادم عبر الدالة shutdown وإلّا لن يُغلق البرنامج وسيعمل الخادم في خلفية.

نظام المستخدمين:

لدى صفوف نظام إدارةٍ للمستخدمين يتمّ تعيينه في كلّ مرةٍ يتمّ تشغيل الخادم, ويتألف هذا النّظام من مستخدمين يُعبّر عنهم بالصّفّ User الموجود في الحزمة org.sofof.permission. يتعرّف نظام إدارة المستخدمين على المستخدم من خلال اسم المستخدم وكلمة المرور, ويتمّ تحديدهما من خلال باني الصّفّ User الوحيد الّذي يستقبل اسم المستخدم كمعاملٍ أوّلٍ وكلمة المرور كمعاملٍ ثانيٍ ثمّ يتمّ إضافته للخادم عبر الدالة getUsers().add(), ويكن تحديد صلاحيّات المستخدم عبر النّافذة SofofSecurityManager الّتي تُستخدم مع SecurityManager, وسيتمّ شرحها في فصلٍ كاملٍ لاحقًا , لكن يكفي حتى الآن معرفة أنّه سيُسمح للمستخدم بالقيام بجميع العمليات مادام لم يتمّ تحديد صلاحياته عبر SofofSecurityManager, وهذا مثالٌ يوضّح ما سبق:

import org.sofof.Server;
import org.sofof.SofofException;
import org.sofof.permission.User;
import java.io.File;

public class AdminUser{
    public static void main(String[] args) throws SofofException{
        Server server = new Server(new File("C:/Users/LENOVO PC/Desktop/sofofDB"), 6969);
        User rami = new User("rami", "manaf");
        server.getUsers().add(rami);
        server.startUp();
    }
}
## ثالثًا: الجلسات بعد إعداد الخادم وإضافة المستخدمين إليه ثمّ تشغيله لم يتبقّى لنا إلّا خطوةٌ واحدةٌ لاستخدام قاعدة البيانات, وتتمثّل هذه الخطوة بفتح اتصالٍ مع الخادم بحيث يتمّ إرسال الأوامر إلى الخادم لتنفيذها, ويسمى هذا الاتصال بالجلسة Session والّتي توجد في الحزمة org.sofof, ولبدء جلسةٍ علينا تنفيذ الدّالّة الإستاتيكية startSession الموجودة في الصّفّ SessionManager, وتطلب تلك الدّالّة ثلاث معاملات, الأول هو عنوان موفر قاعدة البيانات (الخادم) للاتصال به, ويمتلك هذا العنوان هيكلة معينة تتمثل بثلاثة أجزاء يفصل كل منها نقطتان رأسيّتان, وهي كالتالي serializer:host:port, الSerializer سيتم شرحه لاحقًا وهو يصف طريقة التواصل مع الخادم اكتب sofof مكانه أما host فهو يمثّل عنوان مضيف قاعدة البيانات (عنوان الشّبكة الخاصّ به), فمثلًا يمكن للعنوان أن يكون نطاق الخادم site.com, أو عنوان بروتوكول الشّبكة IP كما في مواقع الويب أو الشّبكات المحلّيّة, أو قد يكون localhost إذا كان الخادم يعمل على نفس الجهاز, أمّا رقم المنفذ port فيجب أن يكون نَفسه رقم المنفذ الّذي يستمع له الخادم, والمعامل الثاني في الدّالّة startSession هو المستخدم الذي سيتمّ تسجيل الدخول عبره, فإن كان المستخدم غير مسجلٍ عند الخادم ستُطلق الدّالّة الاستثناء SofofException, والمعامل الثّالث فهو عن هل سيكون الاتصال بقاعدة البيانات من طبقة الاتصالات المحميّة SSL أم لا, وبما أنّ الجلسة هي عبارةٌ عن اتّصالٍ مفتوحٍ فيجب إغلاقها بعد الانتهاء من استخدامها عبر الدّالة close, ويمكن فتح الجلسة داخل try-with-resource, وهذا مثالٌ يشرح ذلك:
import org.sofof.Server;
import org.sofof.SofofException;
import org.sofof.SessionManager;
import org.sofof.Session;
import org.sofof.permission.User;
import java.io.File;

public class Login{
    public static void main(String[] args) thorws SofofException{
        Server server = new Server(new File("C:/Users/LENOVO PC/Desktop/sofofDB"), 6969, false);
        User rami = new User("rami", "manaf");
        server.getUsers().add(rami);
        server.startUp();
        Session session = SessionManager.startSession("sofof:localhost:6969", new User("rami", "manaf"), false);
        session.close();
	}
}
## رابعًا: تنفيذ الأوامر تقسّم الأوامر في صفوف إلى تنفيذيّةٍ Executable واستعلاميّةٍ Query, أمّا التنفيذيّة فمُهمّتها القيام بالعمليّات على الكائنات في قاعدة البيانات, والاستعلاميّة تقوم بالاستعلام عن الكائنات في قاعدة البيانات, ويتمّ تنفيذ الأوامر على قاعدة البيانات من خلال الجلسة, فلتنفيذ أمرٍ تنفيذيٍّ نقوم بتمريره إلى الدالة execute الموجودة في كائن الجلسة والّتي تعيد عدد الكائنات المُتأثّرة بالأمر, أما للاستعلام عن البيانات فنقوم بتمرير الاستعلام إلى الدّالّة query والّتي تعيد قائمةً بالكائنات المُستعلم عنها, وتوجد الأوامر في الحزمة org.sofof.command. تعتمد صفوف على أسماء الرّبط في تخزين البيانات, واسم الرّبط هو اسم تربط الكائنات فيه, ويمكن تخزين كائنات أكثر من صفٍّ في نفس اسم الرّبط.

الأمر ربط

الأمر تحديد

الأمر إلغاء الربط

الأمر تحديث

الأمر التقاط

الانتقالات

النصّ التّنفيذيّ

تتلخّص مهمة النصّ التّنفيذيّ في أنّه يقوم بالعمليّات على الكائنات, إذ يمكنك تنفيذ الدّوالّ واستدعاء الحقول, ويتمّ استخدامه مثلما يتمّ استخدام لغة جافا, وهذه قواعد استخدامه:

  • يجب أن يبدأ أيّ نصٍّ تنفيذيٍّ بالرمز #.
  • يمكن كتابة أسماء الدّوالّ والحقول مباشرة.
  • إذا أردت أن تعيد نفس الكائن بدون تنفيذ أي دالة أو استدعاء أي حقل عليه فلا تكتب بعد رمز # أيّ شيءٍ.
  • يشترط كتابة القوسين في حال كتابة اسم دالّةٍ سواءً أكان للدالّة معاملاتٌ أم لا.
  • إذا أردت تنفيذ دالّةٍ أو استدعاء حقلٍ من الكائن الناتج عن تنفيذ دالّةٍ أو من الحقل المستدعى سابقًا فيكفي كتابة نقطةٍ يتبعها اسم الحقل أو الدّالّة (كما في لغة جافا).
  • عند استدعاء دالّةٍ بمعاملاتٍ فيجب وضع لواحق بحسب معاملات الدّالّة, فقد تحتاج لتمرير نصٍّ كنصٍّ, وقد تطلب الدّالّة كائنًا كمعاملٍ فتمرّره على شكل نص أو رقم, لذلك يجب الالتزام بما تطلبه الدّالّة من معاملاتٍ أثناء كتابة اللواحق, وفي حال لم تتم كتابة لاحقة فسيتمّ استخدام أنواع البيانات الافتراضيّة int وfloat للأعداد الّتي تحوي فاصلةً, وهذه هي كلّ لاحقةٍ ونوع البيانات الذي يقابلها.
  • يمكنك الوصول لمحتويات مصفوفة من خلال استخدام القوسين [] وتمرير الخانة بينهما كما في لغة جافا.
ملاحظة الرمز الصفّ
تحاط بإشارتي اقتباس مزدوجتين S String
تحاط بإشارتي اقتباس C Character
I Integer
يجب أن تتواجد فاصلة عشرية (.) F Float
L Long
H Short
D Double
B Byte
يمكن كتابتها مع النص أو الحرف أو الرقم أو الرقم بفاصلة عشرية فقط O Object

إذا كنت تريد تمرير البيانات كبيانات بدائية فيجب كتابة اللاحقة بالأحرف الصغيرة, مثلًا لتمرير int فيجب عليك كتابة اللاحقة I وهكذا. تستخدم بعض الأوامر النّصّ التّنفيذيّ, ولكلٍّ طريقته الخاصّة في استخدامه, فمثلًا أمر التحديد يسمح بتمرير النّصّ التّنفيذيّ عن طريق الباني الثاني, والذي يستقبل صفًّا في المعامل الأوّل والنّصّ في المعامل الثّاني, ويقوم الأمر بتنفيذ النّصّ على جميع الكائنات التي تم اختيارها وسيعيد الناتج من تنفيذ النّصّ عليها, فمثلًا إذا قمنا بتخزين كائنات المدارس جميعها, وأردنا استدعاء مدراء جميع المدارس, حينها سنقوم بكتابة السطر التّالي:

List directors = sess.query(new Select(School.class, "#getDirector()"));

الشّروط

المُرَتبات

استخدام قاعدة بيانات محليّة

يمكنك استخدام الخادم دون فتح أي منفذ في الجهاز, وهي خدمة يوفرها الخادم لاستخدام قاعدة البيانات من خلال كائن الخادم مباشرة, ويتم ذلك عن طريق عدم تمرير قيمة المنفذ لكائن الخادم أو تمرير -1, وتتميز هذه الخدمة بعدم وجود نظام مستخدمين, وتمكنك من تنفيذ الأوامر من خلال الدالتين execute و query, ويجدر بالذكر أن الخادم سيمنع استخدام هاتين الدالتين في حال فتح منفذًا في الجهاز لإجبار المستخدم على استخدام نظام المستخدمين.

Serializer

تقوم صفوف بفصل الخادم والجلسة عن عملية الSerialization, وهذه العملية الأساسيّة في صفوف هي تحويل الكائنات إلى بايتات byte بحيث يمكن نقلها من جهاز حاسوب لآخر, ويتم تمثيل هذه العمليّة بالنّافذة Serializer الموجود في الحزمة org.sofof.serializer, وتقوم هذه النّافذة بتحويل الكائنات إلى بايتات serialize والعكس deserialize, ولكل Serializer اسم مميز, ولدى صفوف Serializer افتراضي اسمه SofofSerializer والاسم المميّز له هو sofof, يستخدم الSerializer في عملية التواصل بين الجلسة والخادم, ويمكن تحديد الSerializer في الخادم عن طريق الدّالّة serSerializer أما في الجلسة فيتمّ إضافته باستخدام الدّالّة الإستاتيكية registerSerializer الموجودة في الصّفّ SessionManager, ولفتح اتصال يستخدم Serializer معين عليك كتابة الاسم المميّز للSerializer في القسم الأول من الurl في الدّالّة startSession. لدى صفوف ثلاثة Serializers:

  • SofofSerializer: اسمه المميز sofof, ويقوم هذا الSerializer بكتابة أسماء الحقول Fields الخاصة بالصفوف وقيمهم لذلك فأي عملية تعديل مستقبلية على الصف لن تتسبب بأي مشكلة, ويتطلب هذا الSerializer وجود باني Constructor افتراضي لا يحمل معاملات. لا تحتاج في هذا الSerializer إلى استخدام النافذة Serializable لكن سيتم تخزين كائنات الصفوف التي تستخدمها باستخدام Java Serialization API.
  • JavaSerializer: اسمه المميز java, ويستخدم داخليا Java Serialization API لتخزين الكائنات لذلك على كل صف أن يستخدم النافذة Serializable وأن يحمل الحقل _long serialVersionUID_ حتى يتم تخزينه, وسيتسبب بالمشاكل إن تم التعديل على حقول الصف إلا إن كان الصف قد عدل طريقة كتابته. ينصح باستخدام SofofSerializer بدلا منه.
  • JsonSerializer: اسمه المميز json, ويقوم بتخزين الكائنات البسيطة على شكل json, ويجب على أي صف يتم تخزينه بهذا الSerializer أن يكون له باني افتراضي بدون معاملات, ويسمح هذا الصف بتخزين الكائنات البسيطة والبيانات البدائية Primitives والنصوص والمصفوفات والمجموعات Collections, ولا يدعم حاليا المصفوفات متعددة الأبعاد.
  • <\ul>

Clone this wiki locally