Written by

Question David Cui · Jan 27, 2020

IRIS supports of Python and C++

I cannot find those folders under my IRIS install dev folder.  Those were in my cache install dev folder.

Will InterSystems drop those support?  If yes, why are there some discussion about Python/Iris in this forum?

Of course, I wish IS continue to support those.

Comments

Jon Willeke  Feb 3, 2020 to Eduard Lebedyuk

In Caché, the dev/cpp and dev/python directories contain the C++ and Python bindings, respectively. As far as I know, these are not available for InterSystems IRIS. They were shipped as source, so maybe they would work with IRIS? I doubt that it's been tested.

The dev/iris-callin directory contains the headers for the C callin API. This includes files that are compatible with programs written using headers that are shipped with Caché in the dev/cache/callin directory.

0
Raj Singh  Feb 4, 2020 to Jon Willeke

You can find the Python Native API wheels in dev/python in IRIS 2019.2 and above as well.

0
Eduard Lebedyuk  Feb 5, 2020 to Jon Willeke

These particular bindings are deprecated.

Replacements are listed in the InterSystems IRIS Adoption Guide which is available in WRC (Downloads - Documents).

0
Eduard Lebedyuk  Jan 30, 2020 to David Cui

From InterSystems IRIS adoption guide:

Python Binding Applications using the Python Binding should migrate to PyODBC.

2019.1.1 does not have Python Native API - you'll need 2020.1 preview or 2019.2+ container release for that.

0
Eduard Lebedyuk · Jan 29, 2020

cpp directory was renamed into iris-callin.

python directory should be there in your dev directory.

InterSystems IRIS also offers a brand new Python Native API.

Check out community Python Gateway - a new and easy way to interface with Python from InterSystems IRIS.

0
David Cui · Jan 29, 2020

Thank you folks so much.  My iris is

IRIS for Windows (x86-64) 2019.1.1 (Build 612U) Mon Oct 28 2019 11:29:24 EDT

I don't have python folder.  I do have iris-callin folder.

We have java, COM, C++, python around our applications.  If iris doesn't have them, it will put heavy burden on us to move on.

0
David Cui · Nov 5, 2020

Where can I find c++ callin examples?

 Thanks,

0
David Cui  Nov 6, 2020 to Eduard Lebedyuk

Thank you!

0
David Cui  Nov 7, 2020 to Eduard Lebedyuk

I made it work and realized callin has no way to connect to iris on a different machine?

am I wrong?  I hope so.

0
David Cui  Nov 7, 2020 to David Cui

With Cache, cpp can be used to access databases on a different machine.  If callin doesn't allow that, then iris callin is not a replacement of cache cpp.  So our c++ program will not be able to be upgraded with IRIS.

0
Jon Willeke  Nov 8, 2020 to David Cui

You are correct that callin is not a replacement for the C++ binding. Callin is a lower-level API that only works for a local instance. The C++ binding has two flavors: the light C++ binding (LCB), which depends on callin, and the full C++ binding, which depends on the ODBC driver.

It's not clear to me from your questions how you're currently using C++. Do you actually have an existing C++ binding application, or are you writing something new with a requirement to use C++? I suggest that you get in touch with your friendly InterSystems representative in Support or Sales Engineering to help you find the best path forward.

That said, I was curious about whether the C++ binding from Caché can be used with InterSystems IRIS. Although I've never used this API on purpose, I was able to get it working after a fashion with a few modifications. I presume this is not supported by InterSystems, and I would hesitate to use it in production. The following overview describes my experiment using the C++ binding SDK from a Caché 2018.1.4 kit for lnxrhx64 with the Community edition of IRIS 2020.3.0 in a container. Apologies for any copy-paste mistakes. I started this on a lark, and didn't take very good notes.

I installed g++, make, and vim in the container:

$ docker exec -it --user root cppbind bash
root:/home/irisowner# apt update && apt install -y g++ make vim
...

I extracted cppsdk-lnxrhx64.tar.gz, and found that the C++ binding uses dlsym() and dlopen() to call entry points in the ODBC driver library. (Search for the init_pfn macro in odbc_common.cpp.) These are still present in the IRIS library, as you can see with the nm command:

$ docker exec -it cppbind bash
irisowner:~$ nm /usr/irissys/bin/libirisodbciw35.so |grep cpp_
000000000005cf90 T cpp_binding_alloc_messenger
000000000005dd40 T cpp_binding_clear_odbc_cache
...

I changed the ODBCLIBNAME symbol in libcppbind.mak from the libcacheodbciw Caché driver library to the libirisodbciw35 IRIS driver library.

I changed the Caché "CacheUni" symbols to the IRIS "ServerUni" symbols. For those three symbols, instead of

*((void**)(&(func))) = dlsym(dll_handle, #func);

You want something like this, where name is the new name of the symbol in the IRIS driver:

*((void**)(&(func))) = dlsym(dll_handle, #name);

I did the same for the ODBC 2.x SQLColAttributesW() function, which has been replaced by the ODBC 3.x SQLColAttributeW() function.

I fixed an apparent bug in obj_types.h by marking get_cs_handle() const and cs_handle mutable. I didn't spend much time investigating, so I'm not certain that this is the best fix.

I then built the C++ binding:

irisowner:~/dev/cpp/src/modules/cpp/lnxrhx64$ make libcppbind.so

It appears that the cpp_generator utility is only shipped as a binary, which obviously doesn't have any of these changes, so it won't work with an IRIS driver library. However, I was able to do a simple test using Dyn_obj:

#include <iostream>
#include "cppbind.h"

using namespace InterSystems;

int
main()
{
    auto conn = tcp_conn::connect(
        "localhost[1972]:USER", "_system", "SYS");
    Database db{conn};
    d_string res;
    Dyn_obj::run_class_method(&db, L"%SYSTEM.Util", L"CreateGUID",
        nullptr, 0, &res);
    std::cout << res.value() << std::endl;

    return 0;
}

I compiled and ran the test program like so:

$ docker exec -it cppbind bash
irisowner:~$ g++ -o cppbindtest cppbindtest.cpp -I dev/cpp/include \
    -L dev/cpp/src/kit/lnxrhx64/release/bin -lcppbind
irisowner:~$ export LD_LIBRARY_PATH=/home/irisowner/dev/cpp/src/kit/lnxrhx64/release/bin:/usr/irissys/bin
irisowner:~$ ./cppbindtest 
7325F26A-21E2-11EB-BB36-0242AC110002
0
David Cui  Nov 8, 2020 to Jon Willeke

Jon,

Yes, I took windows' cache 2017's odbc library and run the code again iris 2020.1 using your example, it works.

Now the question is if I can continue using my code compiled with cache 2017 for iris?

I don't know docker almost.  It is hard to follow your example.  I don't know how to install g++, vim, make on the docker container.  So I gave up.  But you indeed gave me light.

Thanks a lot!

0
Jon Willeke  Nov 8, 2020 to David Cui

I wasn't sure whether the Caché ODBC driver works with IRIS. Even if it does now, it's not guaranteed to do so in the future. I did find that the C++ binding SDK appears to include everything you need to generate proxy classes. You just need to call Generator::gen_classes() in generator.cpp.

Again, everything I've described is an unsupported hack. If a C++ binding application is holding up an upgrade from Caché to IRIS, let your Support or Sales Engineering rep. know.

0
David Cui  Jan 30, 2021 to Jon Willeke

I got reply from my sale engineer.  The answer is IRIS will not support C++ any more.  I have to think what to do.

Very bad luck.

0
Marvin Willms · Nov 11, 2020

SIP provides C/C++ wrappers to the python code. Python is the driver but C/C++ is not. In other words, SIP just allows us to make C/C++ call from Python but does not make it work calling Python from C/C++. At least, I have not had any luck doing it. 

0
Eduard Lebedyuk  Nov 7, 2020 to Marvin Willms

InterSystems supports bidirectional integration with C/C++ and Python both.

0
David Cui  Nov 7, 2020 to Marvin Willms

What does SIP  stand for?  Thanks.

0
David Cui · Nov 8, 2020

Thank you so much!  I will study your reply and get back to you.

0
Marvin Willms · Nov 12, 2020

If callin doesn't allow that, then iris callin is not a replacement of cache cpp.  So our c++ program will not be able to be upgraded with IRIS.

0