Ring Documentation, Release 1.8
see execute("select * from person") + nl
nMax = colcount()
See "Columns Count : " + nMax + nl
while fetch()
See "Row data:" + nl
for x = 1 to nMax
see getdata(x) + " - "
next
end
See "Close database..." + nl
disconnect()
close()
}
46.16 MySQL Class
Methods:
Method Description/Output
info() Return string contains the MySQL Client version.
error() Get the error message from the MySQL Client.
connect(cServer,cUser,cPass,cDatabase) Connect to the MySQL database server.
close() Close the connection to the MySQL database.
query(cQuery) Execute SQL queries.
insert_id() Get the inserted row id.
result() Get the query result (data without column names).
next_result() Move to the next query result.
columns() Get a list of columns names.
result2() Get all of the column names then the query result in one list.
escape_string(cStr) Before storing binary data and special characters in the database.
autocommit(lStatus) Enable or disable the auto commit feature.
commit() Commit updates to the database.
rollback() Rollback updates to the database.
example:
Load "stdlib.ring"
omysql = new mysql
See "Test the MySQL Class Methods" + nl
omysql {
see info() + nl
connect("localhost", "root", "root","mahdb")
see "Execute Query" + nl
query("SELECT * FROM Employee")
see "Print Result" + nl
see result2()
see "Close database" + nl
close()
}
Output:
Test the MySQL Class Methods
5.5.30
46.16. MySQL Class 391
Ring Documentation, Release 1.8
Execute Query
Print Result
Id
Name
Salary
1
Mahmoud
15000
2
Samir
16000
3
Fayed
17000
Close database
46.17 SQLite Class
Methods:
Method Description/Output
open(cDatabase) Open Database.
close() Close Database.
errormessage() Get Error Message.
execute(cSQL) Execute Query.
example:
Load "stdlib.ring"
osqlite = new sqlite
See "Test the sqlite Class Methods" + nl
osqlite {
open("test.db")
sql = "CREATE TABLE COMPANY(" +
"ID INT PRIMARY KEY NOT NULL," +
"NAME TEXT NOT NULL," +
"AGE INT NOT NULL," +
"ADDRESS CHAR(50)," +
"SALARY REAL );"
execute(sql)
sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (1, 'Mahmoud', 29, 'Jeddah', 20000.00 ); " +
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " +
"VALUES (2, 'Ahmed', 27, 'Jeddah', 15000.00 ); " +
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" +
"VALUES (3, 'Mohammed', 31, 'Egypt', 20000.00 );" +
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" +
"VALUES (4, 'Ibrahim', 24, 'Egypt ', 65000.00 );"
execute(sql)
aResult = execute("select * from COMPANY")
for x in aResult
for t in x
46.17. SQLite Class 392
Ring Documentation, Release 1.8
see t[2] + nl
next
next
see copy("*",50) + nl
for x in aResult
see x["name"] + nl
next
close()
}
Output:
Test the sqlite Class Methods
1
Mahmoud
29
Jeddah
20000.0
2
Ahmed
27
Jeddah
15000.0
3
Mohammed
31
Egypt
20000.0
4
Ibrahim
24
Egypt
65000.0
**************************************************
Mahmoud
Ahmed
Mohammed
Ibrahim
46.18 Security Class
Methods:
Method Description/Output
md5(cString) Calculate the MD5 hash.
sha1(cString) Calculate the SHA1 hash.
sha256(cString) Calculate the SHA256 hash.
sha512(cString) Calculate the SHA512 hash.
sha384(cString) Calculate the SHA384 hash.
sha224(cString) Calculate the SHA224 hash.
encrypt(cString,cKey,cIV) Encrypts the data using the Blowfish algorithm.
decrypt(cString,cKey,cIV) Decrypt the data encrypted using the Encrypt() method.
randbytes(nSize) Generate a string of pseudo-random bytes.
example:
46.18. Security Class 393
Ring Documentation, Release 1.8
Load "stdlib.ring"
oSecurity = new security
See "Test the security Class Methods" + nl
oSecurity {
see md5("hello") + nl +
sha1("hello") + nl + sha256("hello") + nl +
sha512("hello") + nl + sha384("hello") + nl +
sha256("hello") + nl
list = 0:15 cKey="" for x in list cKey += char(x) next
list = 1:8 cIV = "" for x in list cIV += char(x) next
cCipher = encrypt("hello",cKey,cIV)
see cCipher + nl + decrypt(cCipher,cKey,cIV) + nl
}
46.19 Internet Class
Methods:
• download(cURL)
• sendemail(cSMTPServer,cEmail,cPassword,cSender,cReceiver,cCC,cTitle,cContent)
example:
Load "stdlib.ring"
ointernet = new internet
See "Test the internet Class Methods" + nl
ointernet {
see download("www.ring-lang.sf.net")
}
46.19. Internet Class 394
CHAPTER
FORTYSEVEN
DECLARATIVE PROGRAMMING USING NESTED STRUCTURES
In this chapter we are going to learn how to build declarative programming world using nested structures on the top of
object oriented.
We will learn about
• Creating Objects inside Lists
• Composition and Returning Objects and Lists by Reference
• Executing code after the end of object access
• Declarative Programming on the top of Object-Oriented
47.1 Creating Objects inside Lists
We can create objects inside lists during list definition. Also we can add objects to the list at any time using the Add()
function or the + operator.
Example:
alist = [new point, new point, new point] # create list contains three objects
alist + [1,2,3] # add another item to the list
see "Item 4 is a list contains 3 items" + nl
see alist[4]
add(alist , new point)
alist + new point
alist[5] { x = 100 y = 200 z = 300 }
alist[6] { x = 50 y = 150 z = 250 }
see "Object inside item 5" + nl
see alist[5]
see "Object inside item 6" + nl
see alist[6]
class point x y z
Output:
Item 4 is a list contains 3 items
1
2
395
Ring Documentation, Release 1.8
3
Object inside item 5
x: 100.000000
y: 200.000000
z: 300.000000
Object inside item 6
x: 50.000000
y: 150.000000
z: 250.000000
47.2 Composition and Returning Objects and Lists by Reference
When we use composition and have object as one of the class attributes, when we return that object it will be returned
by reference.
if the caller used the assignment operator, another copy of the object will be created.
The caller can avoid using the assignment operator and use the returned reference directly to access the object.
The same is done also if the attribute is a list (not object).
Note: Objects and Lists are treated using the same rules. When you pass them to function they are passed by
reference, when you return them from functions they are returned by value except if it’s an object attribute where a
return by reference will be done.
Example:
o1 = new Container
myobj = o1.addobj() # the assignment will create another copy
myobj.x = 100
myobj.y = 200
myobj.z = 300
see o1.aobjs[1] # print the object inside the container
see myobj # print the copy
Class Container
aObjs = []
func addobj
aobjs + new point
return aobjs[len(aobjs)] # return object by reference
Class point
x = 10
y = 20
z = 30
Output:
x: 10.000000
y: 20.000000
z: 30.000000
x: 100.000000
y: 200.000000
z: 300.000000
Example(2):
47.2. Composition and Returning Objects and Lists by Reference 396
Ring Documentation, Release 1.8
func main
o1 = new screen {
content[point()] {
x = 100
y = 200
z = 300
}
content[point()] {
x = 50
y = 150
z = 250
}
}
see o1.content[1]
see o1.content[2]
Class Screen
content = []
func point
content + new point
return len(content)
Class point
x = 10
y = 20
z = 30
Output:
x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000
Example(3):
func main
o1 = New Screen {
point() { # access the object using reference
x = 100
y = 200
z = 300
}
point() { # access the object using reference
x = 50
y = 150
z = 250
}
}
see o1.content[1]
see o1.content[2]
Class Screen
content = []
func point
content + new point
return content[len(content)] # return the object by reference
47.2. Composition and Returning Objects and Lists by Reference 397
Ring Documentation, Release 1.8
Class point x=10 y=20 z=30
Output:
x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000
47.3 Executing code after the end of object access
We can access an object using { } to use object attributes and methods.
if the object contains a method called BraceEnd(), it will be executed before the end of the object access.
Example:
New Point { See "How are you?" + nl }
Class Point x y z
func braceend
see "I'm fine, Thank you!" + nl
Output:
How are you?
I'm fine, Thank you!
47.4 Declarative Programming on the top of Object-Oriented
The next features enable us to build and use declartive programming environment using nested structures on the top
of object oriented
• using {} to access the object attributes and methods
• BraceEnd() Method
• returning objects by reference
• Setter/Getter Methods (optional)
Example:
# Declartive Programming (Nested Structures)
Screen()
{
point()
{
x = 100
y = 200
z = 300
}
47.3. Executing code after the end of object access 398
Ring Documentation, Release 1.8
point()
{
x = 50
y = 150
z = 250
}
}
# Functions and Classes
Func screen return new screen
Class Screen
content = []
func point
content + new point
return content[len(content)]
func braceend
see "I have " + len(content) + " points!"
Class point
x=10 y=20 z=30
func braceend
see self
Output:
x: 100.000000
y: 200.000000
z: 300.000000
x: 50.000000
y: 150.000000
z: 250.000000
I have 2 points!
47.5 More beautiful Code
We can get better results and a more beautiful code when we can avoid writing () after the method name when
the methods doesn’t take parameters. This feature is not provided directly by the Ring language because there is a
difference between object methods and object attributes. We can get a similar effect on the syntax of the code when
we define a getter method for the object attribute. For example instead of defining the point() method. we will define
the point attribute then the getpoint() method that will be executed once you try to get the value of the point attribute.
since we write the variable name direcly without () we can write point instead of point() and the method getpoint()
will create the object and return the object reference for us.
Example:
new Container
{
Point
{
47.5. More beautiful Code 399
Ring Documentation, Release 1.8
x=10
y=20
z=30
}
}
Class Container
aObjs = []
point
func getpoint
aObjs + new Point
return aObjs[len(aObjs)]
Class Point x y z
func braceend
see "3D Point" + nl + x + nl + y + nl + z + nl
Output
3D Point
10
20
30
47.5. More beautiful Code 400

The Ring programming language version 1.8 book - Part 43 of 202

  • 1.
    Ring Documentation, Release1.8 see execute("select * from person") + nl nMax = colcount() See "Columns Count : " + nMax + nl while fetch() See "Row data:" + nl for x = 1 to nMax see getdata(x) + " - " next end See "Close database..." + nl disconnect() close() } 46.16 MySQL Class Methods: Method Description/Output info() Return string contains the MySQL Client version. error() Get the error message from the MySQL Client. connect(cServer,cUser,cPass,cDatabase) Connect to the MySQL database server. close() Close the connection to the MySQL database. query(cQuery) Execute SQL queries. insert_id() Get the inserted row id. result() Get the query result (data without column names). next_result() Move to the next query result. columns() Get a list of columns names. result2() Get all of the column names then the query result in one list. escape_string(cStr) Before storing binary data and special characters in the database. autocommit(lStatus) Enable or disable the auto commit feature. commit() Commit updates to the database. rollback() Rollback updates to the database. example: Load "stdlib.ring" omysql = new mysql See "Test the MySQL Class Methods" + nl omysql { see info() + nl connect("localhost", "root", "root","mahdb") see "Execute Query" + nl query("SELECT * FROM Employee") see "Print Result" + nl see result2() see "Close database" + nl close() } Output: Test the MySQL Class Methods 5.5.30 46.16. MySQL Class 391
  • 2.
    Ring Documentation, Release1.8 Execute Query Print Result Id Name Salary 1 Mahmoud 15000 2 Samir 16000 3 Fayed 17000 Close database 46.17 SQLite Class Methods: Method Description/Output open(cDatabase) Open Database. close() Close Database. errormessage() Get Error Message. execute(cSQL) Execute Query. example: Load "stdlib.ring" osqlite = new sqlite See "Test the sqlite Class Methods" + nl osqlite { open("test.db") sql = "CREATE TABLE COMPANY(" + "ID INT PRIMARY KEY NOT NULL," + "NAME TEXT NOT NULL," + "AGE INT NOT NULL," + "ADDRESS CHAR(50)," + "SALARY REAL );" execute(sql) sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " + "VALUES (1, 'Mahmoud', 29, 'Jeddah', 20000.00 ); " + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " + "VALUES (2, 'Ahmed', 27, 'Jeddah', 15000.00 ); " + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" + "VALUES (3, 'Mohammed', 31, 'Egypt', 20000.00 );" + "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" + "VALUES (4, 'Ibrahim', 24, 'Egypt ', 65000.00 );" execute(sql) aResult = execute("select * from COMPANY") for x in aResult for t in x 46.17. SQLite Class 392
  • 3.
    Ring Documentation, Release1.8 see t[2] + nl next next see copy("*",50) + nl for x in aResult see x["name"] + nl next close() } Output: Test the sqlite Class Methods 1 Mahmoud 29 Jeddah 20000.0 2 Ahmed 27 Jeddah 15000.0 3 Mohammed 31 Egypt 20000.0 4 Ibrahim 24 Egypt 65000.0 ************************************************** Mahmoud Ahmed Mohammed Ibrahim 46.18 Security Class Methods: Method Description/Output md5(cString) Calculate the MD5 hash. sha1(cString) Calculate the SHA1 hash. sha256(cString) Calculate the SHA256 hash. sha512(cString) Calculate the SHA512 hash. sha384(cString) Calculate the SHA384 hash. sha224(cString) Calculate the SHA224 hash. encrypt(cString,cKey,cIV) Encrypts the data using the Blowfish algorithm. decrypt(cString,cKey,cIV) Decrypt the data encrypted using the Encrypt() method. randbytes(nSize) Generate a string of pseudo-random bytes. example: 46.18. Security Class 393
  • 4.
    Ring Documentation, Release1.8 Load "stdlib.ring" oSecurity = new security See "Test the security Class Methods" + nl oSecurity { see md5("hello") + nl + sha1("hello") + nl + sha256("hello") + nl + sha512("hello") + nl + sha384("hello") + nl + sha256("hello") + nl list = 0:15 cKey="" for x in list cKey += char(x) next list = 1:8 cIV = "" for x in list cIV += char(x) next cCipher = encrypt("hello",cKey,cIV) see cCipher + nl + decrypt(cCipher,cKey,cIV) + nl } 46.19 Internet Class Methods: • download(cURL) • sendemail(cSMTPServer,cEmail,cPassword,cSender,cReceiver,cCC,cTitle,cContent) example: Load "stdlib.ring" ointernet = new internet See "Test the internet Class Methods" + nl ointernet { see download("www.ring-lang.sf.net") } 46.19. Internet Class 394
  • 5.
    CHAPTER FORTYSEVEN DECLARATIVE PROGRAMMING USINGNESTED STRUCTURES In this chapter we are going to learn how to build declarative programming world using nested structures on the top of object oriented. We will learn about • Creating Objects inside Lists • Composition and Returning Objects and Lists by Reference • Executing code after the end of object access • Declarative Programming on the top of Object-Oriented 47.1 Creating Objects inside Lists We can create objects inside lists during list definition. Also we can add objects to the list at any time using the Add() function or the + operator. Example: alist = [new point, new point, new point] # create list contains three objects alist + [1,2,3] # add another item to the list see "Item 4 is a list contains 3 items" + nl see alist[4] add(alist , new point) alist + new point alist[5] { x = 100 y = 200 z = 300 } alist[6] { x = 50 y = 150 z = 250 } see "Object inside item 5" + nl see alist[5] see "Object inside item 6" + nl see alist[6] class point x y z Output: Item 4 is a list contains 3 items 1 2 395
  • 6.
    Ring Documentation, Release1.8 3 Object inside item 5 x: 100.000000 y: 200.000000 z: 300.000000 Object inside item 6 x: 50.000000 y: 150.000000 z: 250.000000 47.2 Composition and Returning Objects and Lists by Reference When we use composition and have object as one of the class attributes, when we return that object it will be returned by reference. if the caller used the assignment operator, another copy of the object will be created. The caller can avoid using the assignment operator and use the returned reference directly to access the object. The same is done also if the attribute is a list (not object). Note: Objects and Lists are treated using the same rules. When you pass them to function they are passed by reference, when you return them from functions they are returned by value except if it’s an object attribute where a return by reference will be done. Example: o1 = new Container myobj = o1.addobj() # the assignment will create another copy myobj.x = 100 myobj.y = 200 myobj.z = 300 see o1.aobjs[1] # print the object inside the container see myobj # print the copy Class Container aObjs = [] func addobj aobjs + new point return aobjs[len(aobjs)] # return object by reference Class point x = 10 y = 20 z = 30 Output: x: 10.000000 y: 20.000000 z: 30.000000 x: 100.000000 y: 200.000000 z: 300.000000 Example(2): 47.2. Composition and Returning Objects and Lists by Reference 396
  • 7.
    Ring Documentation, Release1.8 func main o1 = new screen { content[point()] { x = 100 y = 200 z = 300 } content[point()] { x = 50 y = 150 z = 250 } } see o1.content[1] see o1.content[2] Class Screen content = [] func point content + new point return len(content) Class point x = 10 y = 20 z = 30 Output: x: 100.000000 y: 200.000000 z: 300.000000 x: 50.000000 y: 150.000000 z: 250.000000 Example(3): func main o1 = New Screen { point() { # access the object using reference x = 100 y = 200 z = 300 } point() { # access the object using reference x = 50 y = 150 z = 250 } } see o1.content[1] see o1.content[2] Class Screen content = [] func point content + new point return content[len(content)] # return the object by reference 47.2. Composition and Returning Objects and Lists by Reference 397
  • 8.
    Ring Documentation, Release1.8 Class point x=10 y=20 z=30 Output: x: 100.000000 y: 200.000000 z: 300.000000 x: 50.000000 y: 150.000000 z: 250.000000 47.3 Executing code after the end of object access We can access an object using { } to use object attributes and methods. if the object contains a method called BraceEnd(), it will be executed before the end of the object access. Example: New Point { See "How are you?" + nl } Class Point x y z func braceend see "I'm fine, Thank you!" + nl Output: How are you? I'm fine, Thank you! 47.4 Declarative Programming on the top of Object-Oriented The next features enable us to build and use declartive programming environment using nested structures on the top of object oriented • using {} to access the object attributes and methods • BraceEnd() Method • returning objects by reference • Setter/Getter Methods (optional) Example: # Declartive Programming (Nested Structures) Screen() { point() { x = 100 y = 200 z = 300 } 47.3. Executing code after the end of object access 398
  • 9.
    Ring Documentation, Release1.8 point() { x = 50 y = 150 z = 250 } } # Functions and Classes Func screen return new screen Class Screen content = [] func point content + new point return content[len(content)] func braceend see "I have " + len(content) + " points!" Class point x=10 y=20 z=30 func braceend see self Output: x: 100.000000 y: 200.000000 z: 300.000000 x: 50.000000 y: 150.000000 z: 250.000000 I have 2 points! 47.5 More beautiful Code We can get better results and a more beautiful code when we can avoid writing () after the method name when the methods doesn’t take parameters. This feature is not provided directly by the Ring language because there is a difference between object methods and object attributes. We can get a similar effect on the syntax of the code when we define a getter method for the object attribute. For example instead of defining the point() method. we will define the point attribute then the getpoint() method that will be executed once you try to get the value of the point attribute. since we write the variable name direcly without () we can write point instead of point() and the method getpoint() will create the object and return the object reference for us. Example: new Container { Point { 47.5. More beautiful Code 399
  • 10.
    Ring Documentation, Release1.8 x=10 y=20 z=30 } } Class Container aObjs = [] point func getpoint aObjs + new Point return aObjs[len(aObjs)] Class Point x y z func braceend see "3D Point" + nl + x + nl + y + nl + z + nl Output 3D Point 10 20 30 47.5. More beautiful Code 400