أرشيف لـأغسطس, 2008

حاجة عجيبة

Posted: أغسطس 31, 2008 in General
الوسوم:,

انا تصفحت فى مواقع كتير عربية وخصوصا اللى بيقدمو منتديات لقيت شئ عجيب جدا ان الناس فاكراها دولة حقيقية لمجرد ان واحد بقة مشرف او مراقب بيفتكر نفسه خلاص! اوحتى ينظمو مؤامرات بينهم ليمشوا حد او يستفردو ب القوة العظيمة دى!

لا فعلا فى حلقة مفقودة يمكن الموضوع دا بيعوض عقدة النقص عند الناس دى ؟ وانهم مهمشين فى الحياة الحقيقية فبيحاولو يعوضو دا من الناحية الإفتراضية؟

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

نصيحة اذا لقيت نفسك بينطبق عليك الكلام اللى فوق

اعمل اعادة ترتيب لحساباتك وحاول تخلي ليك دور فعال فى الحياة الإجتماعية ممكن تشارك فى اسرة لو فى كلية ما او قدم اعمال تطوعية او ادى كورسات مثلا فى الحاجة اللى انت متفوق فيها دا هيديلك احساس بالنجاح بدل احساس النقص

ورمضان كريم 🙂

رمضان كريم

Posted: أغسطس 31, 2008 in General
الوسوم:

كل سنة وانتم طيبين وإلى الله اقرب واحب

JDBC tutorial

Posted: أغسطس 24, 2008 in Tutorials
الوسوم:,

JDBC Tutorial

JDBC اختصار ل Java Database Connectivity وهى بتقدملك طريقة موحدة لل Database access خاصة ال RDBMs

هتحتاج MySQL Server و MySQL Driver

اولا اعمل import لل java.sql

بتنقسم العملية لكذا خطوة

1- عمل Load للدريفر المناسب

Class.forName(somedriver)

2- الحصول على اتصال (Connection Object) بإستخدام Driver.getConnection()

ال getConnection بتاخد معاملات

1- url: مسار قاعدة البيانات

2- ال username: اسم المستخدم

3- ال password: كلمة السر الخاصة بال username

3- التعامل مع قاعدة البيانات من خلال Statement او PreparedStatement

للحصول على Statement object استخدم

Statement stmt=connection.createStatement();

وفيها عدة ميثودز زى

executeQuery();

لإرسال استعلامات مثل select

int executeUpdate();

لإرسال update, delete, insert مثلا..

ملحوظة ليها ريترن بال affected rows

int [] executeBatch();

لتنفيذ batch (مجموعة) من ال statements ورا بعض ودى بنحددها بإضافة

stmt.addBatch(sqlStmt)

للحصول على PreparedStatement استخدم

PreparedStatement pStmt=connection.prepareStatement(sqlStmt);

حيث ال sqlStmt دى هى اللى هتقوم بتعديل متغيراتها لاحقا

مثال

       String sqlStmt = "UPDATE users SET name=?, email=? WHERE
id=?";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

pStmt.setString(1, newName);

pStmt.setString(2, newEmail);

            pStmt.setInt(3,
id);

pStmt.executeUpdate();

هنا انشأنا String بإسم sqlStmt

String sqlStmt = "UPDATE users SET name=?, email=? WHERE
id=?";

لجملة ابديت زى ماشايفين لكن فيها 3 متغيرات مش حددنا ليهم قيمة ولكن عبرنا عنهم بعلامة استفهام

انشأنا PreparedStatement object مرتبطة بالsqlStmt اللى جهزناه

      PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

ناقص نحدد المتغيرات دى تقدر تستخدم بعض الميثودز المساعدة مثلا setString , setInt وهى ميثودز بتستبدل ال ? بقيمة ما سواء String او int ومعرفة كالتالى

.setString(idx, val);

لاحظ اننا بنبدأ اول index ب 1 مش 0 وبعد ماتستوفى كل المتغيرات تقدر تقوم بالتنفيذ

وال Stored Procedures ؟ الموضوع دا مرتبط اكتر ب SQL اغلب ال RDBMs بيدعمو ال StoredProcedure على كل حال تقدر تستدعيه بإستخدام ال CallableStatement

و معاها execute مناسبة

CallableStatement cs = con.prepareCall(“{call SHOW_USERS}”);

ResultSet res= cs.executeQuery();

تحدد ال Auto Commit بإستخدام

setAutoCommit(bool);

فى حال انك عاملها false يبقة بعد اى تعديل تستدعى

connection.commit();

ال SavePoint

اتقدم مفهوم ال SavePoint مع ال JDBC 3.0 بحيث انك تحط زى mark (علامة) تقدر تعمل rollback ليها بحيث تأمن على شغلك

كيفية الإستخدام

Savepoint sp1=connection.setSavepoint(savepointname);

connection.rollback(sp1)

تقدر تستخدم ال

connection.rollback()

لإلغاء كل مافى ال transaction الحالى

الحصول على النواتج؟النواتج او ال rows (الصفوف الناتجة) بترجع على صورة ResultSet Object

ايه رأيكم نتعرض لشرح برنامج بيتعامل مع داتابيز بإسم jdbctut فيها جدول بإسم users

معرف كالتالى

CREATE TABLE `users` (

`id` int(11) NOT NULL auto_increment,

`name` varchar(40) NOT NULL,

`email` varchar(40) NOT NULL,

PRIMARY KEY  (`id`),

UNIQUE KEY `name` (`name`,`email`)

)

ننشئ DBMgr class كالتالى

class DBMgr{

private Connection dbConnection;

private DatabaseMetaData dmd;

private final String CATALOG="jdbctut";

//Code omitted

}

هنا انشأنا كلاس بإسم DBMgr فيه 3 data members الأول dbConnection وهو اللى هيكون المسئول عن الإتصال بقاعدة البيانات وال dmd فيه الميتاداتا الخاصة بالداتابيز وال CATALOG هو final بيعبر عن اسم ال catalog وهنا jdbctut

private static Connection getConnection(){

        try{

Class.forName("com.mysql.jdbc.Driver");

System.out.println("Loaded...");

}catch(ClassNotFoundException cnfex){

cnfex.printStackTrace();

        }

        try {

                String
url="jdbc:mysql://localhost:3306/";

                return
DriverManager.getConnection(url,"root", "");

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

        return null;

    }

هنا بنعمل Load للدريفر ويمكن يتعمل throw ل ClassNotFoundException

       Class.forName("com.mysql.jdbc.Driver");

فبنهندله فى ال catch block

           String url="jdbc:mysql://localhost:3306/";

                return
DriverManager.getConnection(url,"root", "");

هنا بنحصل على اتصال بإسم ال url الخاص بالإنجن وهنا معناها اننا هنستخدم mysql الموجودة على localhost وبتشتغل على البورت 3306 من خلال ال JDBC

نجهز ال Constructor الخاص بال DBMgr

public DBMgr(){

        try {

this.dbConnection = getConnection();

this.dbConnection.setCatalog(this.CATALOG); //Setting the catalog..

            this.dmd =
this.dbConnection.getMetaData();

System.out.println("Connected..");

this.inspectMeta();

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

بنحدد الcatalog اللى هيتعامل معاه ال dbConnection من خلال setCatalog

connection.setCatalog(catalog);

لاحظ اننا بنستدعى ال inspectMeta وهى ميثود صغيرة كتبناها لعرض معلومات عن الدرايفر

public void inspectMeta(){

        try {

System.out.println("Driver: " + dmd.getDriverName());

System.out.println("Driver Ver:" + dmd.getDriverVersion());

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

بتعرض اسم الدرايفر وإصداره.. فى اكتر من كدا طبعا او تحديدا كل مايتعلق بالميتاداتا!

عايزين نعملimplement لعمليات CRUD الأساسية فى ال DBMgr

CRUD: Create Read Update Delete

1- insert

public void insertRecord(String name, String email){

        try {

            //No validations
for sake of simplicity.

            String
sqlStmt="INSERT into users (name, email) VALUES (?, ?)";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

            //1-based
indexing.

pStmt.setString(1, name);

pStmt.setString(2, email);

pStmt.executeUpdate();

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

عندنا هنا بإسم insertRecord بتاخد معاملات name, email

جهزنا ال Insert statement

       String sqlStmt="INSERT into users (name, email) VALUES
(?, ?)";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

جهزنا متغيراتها

       pStmt.setString(1, name);

pStmt.setString(2, email);

نفذنا ال update بإستخدام

       pStmt.executeUpdate();

2- delete

عندنا هنا ميثودين للحذف واحدة بإستخدام ال id والتانية بإستخدام ال name

الحذف بإستخدام ال id

public void deleteRecordByID(int id){

try {

String sqlStmt = "DELETE FROM users WHERE id=?";

PreparedStatement pStmt = this.dbConnection.prepareStatement(sqlStmt);

pStmt.setInt(1, id);

pStmt.executeUpdate();

} catch (SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

}

}

نفس الفكرة بنجهز ال statement

       String sqlStmt = "DELETE FROM users WHERE id=?";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

ونجهز متغيراتها

       pStmt.setInt(1, id);

ننفذ ال update

	pStmt.executeUpdate();

الحذف بإستخدام الname

public void deleteRecordByName(String name){

        //UNIQUE..

        try {

            String sqlStmt =
"DELETE FROM users WHERE name=?";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

pStmt.setString(1, name);

pStmt.executeUpdate();

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

هنا مش هنواجه مشكلة بما ان الإسم معرف على انه UNIQUE

3- ال update

public void updateRecord(int id, String newName, String newEmail){

        try {

            String sqlStmt =
"UPDATE users SET name=?, email=? WHERE id=?";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

pStmt.setString(1, newName);

pStmt.setString(2, newEmail);

            pStmt.setInt(3,
id);

pStmt.executeUpdate();

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

هنا بيتم تعديل record معين بإستخدام ال id

نجهز ال statement

       String sqlStmt = "UPDATE users SET name=?, email=? WHERE
id=?";

PreparedStatement pStmt =
this.dbConnection.prepareStatement(sqlStmt);

نجهز متغيراتها

       pStmt.setString(1, newName);

pStmt.setString(2, newEmail);

            pStmt.setInt(3,
id);

ننفذ ال update

       pStmt.executeUpdate();

4- read

عايزين نبقة نعرض كل ال records اللى فى ال users catalog

public void viewRows(){

try {

String sqlStmt = "SELECT * FROM users ORDER BY id ASC"; //ASC is the default.

//Ordered

Statement stmt = dbConnection.createStatement();

ResultSet res = stmt.executeQuery(sqlStmt);

//First print the columns.

ResultSetMetaData rsmd=res.getMetaData();

int nOfCols=rsmd.getColumnCount();

for(int i=1; i<=nOfCols; i++){

if(i==1){

System.out.print(String.format("%5s",rsmd.getColumnName(i)));

continue;

}

System.out.print(String.format("%15s",rsmd.getColumnName(i)));

}

System.out.println();

while(res.next()){

//ID Name Email ...

int id=res.getInt("id");

String name=String.format("%20s",res.getString("name"));

String email=String.format("%20s",res.getString("email"));

System.out.println(id +name +email);

}

} catch (SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

}

}&#91;/sourcecode&#93;
<p style="margin-bottom:0;" align="left"></p>
<p style="margin-bottom:0;" dir="rtl" align="right"><span style="font-family:Tahoma;"><span lang="ar-EG">اوكى مش تتخض</span></span></p>
<p style="margin-bottom:0;" dir="rtl" align="right">1- <span style="font-family:Tahoma;"><span lang="ar-EG">ال </span></span>SQL statement <span style="font-family:Tahoma;"><span lang="ar-EG">للإستعلام عن ال</span></span>records</p>
<p style="margin-bottom:0;" align="left"></p>


       String sqlStmt = "SELECT * FROM users ORDER BY id ASC";
//ASC is the default.

2- ننشئ statement object وننفذ ال sqlStmt بإستخدام executeQuery واللى ناتجها هيكون ResultSet

       Statement stmt = dbConnection.createStatement();

            ResultSet res =
stmt.executeQuery(sqlStmt);

3- محتاجين نطبع اسامى ال columns اللى اتعمل عليها الإستعلام .. نقدر نحصل عليها من خلال ال ResultSetMetaData object اللى تقدر تحصل عليه من خلال

res.getMetaData();

فالفكرة هنا اننا نجيب عددهم ودا بإستخدام ال getColumnCount الموجودة بال metadata الخاصة ب res

       int nOfCols=rsmd.getColumnCount();

نعمل لوب صغيرة نحصل بيها على اسم كل column ودا بإستخدام

getColumnName(idx)

	for(int i=1; i<=nOfCols; i++){

if(i==1){ // ID

System.out.print(String.format("%5s",rsmd.getColumnName(i)));

continue;

}

System.out.print(String.format("%15s",rsmd.getColumnName(i)));

}&#91;/sourcecode&#93;
<p style="margin-bottom:0;" align="left"></p>
<p style="margin-bottom:0;" dir="rtl" align="right"><span style="font-family:Tahoma;"><span lang="ar-EG">مش تشغل نفسك بال </span></span>1 <span style="font-family:Tahoma;"><span lang="ar-EG">وغيرها دى لمجرد ال </span></span>formating</p>
<p style="margin-bottom:0;" dir="rtl" align="right"></p>
<p style="margin-bottom:0;" dir="rtl" align="right"><span style="font-family:Tahoma;"><span lang="ar-EG">نرجع لل </span></span>ResultSet</p>
<p style="margin-bottom:0;" dir="rtl" align="right"><span style="font-family:Tahoma;"><span lang="ar-EG">ال </span></span>res <span style="font-family:Tahoma;"><span lang="ar-EG">هنا بتعبر عن كل الصفوف الناتجة وليها عدة ميثودز مفيدة مثلا </span></span>first, last <span style="font-family:Tahoma;"><span lang="ar-EG">و </span></span>next <span style="font-family:Tahoma;"><span lang="ar-EG">وهكذا</span></span></p>
<p style="margin-bottom:0;" dir="rtl" align="right"><span style="font-family:Tahoma;"><span lang="ar-EG">احنا اللى يهمنا هنا اننا نعمل لوب على كل الصفوف ونعرضها</span></span></p>
<p style="margin-bottom:0;" align="left"></p>


  while(res.next()){

                //ID Name Email ...

                int id=res.getInt("id");

                String name=String.format("%20s",res.getString("name"));

                String email=String.format("%20s",res.getString("email"));

               System.out.println(id +name +email);

            }

        } catch
(SQLException ex) {

Logger.getLogger(DBMgr.class.getName()).log(Level.SEVERE, null, ex);

        }

هنا كل صف فيه التالى

id, name, email

ال id عبارة عن int وال name, email عبارة عن varcharS

فبنحصل على القيمة المناسبة من كل عمود مثلا ال id بنحصل عليه ب getInt

والname, email بنحصل عليهم ب getString

لاحظ ان كل منهم بتاخد معامل بإسم ال label –الخاص بال عمود او بال index الخاص بيه انا شايف ان استخدام الإسم اسهل !؟

فى غيرهم كتير مثل getFloat و getBLOB و getBooleanو getDoubleو getDate وgetArray وgetByte و getTime و getTimestamp و.. إلخ وهكذا بنفس الفكرة

للresult set عدة ميثودز زى ماقلنا منها

next()

بتنقلنا للصف الجديد

first()

بتنقل ال cursor للصف الأول

beforeFirst()

بتنقل ال cursor للبداية

afterLast()

بتنقل ال cursor للنهاية

last()

بتنقل ال cursor للصف الأخير

وليهم ال checks مثل

isFirst(), isLast(), isBeforeFirst(), isAfterLast();

تقدر تحدد بعض خصائص الResultSet Object

TYPE_FORWARD_ONLY

للأمام فقط

TYPE_SCROLL_INSENSITIVE

TYPE_SCROLL_SENSITIVE

الإتنين بيسمحولك تتحرك forward, backword لكن الفرق فى حساسيتهم ناحية اى تغيير وهما opened

CONCUR_READ_ONLY

بتحدد هل هى للقراءة فقط ؟

CONCUR_UPDATABLE

ولا قابلة للتحديث؟

تحديد الخصائص دى من خلال ال Statement اللى بيتم انشاءها

Statement stmt = con.createStatement(

ResultSet.TYPE_SCROLL_INSENSITIVE,

ResultSet.CONCUR_READ_ONLY);

وفى حال عدم تحديدها هيكون

TYPE_FORWARD_ONLY, CONCUR_READ_ONLY

Download

Refs:

JDBC API Tutorial/Reference 3rd Edition

Python/MySQL

Posted: أغسطس 19, 2008 in Tutorials

Python/MySQL

MySQLdb هى Interface بتسمحلك بالتعامل مع MySQL من خلال بايثون

اوكى القصة بدأت ان اتعمل wrap لل MySQL C APIs بصورة OO

فى امثلة لشكل ال APIs

http://mysql-python.sourceforge.net/MySQLdb.html#id5

جميل احنا تعاملنا كله من خلال ال MySQLdb وهى عملت wrap ل _mysql انترفيس لضمان التكافئ مع ال DB API specifications هتكون PEP 249

اولا ال connect

connect(…)

هى المسئولة عن انشاء الإتصال بقاعدة البيانات وبتعمل ريترن ب Connection Object لازم عشان ننشئ اتصال نحتاج شوية معلومات زى ال

  • host

    ودا بيعبر عن الهوست اللى هيتم الإتصال عليه(الإفتراضى localhost )

  • user

    اسم المستخدم (الإفتراضى المستخدم الحالى )

  • passwd

    الباسورد الخاص بإسم المستخدم (افتراضى لايوجد)

  • db

    قاعدة البيانات (الإفتراضى لأ)

  • port

    زى مانت عارف ال MySQL ليها server ودا البورت بيعبر عن ال TCP Port اللى بيستخدمه السرفر وافتراضيا 3306 (عدله لو قمت بتغييره!)

  • ssl

    لإنشاء SSL Connection (ملحوظة :throws exception لو غير مدعم!)

  • compress

    لتفعيل ال compression (الإفتراضى لأ)

  • connect_timeout

    تحدد زمن ال timeout

  • charset

    اذا تم اضافتها هيتم تضمين use_unicode=True

  • sqlmode

    لتحديد ال sqlmode (يفضل تراجع MySQL documentation)

تقدر تحدد الكثير من الإعدادات كل اللى عليك تراجع ال MySQL Documentation

apilevel

بتحدد اى DB API مدعمة ؟ الحالى 2.0

1- اعمل import ل MySQLdb كالتالى

>>> import MySQLdb as ms

انا خليت ms كalias طبعا انت حر فى كيفية الإستدعاء

>>> ms.apilevel

'2.0'

>>> ms.threadsafety

1

اوكى ايه معنى ال threadsafety اصلا ؟

هى عبارة عن رقم بين [0, 3]

0-

بيعنى ان ال threads مش تقدر تشارك فى ال module

1-

ان ال threads تقدر تشارك فى ال module ولكن مش ال connections

2-

ان ال threads تقدر تشارك فى ال module وال connections ولكن مش ال cursors (هنتكلم عنها)

3-

اعلى شئ وهى امكانية المشاركة الكاملة فى ال module, connections و الcursors

paramstyle

سترينج بيعبر عن طريقة التعامل مع ال queries من خلال المدخلات يعنى مثلا احيانا فى ناس بتستخدم

؟ (علامة استفهام) او طريقة %s او حتى استخدام الأرقام :1 و :2 وهكذا (حسب الترتيب) فالديفولت هو format

>>> ms.paramstyle

'format'

ال Exceptions/Errors المرتبطة هنا هما Errors مشتقين من Error

ينقسمو الى

1- IntefaceError ودا بيعبر عن ايرور فى الإنترفيس المستخدمة مش ال داتابيز

2- DatabaseError بيعبر عن ايرور فى قاعدة البيانات وتنقسم لكذا شئ اهمهم

DataError مشاكل مع الداتا

OperationalError ايرور اثناء تنفيذ عملية معينة

ProgrammingError فشل فى تنفيذ sql command معين

NotSupportedError عملية غير مدعمة!

1- ال Connection Objects

هى اوبجكتس بيتم اعادتها عند الإتصال بقاعدة بيانات وليها عدة ميثودز

* close()

لغلق الإتصال

* commit()

لتنفيذ ال transaction الحالى (مش هتفرق فى حال مش فى تدعيم لل transactions اصلا او ال auto commit مفعلة)

*rollback()

الغاء ال transaction الحالى (نفس الملحوظة السابقة ولكن لاحظ فى حال انهاء الإتصال وعدم ال commit هيتم عمل rollback اتوماتيك!)

* cursor()

* set_sql_mode(sqlmode)

بتحدد ال sqlmode (يفضل تراجع ال MySQL documentation )

* set_character_set(charset)

تحديد ال characterset

للحصول على cursor (هنتعرض ليه)

2- ال Cursor Objects

بكل بساطة طالما عندك اتصال بقاعدة بيانات يبقة انت محتاج * تتفاعل * معاها عن طريق تنفيذ SQL statements معينة فال cursor بيقوم بدور الوسيط بينكم بيسمحلك تنفذ SQL statements وبيسمحلك تتعامل مع الrows الناتجة

ال Cursor ليه شوية fields و methods اهمهم

execute(sqlstmt args)

بتقوم بتنفيذ Sql Statement على قاعدة البيانات وبيتم تجهيزها قبل التنفيذ ب args فى حال لو انت قررت تعمل late binding

where name=?

او

where name=:name

وهكذا

rowcount

عدد الصفوف الناتجة من تنفيذ اخر امر

callproc(proc, args)

لإستدعاء stored procedure!

fetchone()

الحصول على صف واحد من الناتج

fetchmany()

للحصول على عدد معين من الصفوف تم تحديده من خلال arraysize (تبع ال cursor وبتعبر عن عدد الصفوف)

arraysize

بتعبر عن رقم الصفوف اللى هيتم اعادته من خلال الfetchmany method

fetchall()

للحصول على كل ال الصفوف الناتجة

rownumber

ال index الخاص ب ال cursor!

نختم بمثال (جزء من برنامج حالى استخدمت فيه MySQL كbackend)

CREATE TABLE `users` (

`id` int(11) NOT NULL auto_increment,

`username` varchar(50) NOT NULL,

`password` varchar(50) NOT NULL,

`state` tinyint(2) NOT NULL,

PRIMARY KEY  (`id`),

UNIQUE KEY `username` (`username`)

) ;

محتاجين نطبق CRUD على الجدول دا من خلال Python/MySQL

Create/Read/Updata/Delete

1- استدعى MySQLdb

import MySQLdb as ms

2- انشئ كلاس DBMan

class DBMan(object):

def __init__(self, dbname="pyim"):

self._dbname=dbname

self._sqlconnection=ms.connect(host="localhost",

user="root",

passwd="",

db="pyim" )

self._sqlcursor=self._sqlconnection.cursor()

لاحظ فى ال constructor محدين اسم ال database ك pyim

وحددنا البيانات وانشئنا Connection object بإسم self._sqlconnection

وحصلنا على cursor منه بإسم self._sqlcursor

إضافة مستخدم جديد

def addUser(self, username, pwd, state=State.Offline):

#State.Offline=1

md5edpass=self._md5(pwd)

sqlstmt="INSERT INTO users VALUES(NULL, '%s', '%s', %d)"%(username, md5edpass, state)

try:

self._sqlcursor.execute(sqlstmt)

self._sqlconnection.commit()

except Exception, e:

print e.message

حذف مستخدم

def deleteUser(self, username):

sqlstmt="DELETE FROM users WHERE username='%s'"%username

try:

self._sqlcursor.execute(sqlstmt)

self._sqlconnection.commit() #commit

except Exception, e:

print e.message

تسجيل دخول

def login(self, username, pwd):

md5edpass=self._md5(pwd)

sqlstmt="SELECT username, password FROM users WHERE username='%s' AND password='%s'"%(username, md5edpass)

self._sqlcursor.execute(sqlstmt)

if self._sqlcursor.fetchone():

self.setState(State.Online, username)

تغيير الحالة

def setState(self, state, username):

        sqlstmt="UPDATE
users SET state=%d WHERE username='%s'"%(state, username)

        try:

self._sqlcursor.execute(sqlstmt)

        except Exception, e:

            print
e.message

عرض الكل

def getAllUsers(self):

        sqlstmt="SELECT
username, state FROM users"

self._sqlcursor.execute(sqlstmt)

        for row in
self._sqlcursor.fetchall():

            yield row[0],
row[1]

ملحوظة: انا هنا ناقشت MySQLdb من خلال مفهوم ال DB API بمعنى ان نفس المبادئ هتلقيها ثابتة فى اى انترفيس هتستخدمها

ومازلنا منتظرين DB API 3

Refs:

MySQLdb 1.2.2 docs

Python DB API Specifications v2

Extension Methods

Posted: أغسطس 16, 2008 in Tutorials
الوسوم:,

Extension Methods

ال C# 3.0 قدمت مفهوم ال Extensions Methods بحيث انك تقدر تمد type معين بميثودز جديدة بدون الحاجة لتغيير التعريف او الوراثة

اوكى الفكرة بتتلخص فى حاجتين

1- static

2- this

1- ال static (ال Extensions Methods) هى عبارة عن static methods فى static class

2- ال this بيكون فى اول بارمتر وبعدها التايب اللى هيتم مده

ابدأ ب

	public static class Stringer
	{
	}	

دا بقة ال static class اللى فيه الميثودز اللى هنضيفها لل string

الصيغة العامة للتعريف

</pre>
public static meth_name(this type var_name[, arg0, ..., argN]){

}

عمل ميثود IsCapitalized لتشير هل السترينج دا بيبدأ بحرف Capital او لأ

		public static bool IsCapitalized(this string  somestring){
			if (! string.IsNullOrEmpty(somestring) ){
				return char.IsUpper(somestring[0]);
			}else{
				return false;
			}
		}

لاجظ انها بتدى ريترن ب bool واول بارمتر هو string و this عشان نقدر نستخدمه كالتالى

“ “.IsCapitalized() ;

اللى هيحصل فى الفعل هو التحويل لل

Stringer.IsCapitalized( “ “ );

وبس كدا بكل بساطة!

ميثود IsTitle بيهمها ان كل اول حرف فى اى كلمة من جملة يكون Upper

			if (! string.IsNullOrEmpty(somestring)){
				string[] words=somestring.Split(' ');

				foreach(string w in words){
					if (! w.IsCapitalized()){
						return false;
					}
				}
				return true;
			}else{
			   return false;
			    }

كدا نقدر نستخدمها كالتالى

“ “.IsTitle();

مام نعمل حاجة احيانا كتير بنستخدمها وهى اننا نسيف array من ال strings لفايل ما

string[]

بكل بساطة تقدر تعمل حاجة كالتالى

		public static void SaveToFile(this string[] strings, string filename){
			File.WriteAllLines(filename, strings);

التطبيق كالتالى

			string s="Hello, world!";

			Console.WriteLine("s.IsCapitalized() => {0}",s.IsCapitalized());
			Console.WriteLine("s.IsTitle() => {0}", s.IsTitle());

			string[] strings={"Hello1", "Hello2", "Hello3"};
			strings.SaveToFile(@"c:\hiout");

وبس كدا
Refs:
C# 3.0 in a Nutshell, 3rd Edition

I’m With You

Posted: أغسطس 11, 2008 in General
الوسوم:

Qt-Ar

Posted: أغسطس 6, 2008 in General
الوسوم:, ,

تم افتتاح اول مجتمع عربى مختص بال Qt

الف مبروك

http://qt-ar.org/community/