The document discusses the new features and changes in Ring 1.8, including better performance, new applications like Find in Files and String2Constant, more 3D samples, compiling on Manjaro Linux, improved form designer and RingQt, and notes for extension creators. Performance improvements provide gains of 10-100% and new applications allow searching files and converting code to use constants for multi-language support.
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
The Ring programming language version 1.9 book - Part 9 of 210
1. Ring Documentation, Release 1.9
conn = PQconnectdb(conninfo)
if (PQstatus(conn) != CONNECTION_OK)
fputs(stderr, "Connection to database failed: "+PQerrorMessage(conn))
call exit_nicely(conn)
ok
res = PQexec(conn, "
DROP DATABASE mahdb;
")
if PQresultStatus(res) != PGRES_TUPLES_OK
fputs(stderr, "Remove failed: " + PQerrorMessage(conn))
PQclear(res)
ok
PQclear(res)
res = PQexec(conn, "CREATE DATABASE mahdb;")
if PQresultStatus(res) != PGRES_TUPLES_OK
fputs(stderr, "Create database failed: " + PQerrorMessage(conn))
PQclear(res)
ok
res = PQexec(conn, "
CREATE TABLE COMPANY (
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL );
")
if PQresultStatus(res) != PGRES_TUPLES_OK
fputs(stderr, "Create Table failed: " + PQerrorMessage(conn))
PQclear(res)
ok
PQclear(res)
res = PQexec(conn, "
INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Mahmoud' , 31, 'Jeddah', 10.00 ),
(2, 'Ahmed' , 27, 'Jeddah', 20.00 ),
(3, 'Mohammed', 33, 'Egypt' , 30.00 ),
(4, 'Ibrahim' , 24, 'Egypt ', 40.00 );
")
if PQresultStatus(res) != PGRES_TUPLES_OK
fputs(stderr, "Insert Table failed: " + PQerrorMessage(conn))
PQclear(res)
ok
PQclear(res)
res = PQexec(conn, "
select * from COMPANY
")
if PQresultStatus(res) != PGRES_TUPLES_OK
fputs(stderr, "Select failed: " + PQerrorMessage(conn))
PQclear(res)
call exit_nicely(conn)
4.7. RingPostgreSQL Extension 49
2. Ring Documentation, Release 1.9
ok
nFields = PQnfields(res)
for i = 1 to nFields
? PQfname(res, i-1)
next
? copy("*",60)
for i = 1 to PQntuples(res)
for j=1 to nFields
see PQgetvalue(res, i-1, j-1) + " "
next
see nl
next
PQclear(res)
PQfinish(conn)
Output:
id
name
age
address
salary
************************************************************
1 Mahmoud 31 Jeddah 10
2 Ahmed 27 Jeddah 20
3 Mohammed 31 Egypt 30
4 Ibrahim 24 Egypt 40
For more information check the PostgreSQL Chapter in the documentation
4.8 Deploying Web applications in the Cloud
We created a new project and tutorial to explain how to deploy Ring web applications in the Cloud using Heroku
Demo : http://testring.herokuapp.com/
Project : https://github.com/ring-lang/RingWebAppOnHeroku
Heroku Website : https://www.heroku.com/
4.8. Deploying Web applications in the Cloud 50
3. Ring Documentation, Release 1.9
For more information check the Deploying Web Applications In The Cloud chapter in the documentation.
4.9 Better RingQt
1. The next classes are added to RingQt
• QDrag
• QMimeData
• QDropEvent
• QDragMoveEvent
• QDragEnterEvent
• QDragLeaveEvent
• QClipboard
• QChildEvent
• QGeoPositionInfo
• QGeoCoordinate
• QGeoAddress
• QGeoAreaMonitorInfo
• QGeoAreaMonitorSource
• QGeoCircle
• QGeoPositionInfoSource
4.9. Better RingQt 51
4. Ring Documentation, Release 1.9
• QGeoRectangle
• QGeoShape
• QGeoSatelliteInfo
• QGeoSatelliteInfoSource
• QNmeaPositionInfoSource
• QAxWidget
• QTextStream
• QPrinterInfo
• QPrintPreviewWidget
• QPrintPreviewDialog
• QPageSetupDialog
• QAbstractPrintDialog
• QPrintDialog
2. The next classes are updated
• QAllEvents Class : New Events (ChildAdded, ChildPolished, ChildRemoved).
• QPainter Class : Updated Methods (drawConvexPloygon, drawPoints, drawPolyline) Accept Ring list of points.
• QVariant : More versions that accept different parameters when creating the object.
• QAxBase : Different versions for the dynamicCall() and querySubObject() methods.
The next example for using the QPrintPreviewDialog class
Example:
load "guilib.ring"
new qApp {
win1 = new qwidget() {
setwindowtitle("Printer Preview Dialog")
setgeometry(100,100,800,880)
printer1 = new qPrinter(0)
show()
oPreview = new qPrintPreviewDialog(printer1) {
setParent(win1)
move(10,10)
setPaintrequestedevent("printPreview()")
exec()
}
}
exec()
}
func printPreview
printer1 {
painter = new qpainter() {
begin(printer1)
myfont = new qfont("Times",50,-1,0)
setfont(myfont)
drawtext(100,100,"Test - Page (1)")
printer1.newpage()
4.9. Better RingQt 52
5. Ring Documentation, Release 1.9
drawtext(100,100,"Test - Page (2)")
printer1.newpage()
myfont2 = new qfont("Times",14,-1,0)
setfont(myfont2)
for x = 1 to 30
drawtext(100,100+(20*x),"Number : " + x)
next
endpaint()
}
}
Screen Shot:
4.9. Better RingQt 53
6. Ring Documentation, Release 1.9
4.10 Better Memory Management
The Ring API is updated to include RING_API_RETMANAGEDCPOINTER()
Using RING_API_RETMANAGEDCPOINTER() the Ring extensions written in C/C++ languages can return a man-
aged pointer to Ring. This pointer can be controlled by the Ring VM using reference counting.
4.10. Better Memory Management 54
7. Ring Documentation, Release 1.9
This is important to avoid the need to write code that free the unmanaged resources like QPixMap objects in RingQt.
Also the Code Generator for extensions is updated to automatically use RING_API_RETMANAGEDCPOINTER()
based on need.
Syntax:
RING_API_RETMANAGEDCPOINTER(void *pValue,const char *cPointerType,
void (* pFreeFunc)(void *,void *))
For more information about RING_API_RETMANAGEDCPOINTER()
See the “Extension using the C/C++ languages” Chapter in the documentation
4.11 Better Code Generator for Extensions
1. The code generator for extensions is updated to support the <loadfile> command
<loadfile> filename.cf
This is useful to separate the extension configuraition file to many files
Example:
The file : qt_module_network.cf in the RingQt Extension
<comment>
Module (network)
</comment>
<loadfile> qabstractsocket.cf
<loadfile> qnetworkproxy.cf
<loadfile> qtcpsocket.cf
<loadfile> qtcpserver.cf
<loadfile> qhostaddress.cf
<loadfile> qhostinfo.cf
<loadfile> qnetworkrequest.cf
<loadfile> qnetworkaccessmanager.cf
<loadfile> qnetworkreply.cf
2. The code generator support the <managed> option when defining classes.
Using this option, the generator will use RING_API_RETMANAGEDCPOINTER() to return the C pointer.
So the Garabage Collector will manage these C pointers.
Example
<class>
name: QFont
para: QString, int, int, bool
managed
</class>
4.12 More Improvements
1. Ring Compiler - The Rule (Factor -> ‘-‘ Expr) changed to (Factor -> ‘-‘ Factor).
2. Ring VM - Better Error Message.
4.11. Better Code Generator for Extensions 55
8. Ring Documentation, Release 1.9
3. Better code for IsNULL() function - updated to check pointers too.
4. Better code for ringvm_evalinscope() function - used by the Trace Library.
5. Better code for Space() function.
6. Better code for Hex() and Dec() functions.
7. Better code for Download() function.
8. Better code for SubStr() function.
9. Better code for the Unsigned() function.
10. Better code for Chdir() function.
11. Better code for Tempname() function.
12. Better code for HashTable - New Key (using ring_strdup() instead of strdup() function).
13. New Function : SRandom() - Initialize random number generator.
14. New Function : IsPointer().
15. IsList() will not return True for C Pointers, we have now the IsPointer() function.
16. The ? Operator is updated to respect the ringvm_see() function.
17. Scripts to run Ring tests on Linux and macOS (Not only Windows).
18. RingAllegro is Updated from Allegro 5.1 to Allegro 5.2.
19. Shader Functions are added to RingAllegro.
20. Joystick Functions are added to RingAllegro.
21. Network functions are added to RingLibSDL.
22. Game Engine for 2D Games - Text Class - Check the font object before usage.
23. Game Engine for 2D Games - Automatic support for Joystick.
24. RingLibCurl is updated to automatically use CURLOPT_COPYPOSTFIELDS when needed.
25. Ring Notepad - Find Previous Feature.
26. Ring Notepad - Default Style.
27. Ring Notepad - Support using Non-English language (Like Arabic) in file names.
28. Form Designer - Nice Aliginment for Toolbox Icons.
29. Form Desginer - QAllEvents Class - Mouse Double Click Event.
30. Find in Files - Replace and Replace All options.
31. Qt Class Converter is updated for better conversion results.
32. More samples are added to ring/samples/other folder.
33. Code Refactoring for Ring Notepad, RingQt, Game Engine for 2D Games.
34. Better Documentation - Many images are updated to reflect the current state of Ring Environment.
35. Better Documentation - More chapters are added to the documentation.
4.12. More Improvements 56
9. CHAPTER
FIVE
WHAT IS NEW IN RING 1.8?
In this chapter we will learn about the changes and new features in Ring 1.8 release.
5.1 List of changes and new features
Ring 1.8 comes with the next features!
• Better Performance
• Find in files Application
• String2Constant Application
• StopWatch Application
• More 3D Samples
• Compiling on Manjaro Linux
• Using This in the class region as Self
• Default value for object attributes is NULL
• The For Loops uses the local scope
• Merge binary characters
• FoxRing Library
• Better Form Designer
• Better Cards Game
• Better RingQt
• Better Code Generator For Extensions
• Better Ring Compiler and VM
• Notes to extensions creators
5.2 Better Performance
Ring 1.8 is faster than Ring 1.7
The performance gain is between 10% and 100% based on the application.
Check the 3D samples in this release to get an idea about the current performance.
57
10. Ring Documentation, Release 1.9
For more information check the Performance Tips chapter.
5.3 Find in files Application
Ring 1.8 comes with Find in files application
5.4 String2Constant Application
Ring 1.8 comes with String2Constant application
Using this tool we can convert the source code to be based on constants instead of string literals
Then we can store constants in separate source code files that we can translate to different languages
Where we can have special file for each language, like (English.ring, Arabic.ring and so on)
Using this simple tool, the Form Designer is translated to the Arabic language.
For more information check the Multi-language Applications chapter.
5.3. Find in files Application 58