It was a huge improvement to solve the problem with a “second run” in stored procedures and binded queries. Sometimes there was an incorrect behavior because of “over-prepared” nodes. There was a workaround with “EXECUTE” statement (which is actually developed to prepare any SQL statement and execute one from another SQL statement). So now this workaround could be omitted.
Tag: 4.1
Valentina for Ruby MAC Improved
We have improved Valentina for Ruby v4 on MAC.
Now we have single UB module vruby_fat_release.dylib instead of two _ppc_ and _i586_. This still perfectly works with Ruby.
The WIKI pages about MAC INSTALL are corrected and updated.
We corrected the Valentina.rb adapter to reflect changes in the SHOW commands in v4, which now produce cursor with columns that have prefix ‘fld_’
Valentina WIKI now have section “Video Tutorials”
Here we will grow set of vide tutorials
Report Control Picture now have property to specify picture by URL/path.
As result you can show in a report not only picture from DB, but from disk or by any URL.
MakeNewReport(index, db, query = NULL, …); Query now can be NULL on default.
MakeNewReport(
inIndex as integer,
inDatabase as VDatabase,
inQuery as String = NULL,
inCursorLocation as EVCursorLocation = kClientSide,
inLockType as EVLockType = kReadOnly,
inCursorDirection as EVCursorDirection = kForwardOnly ) as VReport
Starting from 4.1 parameter inQuery can be NULL. In this case will be used original query around which was designed report, i.e. query stored inside of project.
This simplify development because there is no need to copy/paste query 2 times. In the same time you still can specify different query: e.g. with different WHERE statement.
“LIMIT N” now can be used in additional places.
Was found a problem that in a stored procedure the assignment statement do not accept SELECT with LIMIT. This problem is fixed now. So you can have
procname
BEGIN
var = SELECT f1 FROM T WHERE … LIMIT 1
END
Hierarchical (Recursive) Queries in Valentina SQL
There are three new kind of queries specially designed for recursive (hierarchical) tables.
Such kind of tables are widely used. It could be human relationships, threaded forums and anything which might be described as tree-like data.
There are few common SQL ways to operate with such structures but all of them are too far from perfect.
Valentina introduces special kind of query which looks much more clear, natural and readable.
Syntax: vext_recursive_table -- v4.1 : {ANCESTORS | BROTHERS | DESCENDANTS} OF vext_root_objects [{TO|ON} LEVEL UINT] USING link_name [WITH {ROOT | ROOTS}] vext_root_objects : UINT | variable_name | ( search_condition )
Examples:
ANCESTORS OF (RecID IN(4,5)) ON LEVEL 1 USING l1 BROTHERS OF 4 ON LEVEL 2 USING l1 SELECT * FROM (ANCESTORS OF (RecID IN(4,5)) ON LEVEL 1 USING l1) WHERE f1 = 'Branch2'
See also:
* WIKI: Valentina SQL Reference: Hierarchical (Recursive) Queries for description of exact syntax of these commands and examples.
* WIKI: Article Hierarchical (Recursive) Queries in Valentina SQL
Using of “Instead-of” triggers
Such kind of trigger may be applied to views only. It could be used for insert, update and delete operations as usual.
Example:
CREATE TRIGGER trigger1
INSTEAD OF INSERT ON v1
FOR EACH ROW
BEGIN
INSERT INTO t2 VALUES( 1 );
END ;
“trigger1” will be fired on attempt to insert record in the view “v1”.
Starting from v 4.1 you may use ‘NEW’ and ‘OLD’ descriptors within this kind of trigger.
Views are always read-only – so using the trigger is a nature way to overcome this restriction.
Example:
CREATE TABLE t1 (f1 LONG, f2 TEXT(1024));
CREATE VIEW v1 AS SELECT * FROM t1;
CREATE TRIGGER trigger1
INSTEAD OF INSERT ON v1
FOR EACH ROW
BEGIN
INSERT INTO t1 VALUES( NEW.f1, NEW.f2 );
END ;
—
INSERT INTO v1 VALUES ( 1, ‘abc’);
SELECT * FROM v1;
————-
f1 f2
————-
1 abc
————-
Improved work with TIFF format for VPicture field.
On request of Marc Schmitt, Kirill have improve work with TIFF format.
1) V4MD 4.0 was the single ADK, which did not allow specify format of picture in the VPicture.WriteAs() method. This problem fixed and now its is possible specify format as #kJPG, #kTIFF
2) But Marc did want more: he want to have SEVERAL compression methods for TIFF. We have look around and have found that TIFF compression do not use CompressionRate (1..100) as do JPG, instead it can specify kind of compression.
To not change existed API, we have decide to use parameter “INT inCompressionRate” to send compression kind also for TIFF.
3) One more fix was made — in the KERNEL itself — to pass compression kind into PAINTLIB.
4) For all other ADKs e.g. V4RB now also possible to use TIFF with compression, it needs just specify kind of compression in the 3d parameter. See WIKI docs for numeric constants. We are lazy so far to provide these constants into each Valentina ADK. So it will be good idea if you in your code will make self symbolic constant around number. Future we will provide such constants also self.
Reports on linux now much faster (10+ times)!
Igor have made great job improving speed of reports generation on linux, which uses the FreeType library (instead of wxWidgets+OS like on WIN/MAC). As result, time of report of one developer go down from 3 second to 0.3.
Actually FreeType library can be used on MAC and WIN. Just no big sense because it was much slower.
Now we see sense to enable TWO render-engines on MAC/WIN and be able switch them runtime. This will be useful for building of automated test-system for reports.
RAISE now can accept variables
RAISE statement now can accept not only NUMER and STRING constants, but also variable of a stored procedure.
RAISE errNumber, errMsg
RAISE now can re-throw exception
Up to now the statement RAISE did have syntax as:
raise errNumber [, errMsg]
Now it is
raise [errNumber [, errMsg]]
Except syntax also is implemented additional logic:
raise without parameters means throw the same exception forward.
BEGIN
INSERT INTO t1 VALUES(1);
INSERT INTO t1 VALUES(1);
EXCEPTION
WHEN 23503 THEN
PRINT 'Unique violation'
RAISE;
END;