For DBAs
Oninit® MySQL-2-Informix — A MySQL Front Door for Your IDS, Built by People Who Run Informix
You already know how this conversation usually goes. The application team needs “a MySQL connection.” The data is in Informix. The choices on the table are: stand up a parallel MySQL with an ETL, write a custom translator, replace the application, or push back. None of them is a small project. The proxy is the small project.
What it actually is
A multi-threaded C daemon that listens on the MySQL 4.1 wire, parses each statement, and dispatches it to Informix. One pthread per accepted client connection. Pure-C front-end (no MySQL connector library on the host), two interchangeable back-ends (CSDK or pure-C SQLI), one shared config file. Listens on 127.0.0.1:3307 by default.
Catalog statements that already work
The translator rewrites MySQL catalog statements as SELECTs over the Informix system catalog and reshapes the result so MySQL-aware tooling sees what it expects:
| MySQL statement | Where it lands in Informix |
|---|---|
| SHOW DATABASES | sysmaster:sysdatabases |
| SHOW [FULL] TABLES [FROM db] [LIKE pat] | systables |
| SHOW CREATE TABLE | syscolumns, systables, sysindexes, sysconstraints, sysxtdtypes |
| SHOW INDEX FROM | sysindexes, syscolumns, systables, sysconstraints |
| SHOW GRANTS [FOR user] | systabauth, systables |
| SHOW TRIGGERS | systriggers, systables |
| SHOW CREATE VIEW / SHOW CREATE TRIGGER | sysviews / systriggers + systrigbody |
CREATE TABLE rewriting you can predict
The full type-mapping table is on the Type Mapping page. The short version: TINYINT→SMALLINT, BIGINT→BIGINT, DOUBLE→FLOAT, BOOL→BOOLEAN, DATETIME(n)→DATETIME YEAR TO FRACTION(n), BLOB→BYTE, JSON→JSON via the UDTVAR wire path, spatial types fall back to LVARCHAR(2048) WKT (or native ST_* types when the Spatial DataBlade is installed). UNSIGNED, AUTO_INCREMENT, ZEROFILL, ENGINE=, DEFAULT CHARSET=, COLLATE=, and backticks are stripped. AUTO_INCREMENT=N seeds become SERIAL(N) or BIGSERIAL(N). The reverse is applied by SHOW CREATE TABLE, so an ORM that introspected the schema sees the same column declarations the developer wrote.
INSERT into BYTE / TEXT — just works
MySQL clients almost always emit inline-literal INSERTs into binary columns (INSERT INTO t VALUES (1, 'data') or x'68656c6c6f' for hex). Informix rejects that with Error 274 — binary columns expect a bound BLOB stream, not an inline literal. The SQLI-protocol backend rewrites these on the wire transparently, so a MySQL ORM batching binary payloads sees a normal INSERT round-trip with the right affected-row count. Coverage extends to column-list INSERTs, multi-row INSERTs (split into N single-row INSERTs since Informix doesn't accept multi-row natively), NULL-into-blob, and mixed NULL+non-NULL across rows of the same statement.
Two backends, one configuration
| m2ie | m2is |
|---|---|
| Talks to Informix via the IBM Informix CSDK (ESQL/C). | Talks to Informix in pure C, directly over the SQLI wire protocol. No CSDK on the deployment host. |
| Reference implementation. Most translation is grounded in this backend's output. | Validated against IBM Informix Dynamic Server. Strictly more correct than the CSDK reference on a small documented set of behaviours (see the Backends page). |
Operations
A simple ./m2i {start|stop|restart|status} script. PID file keyed off the binary name so m2ie and m2is can run side by side on different ports. SIGTERM stops accepting new clients; in-flight pthreads finish their current request and exit. A debug build logs every SQL statement sent to Informix for tracing. The Oninit® Snooper sits in front of m2is when you need wire-level visibility.
It speaks MySQL on the front, Informix on the back, and the translation surface is documented. Email support.info@oninit.com or call +1-913-732-8892 for an evaluation.