package org.develnext.jphp.ext.sql.classes; import org.develnext.jphp.ext.sql.SqlExtension; import php.runtime.Memory; import php.runtime.annotation.Reflection.*; import php.runtime.env.Environment; import php.runtime.lang.BaseObject; import php.runtime.memory.ArrayMemory; import php.runtime.memory.LongMemory; import php.runtime.memory.ReferenceMemory; import php.runtime.reflection.ClassEntity; import java.sql.*; @Abstract @Name("SqlConnection") @Namespace(SqlExtension.NS) public class PSqlConnection extends BaseObject { public static final int TRANSACTION_READ_UNCOMMITTED = Connection.TRANSACTION_READ_UNCOMMITTED; public static final int TRANSACTION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED; public static final int TRANSACTION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ; public static final int TRANSACTION_NONE = Connection.TRANSACTION_NONE; public static final int TRANSACTION_SERIALIZABLE = Connection.TRANSACTION_SERIALIZABLE; protected Connection connection; protected DatabaseMetaData metaData; public PSqlConnection(Environment env, Connection connection) { super(env); this.connection = connection; try { this.metaData = connection.getMetaData(); } catch (SQLException e) { throw new WrapSqlException(env, e); } } public PSqlConnection(Environment env, ClassEntity clazz) { super(env, clazz); } @Setter public void setAutoCommit(boolean value) throws SQLException { connection.setAutoCommit(value); } @Getter public boolean getAutoCommit() throws SQLException { return connection.getAutoCommit(); } @Setter public void setReadOnly(boolean value) throws SQLException { connection.setReadOnly(value); } @Getter public boolean getReadOnly() throws SQLException { return connection.isReadOnly(); } @Setter public void setTransactionIsolation(int value) throws SQLException { connection.setTransactionIsolation(value); } @Getter public int getTransactionIsolation() throws SQLException { return connection.getTransactionIsolation(); } @Setter public void setCatalog(String value) throws SQLException { connection.setCatalog(value); } @Getter public String getCatalog() throws SQLException { return connection.getCatalog(); } @Signature public Memory getCatalogs(Environment env) throws SQLException { ResultSet catalogs = metaData.getCatalogs(); ArrayMemory r = new ArrayMemory(); while (catalogs.next()) { r.add(new PSqlResult(env, catalogs).toArray(env)); } return r.toConstant(); } @Signature public Memory getSchemas(Environment env) throws SQLException { ResultSet schemas = metaData.getSchemas(); ArrayMemory r = new ArrayMemory(); while (schemas.next()) { r.add(new PSqlResult(env, schemas).toArray(env)); } return r.toConstant(); } @Signature public Memory getMetaData() throws SQLException { ArrayMemory r = new ArrayMemory(); r.refOfIndex("userName").assign(metaData.getUserName()); r.refOfIndex("driverName").assign(metaData.getDriverName()); r.refOfIndex("driverVersion").assign(metaData.getDriverVersion()); r.refOfIndex("databaseName").assign(metaData.getDatabaseProductName()); r.refOfIndex("databaseVersion").assign(metaData.getDatabaseProductVersion()); r.refOfIndex("catalogSeparator").assign(metaData.getCatalogSeparator()); r.refOfIndex("catalogTerm").assign(metaData.getCatalogTerm()); r.refOfIndex("schemaTerm").assign(metaData.getSchemaTerm()); r.refOfIndex("procedureTerm").assign(metaData.getProcedureTerm()); r.refOfIndex("searchStringEscape").assign(metaData.getSearchStringEscape()); r.refOfIndex("numericFunctions").assign(metaData.getNumericFunctions()); r.refOfIndex("stringFunctions").assign(metaData.getStringFunctions()); r.refOfIndex("timeDateFunctions").assign(metaData.getTimeDateFunctions()); r.refOfIndex("systemFunctions").assign(metaData.getSystemFunctions()); r.refOfIndex("defaultTransactionIsolation").assign(metaData.getDefaultTransactionIsolation()); r.refOfIndex("identifierQuoteString").assign(metaData.getIdentifierQuoteString()); r.refOfIndex("maxBinaryLiteralLength").assign(metaData.getMaxBinaryLiteralLength()); r.refOfIndex("maxCatalogNameLength").assign(metaData.getMaxCatalogNameLength()); r.refOfIndex("maxCharLiteralLength").assign(metaData.getMaxCharLiteralLength()); r.refOfIndex("maxConnections").assign(metaData.getMaxConnections()); r.refOfIndex("maxColumnNameLength").assign(metaData.getMaxColumnNameLength()); r.refOfIndex("maxColumnsInGroupBy").assign(metaData.getMaxColumnsInGroupBy()); r.refOfIndex("maxColumnsInIndex").assign(metaData.getMaxColumnsInIndex()); r.refOfIndex("maxColumnsInOrderBy").assign(metaData.getMaxColumnsInOrderBy()); r.refOfIndex("maxColumnsInSelect").assign(metaData.getMaxColumnsInSelect()); r.refOfIndex("maxColumnsInTable").assign(metaData.getMaxColumnsInTable()); r.refOfIndex("maxCursorNameLength").assign(metaData.getMaxCursorNameLength()); r.refOfIndex("maxIndexLength").assign(metaData.getMaxIndexLength()); r.refOfIndex("maxProcedureNameLength").assign(metaData.getMaxProcedureNameLength()); r.refOfIndex("maxRowSize").assign(metaData.getMaxRowSize()); r.refOfIndex("maxSchemaNameLength").assign(metaData.getMaxSchemaNameLength()); r.refOfIndex("maxStatementLength").assign(metaData.getMaxStatementLength()); r.refOfIndex("maxTableNameLength").assign(metaData.getMaxTableNameLength()); r.refOfIndex("maxTablesInSelect").assign(metaData.getMaxTablesInSelect()); return r.toConstant(); } @Signature public PSqlStatement query(Environment env, String sql) throws Throwable { return query(env, sql, null); } @Signature public PSqlStatement query(Environment env, String sql, @Nullable ArrayMemory args) throws Throwable { PreparedStatement statement = connection.prepareStatement(sql, Statement.NO_GENERATED_KEYS); PSqlStatement sqlStatement = new PSqlStatement(env, statement); if (args != null) { int index = 0; for (ReferenceMemory arg : args) { env.invokeMethod(sqlStatement, "bind", LongMemory.valueOf(index), arg.value); index += 1; } } return sqlStatement; } @Signature public String identifier(String value) throws SQLException { String identifierQuoteString = connection.getMetaData().getIdentifierQuoteString(); return identifierQuoteString + value + identifierQuoteString; } @Signature public void close() throws SQLException { connection.close(); } @Signature public void rollback() throws SQLException { connection.rollback(); } @Signature public void commit() throws SQLException { connection.commit(); } }