Saxonica Developer Community: Issueshttps://saxonica.plan.io/https://saxonica.plan.io/favicon.ico2024-01-29T17:52:37ZSaxonica Developer Community
Planio SaxonC - Bug #6333 (In Progress): Representing empty sequencehttps://saxonica.plan.io/issues/63332024-01-29T17:52:37ZO'Neil Delprattoneil@saxonica.com
<p>SaxonC currently does not properly represent empty sequences via the API. What we need is an <code>XdmEmptySequence</code> class similar to its Java counterpart. Moreover, In SaxonJ (Java) an empty <code>XdmValue</code> is also an empty sequence which can be passed as a parameter to an expression of stylesheet, but this fails in SaxonC.</p>
<p>For example:</p>
<pre><code class="python syntaxhl" data-language="python"> <span class="n">xp</span> <span class="o">=</span> <span class="n">saxonproc</span><span class="p">.</span><span class="n">new_xpath_processor</span><span class="p">()</span>
<span class="n">xp</span><span class="p">.</span><span class="n">declare_namespace</span><span class="p">(</span><span class="s">"fn"</span><span class="p">,</span> <span class="s">"http://www.w3.org/2005/xpath-functions"</span><span class="p">)</span>
<span class="n">xp</span><span class="p">.</span><span class="n">declare_variable</span><span class="p">(</span><span class="s">'p'</span><span class="p">)</span>
<span class="n">xdm_value</span> <span class="o">=</span> <span class="n">PyXdmValue</span><span class="p">()</span>
<span class="n">xp</span><span class="p">.</span><span class="n">set_parameter</span><span class="p">(</span><span class="s">'p'</span><span class="p">,</span> <span class="n">xdm_value</span><span class="p">)</span>
<span class="k">assert</span> <span class="n">xp</span><span class="p">.</span><span class="n">effective_boolean_value</span><span class="p">(</span><span class="s">"fn:empty($p)"</span><span class="p">)</span>
</code></pre>
<p>Crashes out with the following exception:</p>
<pre><code>java.lang.IllegalArgumentException: Invalid handle
at com.oracle.svm.core.handles.ObjectHandlesImpl.doGet(ObjectHandlesImpl.java:232)
at com.oracle.svm.core.handles.ObjectHandlesImpl.get(ObjectHandlesImpl.java:220)
at net.sf.saxon.option.cpp.ProcessorDataAccumulator.addProcessorDataPair(ProcessorDataAccumulator.java:93)
</code></pre>
<p>This is probably because the empty <code>PyXdmValue()</code> object is not internally getting converted to an empty sequence.</p> SaxonC - Bug #6325 (New): saxonche.PySaxonApiError: Null found in Java string conversation. Line ...https://saxonica.plan.io/issues/63252024-01-19T12:32:10ZO'Neil Delprattoneil@saxonica.com
<p>Reported by user via email.</p>
<p>The user is migrating from saxonpy to saxonche.</p>
<p>Error reported:</p>
<pre><code>saxonche.PySaxonApiError: Null found in Java string conversation. Line number: -1
</code></pre>
<p>You can find the Git repository with the relevant files and code here:</p>
<p><a href="https://github.com/sirisha09-till/xml2dita/tree/main/xml2dita" class="external">https://github.com/sirisha09-till/xml2dita/tree/main/xml2dita</a></p> SaxonC - Bug #6299 (New): Add a Makefile to the release for building of the SaxonC C/C++ API libraryhttps://saxonica.plan.io/issues/62992023-12-20T13:02:23ZO'Neil Delprattoneil@saxonica.com
<p>Reported by user here <a href="https://stackoverflow.com/questions/77684816/undefined-reference-error-when-link-to-saxon-library-in-c/77690492#77690492" class="external">https://stackoverflow.com/questions/77684816/undefined-reference-error-when-link-to-saxon-library-in-c/77690492#77690492</a></p>
<p>The SaxonC release should contain a MakeFile to build the C/C++ library. This is something we attempted to do long time ago, but for some reason we proceed with its use. Since we are now using Graalvm we should use a Makefile.</p> SaxonC - Bug #6297 (New): 12.4.1 command build errors on CentOS 7https://saxonica.plan.io/issues/62972023-12-19T11:50:46ZTony Graham
<p>Running <code>build-saxonc-commands.sh</code> on CentOS 7 generated errors about the C version, such as:</p>
<pre><code>Transform.c: In function ‘transform’:
Transform.c:33:3: error: ‘for’ loop initial declarations are only allowed in C99 mode
for (int i = 1; i < argc; i++) {
^
Transform.c:33:3: note: use option -std=c99 or -std=gnu99 to compile your code
</code></pre>
<p>After adding <code>-std=c99</code> to the GCC command lines, there were errors about <code>int64_t</code>, such as:</p>
<pre><code>In file included from ../Saxon.C.API/SaxonCGlue.c:1:0:
../Saxon.C.API/SaxonCGlue.h:92:3: error: unknown type name ‘int64_t’
int64_t value; /*!< Internal use only. The value of the parameter points
^
</code></pre>
<p>That was worked around by adding <code>#include <stdint.h></code> for <code>__LINUX__</code> and <code>__APPLE__</code> in <code>SaxonCGlue.h</code>. I don't know whether <code>#include <stdint.h></code> would be necessary for <code>__APPLE__</code>.</p>
<p>Also, it's not clear why <code>#include <stdio.h></code> is included a second time for <code>__LINUX__</code> and <code>__APPLE__</code>.</p>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gd">--- build-saxonc-commands.sh~ 2023-12-01 12:17:46.000000000 +0000
</span><span class="gi">+++ build-saxonc-commands.sh 2023-12-19 08:52:51.329869064 +0000
</span><span class="p">@@ -4,15 +4,15 @@</span>
parent_path=$( cd "$(dirname "$0")" ; pwd -P )
library_dir=${1-$(pwd -P)}/../libs/nix
#cd "$parent_path"
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm -c ../Saxon.C.API/SaxonCGlue.c -o SaxonCGlue.o $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm -c ../Saxon.C.API/SaxonCGlue.c -o SaxonCGlue.o $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Transform.c -o transform -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Transform.c -o transform -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Query.c -o query -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Query.c -o query -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
<span class="gd">-gcc -m64 -fPIC -I../Saxon.C.API/graalvm Gizmo.c -o gizmo -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Gizmo.c -o gizmo -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span>
if [ -f Validate.c ]; then
<span class="gd">- gcc -m64 -fPIC -I../Saxon.C.API/graalvm Validate.c -o validate -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span><span class="gi">+ gcc -std=c99 -m64 -fPIC -I../Saxon.C.API/graalvm Validate.c -o validate -ldl -lc SaxonCGlue.o -L$library_dir -lsaxon-hec-12.4.1 $1
</span> fi
</code></pre>
<pre><code class="diff syntaxhl" data-language="diff"><span class="gd">--- SaxonCGlue.h~ 2023-12-01 12:17:48.000000000 +0000
</span><span class="gi">+++ SaxonCGlue.h 2023-12-19 09:00:42.996931099 +0000
</span><span class="p">@@ -17,6 +17,7 @@</span>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
<span class="gi">+#include <stdint.h>
</span> #else
#include <stdint.h>
#include <windows.h>
</code></pre> SaxonC - Bug #6291 (New): Warnings for invalid keywords from transform_to_string methods on PyXsl...https://saxonica.plan.io/issues/62912023-12-15T15:06:24ZDebbie Lockettdebbie@saxonica.com
<p>The documentation for the <code>PyXslt30Processor</code> <code>transform_to_string</code> method says that the keywords <code>source_file</code> and <code>stylesheet_file</code> are required. The method currently raises a warning only when <code>len(kwds) == 0</code>. It would be better to raise a warning precisely when <code>source_file</code> and <code>stylesheet_file</code> are not both supplied.</p>
<p>Meanwhile for <code>transform_to_string</code> on <code>PyXsltExecutable</code>, there is some other confusion about supplied keywords. Here only one of <code>source_file</code> or <code>xdm_node</code> can be supplied, and a warning is raised if both are (I committed a change here yesterday to check for precisely both of these keywords, rather than <code>len(kwds) > 0</code>). (Note that it is OK to supply neither.) The other possible keywords are <code>base_output_uri</code> and <code>encoding</code>. It looks like you'll currently get a (unhelpfully worded) warning if you try to supply only <code>encoding</code> - but that should be permitted.</p> SaxonC - Feature #6290 (New): Python exceptionshttps://saxonica.plan.io/issues/62902023-12-15T13:30:42ZDebbie Lockettdebbie@saxonica.com
<p>A number of python API methods raise Exceptions. For instance methods which have a <code>**kwds</code> argument may raise an error when invalid keywords, or invalid keyword combinations, are used.</p>
<p>Raising this issue to review whether these should be <code>PySaxonApiError</code> rather than <code>Exception</code>.</p> SaxonC - Feature #6287 (New): User extension function for the C++, PHP and Python APIshttps://saxonica.plan.io/issues/62872023-12-15T10:09:44ZO'Neil Delprattoneil@saxonica.com
<p>SaxonC 12 currently does not support user extension functions written in the languages C++, PHP and Python.</p>
<p>We used to support this feature in SaxonC 11, but since we have moved from using Excelsior Jet to Graalvm as the underlying JVM engine it is no longer straightforward to reuse the JNI mechanism to do the callbacks for the extension functions.</p>
<p>Following a user request on stackoverflow (i.e. <a href="https://stackoverflow.com/questions/77641333/use-external-user-python-functions-in-a-xml-or-xslt-by-using-saxonc-12-4-for-pyt" class="external">https://stackoverflow.com/questions/77641333/use-external-user-python-functions-in-a-xml-or-xslt-by-using-saxonc-12-4-for-pyt</a>), I am adding this issue as a feature request for SaxonC 12.</p>
<p>On the Graalvm slack I have been advised that we can call C/C++ method from Java code in native using CFunction.</p>
<p>Also to consider that "C++ method is hard, you need a C proxy that calls desired method".</p> SaxonC - Bug #6276 (New): https://pypi.org/project/saxonche/ claims current print(proc.version) g...https://saxonica.plan.io/issues/62762023-12-02T10:58:42ZMartin Honnenmartin.honnen@gmx.de
<p>I am not sure this is a build problem/quirk or a documentation problem/quirk but <a href="https://pypi.org/project/saxonche/" class="external">https://pypi.org/project/saxonche/</a> claims current <code>print(proc.version)</code> would give <code>SaxonC-HE 12.4.1 from Saxonica</code> while even with 12.4.1 the output remains at <code>SaxonC-HE 12.4 from Saxonica</code>.</p>
<p>But the inconsistency between the documentation of the wheel on PyPi and its version number and the actual result might be confusing.</p> SaxonC - Bug #6182 (In Progress): UTF-8 in string based C API functionshttps://saxonica.plan.io/issues/61822023-08-22T16:25:00ZOmar Siam
<p>I tried to get the following code running and the encoding of the return value seems off.</p>
<pre><code class="cpp syntaxhl" data-language="cpp"><span class="kt">void</span> <span class="nf">testUTF8StringTemplate</span><span class="p">(</span><span class="n">SaxonProcessor</span> <span class="o">*</span><span class="n">proc</span><span class="p">,</span> <span class="n">Xslt30Processor</span> <span class="o">*</span><span class="n">trans</span><span class="p">,</span>
<span class="n">sResultCount</span> <span class="o">*</span><span class="n">sresult</span><span class="p">)</span> <span class="p">{</span>
<span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">source</span> <span class="o">=</span>
<span class="s">"<?xml version='1.0' encoding='UTF8'?> <xsl:stylesheet "</span>
<span class="s">"xmlns:xsl='http://www.w3.org/1999/XSL/Transform' "</span>
<span class="s">"xmlns:xs='http://www.w3.org/2001/XMLSchema' version='3.0'> "</span>
<span class="s">"<xsl:template match='*'> <xsl:sequence select='&apos;تيست&apos;'/> </xsl:template> </xsl:stylesheet>"</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="n">endl</span> <span class="o"><<</span> <span class="s">"Test:testUTF8StringTemplate"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">XsltExecutable</span> <span class="o">*</span><span class="n">executable</span> <span class="o">=</span> <span class="n">trans</span><span class="o">-></span><span class="n">compileFromString</span><span class="p">(</span><span class="n">source</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">executable</span> <span class="o">==</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">trans</span><span class="o">-></span><span class="n">exceptionOccurred</span><span class="p">())</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Error: "</span> <span class="o"><<</span> <span class="n">trans</span><span class="o">-></span><span class="n">getErrorMessage</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">_in</span> <span class="o">=</span> <span class="s">"<?xml version='1.0' encoding='UTF8'?><e>تيست</e>"</span><span class="p">;</span>
<span class="n">XdmNode</span> <span class="o">*</span><span class="n">node</span> <span class="o">=</span> <span class="n">proc</span><span class="o">-></span><span class="n">parseXmlFromString</span><span class="p">(</span><span class="n">_in</span><span class="p">);</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setResultAsRawValue</span><span class="p">(</span><span class="nb">false</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">,</span> <span class="n">XdmValue</span> <span class="o">*></span> <span class="n">parameterValues</span><span class="p">;</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setInitialTemplateParameters</span><span class="p">(</span><span class="n">parameterValues</span><span class="p">,</span> <span class="nb">false</span><span class="p">);</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setInitialMatchSelection</span><span class="p">(</span><span class="n">node</span><span class="p">);</span>
<span class="n">XdmValue</span> <span class="o">*</span><span class="n">result</span> <span class="o">=</span> <span class="n">executable</span><span class="o">-></span><span class="n">applyTemplatesReturningValue</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">result</span> <span class="o">!=</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">success</span><span class="o">++</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Input="</span> <span class="o"><<</span> <span class="n">_in</span><span class="p">;</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"Result="</span> <span class="o"><<</span> <span class="n">result</span><span class="o">-></span><span class="n">getHead</span><span class="p">()</span><span class="o">-></span><span class="n">getStringValue</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span> <span class="o"><<</span> <span class="n">node</span><span class="o">-></span><span class="n">toString</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="k">delete</span> <span class="n">result</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failure</span><span class="o">++</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failureList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"testUTF8StringTemplate"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">delete</span> <span class="n">executable</span><span class="p">;</span>
<span class="k">delete</span> <span class="n">node</span><span class="p">;</span>
<span class="n">parameterValues</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
<span class="p">}</span>
</code></pre>
<pre><code class="shell syntaxhl" data-language="shell">Compiled with VS 2017:
cl /utf-8 /EHsc <span class="s2">"-I%graalvmdir%"</span> testXSLT30.cpp ../../Saxon.C.API/SaxonCGlue.c ../../Saxon.C.API/SaxonCXPath.c ../../Saxon.C.API/SaxonProcessor.cpp ../../Saxon.C.API/XdmValue.cpp ../../Saxon.C.API/XdmItem.cpp ../../Saxon.C.API/XdmAtomicValue.cpp ../../Saxon.C.API/DocumentBuilder.cpp ../../Saxon.C.API/XdmNode.cpp ../../Saxon.C.API/XdmFunctionItem.cpp ../../Saxon.C.API/XdmArray.cpp ../../Saxon.C.API/XdmMap.cpp ../../Saxon.C.API/SaxonApiException.cpp ../../Saxon.C.API/XQueryProcessor.cpp ../../Saxon.C.API/Xslt30Processor.cpp ../../Saxon.C.API/XsltExecutable.cpp ../../Saxon.C.API/XPathProcessor.cpp ../../Saxon.C.API/SchemaValidator.cpp /link ..<span class="se">\.</span>.<span class="se">\l</span>ibs<span class="se">\w</span><span class="k">in</span><span class="se">\l</span>ibsaxon-hec-12.3.lib
</code></pre>
<p>Result in an UTF-8 enabled powershell window:</p>
<pre><code>Test:testUTF8StringTemplate
Input=<?xml version='1.0' encoding='UTF8'?><e>تيست</e>Result=تيست
<e>تيست</e>
</code></pre>
<p>Any ideas how to fix this? It seems the UTF-8 string is encoded twice.</p> SaxonC - Bug #6120 (New): Unclear installation instruction for linking SaxonC library in C++https://saxonica.plan.io/issues/61202023-07-07T09:25:40ZO'Neil Delprattoneil@saxonica.com
<p>If a users want to compile a program that links against SaxonC the documentation does not make it clear enough how to do this. It should make it clear that either add the library to LIBRARY_PATH, or use -L to point
directly to the library.</p>
<p>At runtime, if the dynamic library has not been installed in “a standard
place”, the location needs to be set on the LD_LIBRARY_PATH.</p> SaxonC - Feature #6074 (AwaitingInfo): Enhance the C API with separate XSLT compile and execute ...https://saxonica.plan.io/issues/60742023-06-12T13:29:13ZO'Neil Delprattoneil@saxonica.com
<p>User request to enhance the C API with separate XSLT compile and execute functions.</p> SaxonC - Bug #6073 (In Progress): Documentation on the C API is missinghttps://saxonica.plan.io/issues/60732023-06-12T11:01:41ZO'Neil Delprattoneil@saxonica.com
<p>Reported by a user that the documentation on the C API is missing. We only have some example code available</p> SaxonC - Bug #6009 (In Progress): cppTests/testXSLT30 exampleTransformToString fails, probably du...https://saxonica.plan.io/issues/60092023-05-03T05:56:59ZMartin Honnenmartin.honnen@gmx.de
<p>Using SaxonC EE 12.2 under Linux, I find that one test of cppTests/testXSLT30 fails, namely then one named <code>exampleTransformToString</code> outputs e.g.</p>
<pre><code><b>exampleTransformToString:</b><br/>
baseURI = file:///home/mh/libsaxon-EEC-linux-v12.2/samples/cppTests
producing sheet
exampleTransformToString =
The file output.xml does not exist
</code></pre>
<p>where the baseURI is constructed and output with e.g.</p>
<pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">string</span> <span class="n">baseURI</span> <span class="o">=</span> <span class="n">string</span><span class="p">(</span><span class="s">"file://"</span><span class="p">)</span><span class="o">+</span><span class="n">sproc</span><span class="o">-></span><span class="n">getcwd</span><span class="p">();</span>
<span class="n">cerr</span><span class="o"><<</span><span class="s">"baseURI = "</span><span class="o"><<</span><span class="n">baseURI</span><span class="o"><<</span><span class="n">endl</span><span class="p">;</span>
<span class="n">executable</span><span class="o">-></span><span class="n">setBaseOutputURI</span><span class="p">(</span><span class="n">baseURI</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
</code></pre>
<p>a stylesheet then creates an output file <code>output.xml</code> relative to the baseURI e.g. it creates <code>file:///home/mh/libsaxon-EEC-linux-v12.2/samples/output.xml</code> but the code checks with</p>
<pre><code class="cpp syntaxhl" data-language="cpp"> <span class="n">cout</span><span class="o"><<</span> <span class="s">"exampleTransformToString = "</span><span class="o"><<</span><span class="n">result</span><span class="o"><<</span><span class="n">endl</span><span class="p">;</span>
<span class="n">string</span> <span class="n">filename</span> <span class="o">=</span> <span class="n">baseURI</span><span class="o">+</span><span class="s">"/output.xml"</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">CppTestUtils</span><span class="o">::</span><span class="n">exists</span><span class="p">(</span><span class="n">filename</span><span class="p">.</span><span class="n">c_str</span><span class="p">()))</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"The file output.xml exists"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">remove</span><span class="p">(</span><span class="s">"output.xml"</span><span class="p">);</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">success</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"The file output.xml does not exist"</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failure</span><span class="o">++</span><span class="p">;</span>
<span class="n">sresult</span><span class="o">-></span><span class="n">failureList</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="s">"exampleTransformToString"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>
<p>and finds the file <code>file:///home/mh/libsaxon-EEC-linux-v12.2/samples/cppTests/output.xml</code> doesn't exist and counts the test as failed.</p>
<p>Therefore I think the base output URI needs to be set to <code>string baseURI = string("file://")+sproc->getcwd() + "/";</code>, if that test is supposed to pass.</p> SaxonC - Bug #6000 (New): net.sf.saxon.trans.LicenseException: Failed to read license file /usr/l...https://saxonica.plan.io/issues/60002023-04-27T13:16:44ZO'Neil Delprattoneil@saxonica.com
<p>Given the follow python script:</p>
<pre><code class="python syntaxhl" data-language="python"><span class="n">proc</span> <span class="o">=</span> <span class="n">PySaxonProcessor</span><span class="p">(</span><span class="n">license</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">proc</span><span class="p">.</span><span class="n">set_configuration_property</span><span class="p">(</span><span class="s">"http://saxon.sf.net/feature/licenseFileLocation"</span><span class="p">,</span> <span class="s">"/usr/lib/saxon-license.lic"</span><span class="p">)</span>
<span class="n">xsltproc</span> <span class="o">=</span> <span class="n">proc</span><span class="p">.</span><span class="n">new_xslt30_processor</span><span class="p">()</span>
</code></pre>
<p>If the license file is not fould using the @set_configuration property@ it will crash as follows:</p>
<pre><code>net.sf.saxon.trans.LicenseException: Failed to read license file /usr/lib/saxon-license.lic
at com.saxonica.config.Verifier.loadLicense(Verifier.java:130)
at com.saxonica.config.ProfessionalConfiguration.setConfigurationProperty(ProfessionalConfiguration.java:230)
at net.sf.saxon.s9api.Processor.setConfigurationProperty(Processor.java:402)
at net.sf.saxon.option.cpp.SaxonCAPI.applyToConfiguration(SaxonCAPI.java:569)
</code></pre>
<p>The problem is the @applyToConfiguration@ method in the class SaxonCAPI does not have graalvm exception handling annotation. We also need to add code in the C++ API to thrown the exception as a @SaxonApiException@</p> SaxonC - Bug #5943 (AwaitingInfo): XSLT through SaxonC PHP gives "Segmentation fault"https://saxonica.plan.io/issues/59432023-03-28T14:12:39ZYouri Lefers
<p>Hi all,</p>
<p>We've upgraded our SaxonC PHP library to Saxon 12(.1), but it gives a segmentation fault (error code 139 with PHPUnit) when it runs 2 or more transformations after each other. This happens in version 12.1, but also happened in version 12. We use PHP 8.1 (FPM).</p>
<p>We use a factory to construct and destruct a <code>SaxonProcessor</code> instance:</p>
<pre><code class="php syntaxhl" data-language="php"><span class="kn">use</span> <span class="nc">Saxon\SaxonProcessor</span><span class="p">;</span>
<span class="kd">class</span> <span class="nc">SaxonProcessorFactory</span>
<span class="p">{</span>
<span class="k">private</span> <span class="kt">?SaxonProcessor</span> <span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">__destruct</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="kc">null</span> <span class="o">!==</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">public</span> <span class="k">function</span> <span class="n">get</span><span class="p">():</span> <span class="kt">SaxonProcessor</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="kc">null</span> <span class="o">===</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="nf">create</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessor</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">private</span> <span class="k">function</span> <span class="n">create</span><span class="p">():</span> <span class="kt">SaxonProcessor</span>
<span class="p">{</span>
<span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">SaxonProcessor</span><span class="p">();</span>
<span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">setConfigurationProperty</span><span class="p">(</span><span class="s1">'http://saxon.sf.net/feature/recognize-uri-query-parameters'</span><span class="p">,</span> <span class="s1">'true'</span><span class="p">);</span>
<span class="k">return</span> <span class="nv">$saxonProcessor</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre>
<p>Then we use that processor to do XSLT transformations:</p>
<pre><code class="php syntaxhl" data-language="php"><span class="nv">$saxonProcessor</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="n">saxonProcessorFactory</span><span class="o">-></span><span class="nf">get</span><span class="p">();</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">newXslt30Processor</span><span class="p">();</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$parameters</span> <span class="k">as</span> <span class="nv">$key</span> <span class="o">=></span> <span class="nv">$value</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$transformer</span><span class="o">-></span><span class="nf">setParameter</span><span class="p">(</span><span class="nv">$key</span><span class="p">,</span> <span class="nv">$saxonProcessor</span><span class="o">-></span><span class="nf">createAtomicValue</span><span class="p">(</span><span class="nv">$value</span><span class="p">));</span>
<span class="p">}</span>
<span class="nv">$transformer</span><span class="o">-></span><span class="nf">transformFileToFile</span><span class="p">(</span><span class="nv">$tmpFilePath</span><span class="p">,</span> <span class="nv">$xsltFilePath</span><span class="p">,</span> <span class="nv">$outputFile</span><span class="o">-></span><span class="nf">getPath</span><span class="p">());</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$transformer</span><span class="o">-></span><span class="nf">exceptionOccurred</span><span class="p">())</span> <span class="p">{</span>
<span class="nv">$exception</span> <span class="o">=</span> <span class="nc">SaxonXsltTransformException</span><span class="o">::</span><span class="nf">forXslTransformation</span><span class="p">(</span><span class="nv">$transformer</span><span class="p">,</span> <span class="nv">$tmpFilePath</span><span class="p">,</span> <span class="nv">$xsltFilePath</span><span class="p">);</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="k">throw</span> <span class="nv">$exception</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">$transformer</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
</code></pre>
<p>The first time it runs fine (through for example unit tests), but the second time it gives a segmentation fault. I'm unable to debug this into a specific line or something that created the segmentation fault.</p>
<p>Are you guys able to help us out?</p>