By cj on Jan 30, 2017
Today Oracle released a great new GitHub project - Oracle Database Programming Interface for C. It sits on top of OCI and offers an alternative programming experience.
ODPI-C is a C library that simplifies the use of common Oracle Call Interface (OCI) features for Oracle Database drivers and user applications.
ODPI-C's goal is to expose common OCI functionality in a readily consumable way to the C or C++ developer. OCI's API is extremely flexible and is highly efficient. It gives a lot of fine-grained control to the developer and has a very wide range of use cases. ODPI-C is also flexible but is aimed primarily at language driver creators. These creators are programming within the confines of a scripting language's type system and semantics. The languages often expose simplified data access to users through cross-platform, 'common-denominator' APIs. Therefore it makes sense for ODPI-C to provide easy to use functionality for common data access, while still allowing the power of Oracle Database to be used.
Of course ODPI-C isn't just restricted to driver usage. If ODPI-C has the functionality you need for accessing Oracle Database, you can add it to your own custom projects.
ODPI-C is a refactored and greatly enhanced version of the "DPI" data access layer used in our very successful node-oracledb driver.
Releasing ODPI-C as a new, standalone project means its code can be consumed and reused more easily. For database drivers it allows Oracle features to be exposed more rapidly and in a consistent way. This will allow greater cross-language driver feature compatibility, which is always useful in today's multi-language world.
Oracle's Anthony Tuininga has been leading the ODPI-C effort, making full use of his extensive driver knowledge as creator and maintainer of the extremely popular, and full featured, Python cx_Oracle driver.
The ODPI-C feature list currently includes all the normal calls you'd expect to manage connections and to execute SQL and PL/SQL efficiently. It also has such gems as SQL and PL/SQL object support, scrollable cursors, Advanced Queuing, and Continuous Query Notification. The full list in this initial Beta release, in no particular order, is:
11.2, 12.1 and 12.2 Oracle Client support
SQL and PL/SQL execution
Large objects (CLOB, NCLOB, BLOB, BFILE)
Timestamps (naive, with time zone, with local time zone)
PL/SQL arrays (index-by integer tables)
Objects (types in SQL, records in PL/SQL)
Array DML Row Counts
Connections via Session pools (homogeneous and non-homogeneous)
Session Tagging in session pools
Database Resident Connection Pooling (DRCP)
Connection Validation (when acquired from session pool or DRCP)
Statement caching (with tagging)
DML RETURNING clause
Privileged connection support (SYSDBA, SYSOPER, SYSASM, PRELIM_AUTH)
End-to-end tracing, mid-tier authentication and auditing (action, module, client identifier, client info, database operation)
Query Result Caching
Application Continuity (with some limitations)
OCI Client Version and Server Version
Implicit Result Sets
Continuous Query Notification
Edition Based Redefinition
Two Phase Commit
In case you want to access other OCI calls without having to modify ODPI-C code, there is a call to get the underlying OCI service context handle.
ODPI-C applications can make full advantage of OCI features which don't require API access, such as the oraaccess.xml configuration for enabling statement cache auto-tuning. Similarly, Oracle Database features controlled by SQL and PL/SQL, such as partitioning, can be used in applications, as you would expect.
Communication to the database is handled by Oracle Net, so features such as encrypted communication and LDAP can be configured.
ODPI-C's API makes memory and resource management simpler, particularly for 'binding' and 'defining'. A reference counting mechanism adds resiliency by stopping applications destroying in-use OCI resources. To offer an alternative programming experience from OCI, the ODPI-C API uses a multiple getter/setter model for handling attributes.
ODPI-C is released as source-code on GitHub. The code makes OCI calls and so requires an Oracle client, which must be installed separately. Version 11.2 or later of the client is required. This allows applications to connect to Oracle Database 9.2 or later. The free Oracle Instant Client is the standard way to obtain standalone Oracle client libraries and header files.
The project is licensed under the Apache 2.0 and/or the Oracle UPL licenses, so the code is readily available for adoption into your own projects.
ODPI-C code can be included in your C or C++ applications and compiled like any OCI application. Or if you want to use ODPI-C as a shared library, a sample Makefile for building on Linux, OS X and Windows is provided
Support for ODPI-C is via logging GitHub Issues only - but this does have the advantage of giving you direct access to ODPI-C developers. Also remember the underlying OCI libraries (which do all the hard work) are extremely widely used, tested and supported.
If you want to do more than view the code, you can build ODPI-C as a library using the sample Makefile, and then build the current standalone sample programs. These show a number of ODPI-C features.
The ODPI-C release today is 2.0.0-beta.1, indicating we're happy with the general design but want to get your wider review. We also need to complete some testing and add some polish.
We aim to stabilize ODPI-C relatively quickly and then continue adding functionality, such as support for the new Oracle Database 12.2 Sharding feature.
Future Node.js node-oracledb and Python cx_Oracle drivers will use ODPI-C. There is active work on these updates.
I know Kubo Takehiro, who does a fantastic job maintaining the ruby-oci8 driver, has been keen to see what ODPI-C can do for his driver. I look forward to seeing how he uses it.
I think you'll be pleased with the direction and plans for scripting languages in 2017.
We really welcome your feedback on this big step forward.
Home page is: https://oracle.github.io/odpi/
Code is at https://github.com/oracle/odpi
Documentation is at https://oracle.github.io/odpi/doc/index.html
Issues and comments are be reported at https://github.com/oracle/odpi/issues