On 1/12/2025 2:20 PM, Arne Vajhøj wrote:
On 1/11/2025 10:46 PM, Arne Vajhøj wrote:
On 1/11/2025 5:24 PM, Arne Vajhøj wrote:
This is a little HOWTO.
>
1) Get latest SQLite for VMS from https://sourceforge.net/projects/ vms- ports/files/SQLITE3/
(currently sqlite3_vms_051.zip)
2) Build with 64 bit pointers using MMS:
$ mms/macro=(pointer_opt=64)
3) Get latest SQLite JDBC driver from https://github.com/xerial/ sqlite-jdbc
(currently sqlite-3.47.2.0.jar)
4) Get latest NativeDB.c from https://github.com/xerial/sqlite-jdbc/ tree/master/src/main/java/org/sqlite/core
5) Generate JNI shareable image using COM file below.
>
$ jcc := cc/pointer=64/name=(as_is,shortened)/reent=multi/float=ieee/ ieee=denorm/include=(sys$common:[openjdk$80.include],sys$common
:[openjdk$80.include.openvms],sqlite3_include)"
$ javah -cp sqlite-jdbc-3_47_2_0.jar org.sqlite.core.NativeDB
$ ren org_sqlite_core_NativeDB.h NativeDB.h
$ jcc NativeDB
$ pipe java$build_option NativeDB.obj > NativeDB.opt
$ link/map/share=sqlitejdbc NativeDB + NativeDB/opt + sys$input/opt
sqlite3shr64/share
$
$ exit
>
When running your JVM language application just put
the JDBC har in classpath and define java.library.path to
point to directory with sqlitejdbc.EXE
>
And have a logical sqlitejdbc pointing to sqlitejdbc.EXE
It is "or" not "and". Either the logical or the define.
But the logical is preferable as the define can be tricky
with other JVM languages.
And for those that prefer JPA and JPQL over JDBC and SQL,
then out of the box Hibernate 5.6 and the SQLite dialect from
https://mvnrepository.com/artifact/com.github.gwenn/sqlite-dialect
works fine.
Note that the SQLite JDBC driver despite being latest version
is still far behind regarding JDBC driver functions.
con = args.length >= 3
? DriverManager.getConnection(args[0], args[1], args[2])
: DriverManager.getConnection(args[0])
dbmd = con.getMetaData()
printf("%s %s\n", dbmd.getDatabaseProductName(), dbmd.getDatabaseProductVersion())
printf("%s %s\n", dbmd.getDriverName(), dbmd.getDriverVersion())
...
printf("Numeric functions = %s\n", dbmd.getNumericFunctions())
printf("String functions = %s\n", dbmd.getStringFunctions())
printf("TimeDate functions = %s\n", dbmd.getTimeDateFunctions())
printf("System functions = %s\n", dbmd.getSystemFunctions())
MySQL 8.0.33
MySQL Connector/J mysql-connector-j-8.0.33 (Revision: 7d6b0800528b6b25c68b52dc10d6c1c8429c100c)
...
Numeric functions = ABS,ACOS,ASIN,ATAN,ATAN2,BIT_COUNT,CEILING,COS,COT,DEGREES,EXP,FLOOR,LOG,LOG10,MAX,MIN,MOD,PI,POW,POWER,RADIANS,
RAND,ROUND,SIN,SQRT,TAN,TRUNCATE
String functions = ASCII,BIN,BIT_LENGTH,CHAR,CHARACTER_LENGTH,CHAR_LENGTH,CONCAT,CONCAT_WS,CONV,ELT,EXPORT_SET,FIELD,FIND_IN_SET,HEX,INSERT,INSTR,LCASE,LEFT,LENGTH,LOAD_FILE,LOCATE,LOCATE,LOWER,LPAD,LTRIM,MAKE_SET,MATCH,MID,OCT,OCTET_LENGTH,ORD,POSITION,QUOTE,REPEAT,REPLACE,REVERSE,RIGHT,RPAD,RTRIM,SOUNDEX,SPACE,STRCMP,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING,SUBSTRING_INDEX,TRIM,UCASE,UPPER
TimeDate functions = DAYOFWEEK,WEEKDAY,DAYOFMONTH,DAYOFYEAR,MONTH,DAYNAME,MONTHNAME,QUARTER,WEEK,YEAR,HOUR,MINUTE,SECOND,PERIOD_ADD,PERIOD_DIFF,TO_DAYS,FROM_DAYS,DATE_FORMAT,TIME_FORMAT,CURDATE,CURRENT_DATE,CURTIME,CURRENT_TIME,NOW,SYSDATE,CURRENT_TIMESTAMP,UNIX_TIMESTAMP,FROM_UNIXTIME,SEC_TO_TIME,TIME_TO_SEC
System functions = DATABASE,USER,SYSTEM_USER,SESSION_USER,PASSWORD,ENCRYPT,LAST_INSERT_ID,VERSION
SQLite 3.47.2
SQLite JDBC 3.47.2.0
...
Numeric functions =
String functions =
TimeDate functions = DATE,TIME,DATETIME,JULIANDAY,STRFTIME
System functions =
But given that almost noone use JDBC driver functions, then it is not
a huge problem.
Arne