-
Notifications
You must be signed in to change notification settings - Fork 0
Basics_ar
بعد تنزيل قاعدة بيانات صفوف يجب عليك إضافتها إلى مسار الصّفوف 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();
}
}لدى صفوف نظام إدارةٍ للمستخدمين يتمّ تعيينه في كلّ مرةٍ يتمّ تشغيل الخادم, ويتألف هذا النّظام من مستخدمين يُعبّر عنهم بالصّفّ 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();
}
}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();
}
}تتلخّص مهمة النصّ التّنفيذيّ في أنّه يقوم بالعمليّات على الكائنات, إذ يمكنك تنفيذ الدّوالّ واستدعاء الحقول, ويتمّ استخدامه مثلما يتمّ استخدام لغة جافا, وهذه قواعد استخدامه:
- يجب أن يبدأ أيّ نصٍّ تنفيذيٍّ بالرمز #.
- يمكن كتابة أسماء الدّوالّ والحقول مباشرة.
- إذا أردت أن تعيد نفس الكائن بدون تنفيذ أي دالة أو استدعاء أي حقل عليه فلا تكتب بعد رمز # أيّ شيءٍ.
- يشترط كتابة القوسين في حال كتابة اسم دالّةٍ سواءً أكان للدالّة معاملاتٌ أم لا.
- إذا أردت تنفيذ دالّةٍ أو استدعاء حقلٍ من الكائن الناتج عن تنفيذ دالّةٍ أو من الحقل المستدعى سابقًا فيكفي كتابة نقطةٍ يتبعها اسم الحقل أو الدّالّة (كما في لغة جافا).
- عند استدعاء دالّةٍ بمعاملاتٍ فيجب وضع لواحق بحسب معاملات الدّالّة, فقد تحتاج لتمرير نصٍّ كنصٍّ, وقد تطلب الدّالّة كائنًا كمعاملٍ فتمرّره على شكل نص أو رقم, لذلك يجب الالتزام بما تطلبه الدّالّة من معاملاتٍ أثناء كتابة اللواحق, وفي حال لم تتم كتابة لاحقة فسيتمّ استخدام أنواع البيانات الافتراضيّة 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, ويجدر بالذكر أن الخادم سيمنع استخدام هاتين الدالتين في حال فتح منفذًا في الجهاز لإجبار المستخدم على استخدام نظام المستخدمين.
تقوم صفوف بفصل الخادم والجلسة عن عملية ال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>