Skip to content

Implementing_Sofof_ar

رامي مناف edited this page Jul 2, 2019 · 1 revision

بناء نسخة معدلة من صفوف

الأساسيات

يعتمد بناء صفوف بالأساس على Server, ListInputStream, ListOutputStream. وفيهم يحدث العمل الأساسي لصفوف والذي يتمثل بحفظ وقراءة البيانات بالإضافة لعملية الاستماع للأوامر وإدارة تنفيذها, وللبدء ببناء نسخة خاصة بك عليك البدء ببناء خادمك, وهذا الصف لا يتبع لأي شروط إلا أنه عليه أن يوفر الخدمات التي يوفرها خادم صفوف الافتراضي كقراءة ملف sofof.xml وامتلاك نظام لإدارة المستخدمين وغيرها من الخدمات الأخرى, وسيقوم المستخدم باستخدام هذا الصف مباشرة لإدارة قاعدة البيانات. ## بناء الخادم ### استقبال الأوامر

يقوم الخادم بشكل أساسي باستقبال الأوامر وتنفيذها, ويتم ذلك عن طريق الاستماع لمنفذ معين باستخدام java.io.ServerSocket, وعند استقبال طلب اتصال سيقوم الكائن Session عند المستخدم بإرسال كائن User يحمل بيانات المستخدم, ويجب على الخادم حينما يتأكد من أن المستخدم مخول له بالدخول إرسال القيمة true ولغير ذلك false ثم يقوم بقطع الاتصال. إن كان المستخدم مخولًا له بالدخول سيسمح الكائن Session عند المستخدم بإرسال الأوامر للخادم لتنفيذها, وسيقوم بإرسال القيمة true قبل إرسال أمر ليتم تنفيذه على أنه أمر تنفيذي أو false ليتم تنفيذه على أنه استعلام.

عندما يتلقى الخادم طلبًا بتنفيذ أمر تنفيذي أو تنفيذ استعلام عليه أن يتأكد من أنّ المستخدم مخولٌ له بتنفيذ هذه الأوامر عبر التّأكد من وجود SecurityManager يستخدم النافذة SofofSecurityManager, إن كان موجودًا فعليه إرسال كائن المستخدم User والأمر الذي يريد تنفيذه إلى إحدى الدّالتين checkQuery و checkExecutable وإن لم يكن المستخدم مخولًا لفعل ذلك ستطلق إحدى هاتين الدّالتين استثناء SecurityException وحينها يمكنك إرسال ذلك الاستثناء للمستخدم وسيقوم الكائن Session بإطلاق ذلك الاستثناء عند المستخدم.

للبدء بتنفيذ أمر أو استعلام يمكنك استدعاء الدّالة التي تقوم بالعمل الأساسي لدى كل من الاستعلام والأمر وهما execute وquery, ولهاتان الدّالتان معاملان يستخدمهما الأمر في القراءة والكتابة على قاعدة البيانات وهما ListInputStream وListOutputStream, وسيأتي شرح بنائهما في الفقرة التالية, وينتج عن تنفيذ الدّالتان نواتج على الخادم إرسالها للمستخدم, وقد تطلق هاتان الدّالتان استثناءًا ويمكن للخادم إرساله أيضًا للمستخدم, إذ يقوم الكائن Session عند المستخدم بانتظار نتيجة تنفيذ ما طلبه, وإن كانت النتيجة SofofException أو SecurityException سيقوم بإطلاقه عند المستخدم مباشرة.

بناء ListOutputStream

يقوم هذا الصّفّ بكتابة الكائنات على قاعدة البيانات, ويقوم أيضًا بمهمات أخرى مثل إنشاء قيم المُعَرّفات ID (انظر [العلاقات بين الكائنات](https://github.com/RamiManaf/Sofof/wiki/Objects_Relations_ar) لتعرف آلية توليد المُعَرّفات) وبدء الانتقالات Transaction, حفظها commit و إلغاءها roll back, والدّالّة الرئيسية في هذا الصف هي write, وتستقبل قائمة List بالكائنات المُراد كتابتها, اسم الرّبط (قد يكون اسم الرّبط null وعليك أن تتأكد من أنه بلا اسم من خلال تنفيذ الدّالّة Database.isNoName لمعرفة إن كان بلا اسم وحينها عليك استبداله باسم آخر تحتفظ فيه بجميع الكائنات التي ليس لها اسم ربط) والصّفّ الّذي تنتمي له الكائنات المُراد حفظها, وسيقوم الصّفّ عند تنفيذ هذه الدّالّة بكتابة جميع الكائنات مكان الكائنات القديمة الّتي ترتبط بنفس اسم الرّبط وتنتمي لنفس الصّفّ Class, إذ أنّ معماريّة ترتيب الكائنات في قاعدة بيانات صفوف تتكوّن من وحدات أساسية وهي مجموعة الكائنات List التي تنتمي لنفس الصّفّ Class وترتبط باسم ربط معين, يمكنك الآن كتابة الكائنات بالشكل الذي تريد (مشفرة, في قاعدة بيانات أخرى, على هيئة JSON أو XML أو حتى يمكنك مزامنة الكائنات مع قاعدة بيانات أخرى وتقديم الخدمة الّتي تريد للمستخدم).

الانتقالات

تتم إدارة هذه الخدمة عن طريق الثلاث دوال startTransaction, commit, rollback, إذ يتم بدء النتقال عن طريق استدعاء الدالة startTransaction ويتمّ إنهاءه بإحدى الدّالتين commit أو rollback. عندما يقوم الأمر بتنفيذ الدّالّة commit فهو يعني أنه يريد حفظ الانتقال وإنهاءه, وعندما يقوم بتنفيذ الدّالّة rollback فهو يعني أنه يريد إلغاء أيّة تغييرات أجراها على قاعدة البيانات منذ بداية الانتقال.

بناء ListInputStream

هذا الصّفّ يقوم بقراءة البيانات الّتي كتبها الصّفّ ListOutputStream, وله دالّة read الّتي تستقبل اسم الرّبط والصّفّ الذي تنتمي له الكائنات التي يريد قراءتها, ومن مهماته الأخرى أنه يقوم بالبحث في حقول الكائنات Fields وحقول حقولها إلخ عن أي كائن له حقل ID له قيمة, وعندها يجب على الصّفّ البحث عن الكائن الذي يشير له المُعَرّف ID ويضع قيمة ذلك الكائن مكان الكائن القديم, وعلى الصّفّ أن يأخذ بحساباته إمكانية إشارة كائنين إلى بعضهما البعض, وحينها عليه أن يصل الكائنين ببعضهما عن طريق مراجعهما refrances بحيث يحتوي الكائنان على مرجع referance يشير إلى الكائن الآخر.

Clone this wiki locally