postgresmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 2,483 行 · 第 1/5 页
JAVA
2,483 行
{ try { // NOTE: pg_fetch_array has an interesting memory feature. // Calls to pg_fetch_array usually return the next row for // successive calls. There is an exception though. // The first time a NULL row is passed in, the previously // returned row is returned again. After that, successive // calls return the next row as usual. // We set a flag for this. See PostgresResult and php/4342 if (row.isNull()) { if (result.getPassedNullRow()) { result.setPassedNullRow(); } else { // Step the cursor back to the previous position ResultSet rs = result.getResultSet(); rs.previous(); } } // NOTE: row is of type Value because row is optional and there is // only one way to specify that 'row' will not be used: // // pg_fetch_array(result, NULL, resultType) // // The resultType will be used above though. // // For such a case, the marshalling code passes row in as NullValue.NULL // If we used 'int row' there would be no way to distinguish row 'zero' // from row 'null'. if (result == null) return null; if (row.isLongConvertible() && row.toInt() >= 0) { if (!result.seek(env, row.toInt())) { env.warning(L.l("Unable to jump to row {0} on PostgreSQL result", row.toInt())); return null; } } return result.fetchArray(env, resultType); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return null; } } /** * Fetch a row as an associative array */ @ReturnNullAsFalse public static ArrayValue pg_fetch_assoc(Env env, @NotNull PostgresResult result, @Optional("-1") Value row) { try { if (! row.isNull() && row.toInt() >= 0) { result.seek(env, row.toInt()); } return result.fetchAssoc(env); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return null; } } /** * Fetch a row as an object */ public static Value pg_fetch_object(Env env, @NotNull PostgresResult result, @Optional("-1") Value row, @Optional int resultType) { try { //@todo use optional resultType if ((row != null) && (!row.equals(NullValue.NULL)) && (row.toInt() >= 0)) { result.seek(env, row.toInt()); } Value resultValue = result.fetchObject(env); // php/430l if (resultValue.isNull()) return BooleanValue.FALSE; else return resultValue; } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return BooleanValue.FALSE; } } /** * Returns values from a result resource */ public static Value pg_fetch_result(Env env, @NotNull PostgresResult result, Value row, @Optional("-1") Value fieldNameOrNumber) { try { // NOTE: row is of type Value because there is a case where // row is optional. In such a case, the row value passed in // is actually the field number or field name. int rowNumber = -1; // Handle the case: optional row with mandatory fieldNameOrNumber. if (fieldNameOrNumber.isLongConvertible() && (fieldNameOrNumber.toInt() < 0)) { fieldNameOrNumber = row; rowNumber = -1; } else { rowNumber = row.toInt(); } if (rowNumber >= 0) { result.seek(env, rowNumber); } Value fetchRow = result.fetchRow(env); int fieldNumber = result.getColumnNumber(fieldNameOrNumber, 0); return fetchRow.get(LongValue.create(fieldNumber)); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return BooleanValue.FALSE; } } /** * Returns values from a result resource */ public static Value pg_result(Env env, @NotNull PostgresResult result, Value row, @Optional("-1") Value fieldNameOrNumber) { return pg_fetch_result(env, result, row, fieldNameOrNumber); } /** * Get a row as an enumerated array */ @ReturnNullAsFalse public static ArrayValue pg_fetch_row(Env env, @NotNull PostgresResult result, @Optional("-1") Value row) { try { if ((row != null) && (!row.equals(NullValue.NULL)) && (row.toInt() >= 0)) { result.seek(env, row.toInt()); } return result.fetchRow(env); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return null; } } /** * Test if a field is SQL NULL */ @ReturnNullAsFalse public static LongValue pg_field_is_null(Env env, @NotNull PostgresResult result, Value row, @Optional("-1") Value fieldNameOrNumber) { try { // NOTE: row is of type Value because there is a case where // row is optional. In such a case, the row value passed in // is actually the field number or field name. int rowNumber = -1; // Handle the case: optional row with mandatory fieldNameOrNumber. if (fieldNameOrNumber.isLongConvertible() && (fieldNameOrNumber.toInt() == -1)) { fieldNameOrNumber = row; rowNumber = -1; } else { rowNumber = row.toInt(); } if (rowNumber >= 0) { if (!result.seek(env, rowNumber)) { env.warning(L.l("Unable to jump to row {0} on PostgreSQL result", rowNumber)); return null; } } int fieldNumber = result.getColumnNumber(fieldNameOrNumber, 0); Value field = pg_fetch_result(env, result, LongValue.MINUS_ONE, LongValue.create(fieldNumber)); if (field == null || field.isNull()) return LongValue.ONE; else return LongValue.ZERO; } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return null; } } /** * pg_field_is_null() alias. */ @ReturnNullAsFalse public static LongValue pg_fieldisnull(Env env, @NotNull PostgresResult result, Value row, @Optional("-1") Value fieldNameOrNumber) { return pg_field_is_null(env, result, row, fieldNameOrNumber); } /** * Returns the name of a field */ public static Value pg_field_name(Env env, @NotNull PostgresResult result, int fieldNumber) { try { if (result == null) return BooleanValue.FALSE; return result.getFieldName(env, fieldNumber); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return BooleanValue.FALSE; } } /** * pg_field_name() alias. */ public static Value pg_fieldname(Env env, @NotNull PostgresResult result, int fieldNumber) { return pg_field_name(env, result, fieldNumber); } /** * Returns the field number of the named field * * @return the field number (0-based) or -1 on error */ public static int pg_field_num(Env env, @NotNull PostgresResult result, String fieldName) { try { return result.getColumnNumber(fieldName); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return -1; } } /** * pg_field_num() alias. */ public static int pg_fieldnum(Env env, @NotNull PostgresResult result, String fieldName) { return pg_field_num(env, result, fieldName); } /** * Returns the printed length */ public static int pg_field_prtlen(Env env, @NotNull PostgresResult result, Value rowNumber, @Optional("-1") Value fieldNameOrNumber) { try { int row = rowNumber.toInt(); if (fieldNameOrNumber.toString().equals("-1")) { fieldNameOrNumber = rowNumber; row = -1; } int fieldNumber = result.getColumnNumber(fieldNameOrNumber, 0); ResultSetMetaData metaData = result.getMetaData(); String typeName = metaData.getColumnTypeName(fieldNumber+1); if (typeName.equals("bool")) { return 1; } Value value = pg_fetch_result(env, result, LongValue.create(row), LongValue.create(fieldNumber)); // Step the cursor back to the original position // See php/430p result.getResultSet().previous(); int len = value.toString().length(); // XXX: check this... // if (typeName.equals("money")) { // len++; // } return len; } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return -1; } } /** * pg_field_ptrlen() alias. */ public static int pg_fieldprtlen(Env env, @NotNull PostgresResult result, Value rowNumber, @Optional("-1") Value fieldNameOrNumber) { return pg_field_prtlen(env, result, rowNumber, fieldNameOrNumber); } /** * Returns the internal storage size of the named field */ @ReturnNullAsFalse public static LongValue pg_field_size(Env env, @NotNull PostgresResult result, int fieldNumber) { try { ResultSetMetaData metaData = result.getMetaData(); fieldNumber++; int dataType = metaData.getColumnType(fieldNumber); int size = -1; switch (dataType) { case Types.BIT: { String typeName = metaData.getColumnTypeName(fieldNumber); if (typeName.equals("bool")) { size = 1; } break; } case Types.TINYINT: size = 1; break; case Types.SMALLINT: size = 2; break; case Types.DATE: case Types.FLOAT: case Types.INTEGER: case Types.REAL: size = 4; break; case Types.BIGINT: case Types.DOUBLE: { size = 8; String typeName = metaData.getColumnTypeName(fieldNumber); if (typeName.equals("money")) { size = 4; } } break; case Types.TIME: case Types.TIMESTAMP: size = 8; // fall to specific cases default: { String typeName = metaData.getColumnTypeName(fieldNumber); if (typeName.equals("timetz") || typeName.equals("interval")) { size = 12; } else if (typeName.equals("macaddr")) { size = 6; } else if (typeName.equals("point")) { size = 16; } else if (typeName.equals("circle")) { size = 24; } else if (typeName.equals("box") || typeName.equals("lseg")) { size = 32; } } } return LongValue.create(size); } catch (Exception ex) { log.log(Level.FINE, ex.toString(), ex); return null; } } /** * pg_field_size() alias. */ @ReturnNullAsFalse public static LongValue pg_fieldsize(Env env, @NotNull PostgresResult result, int fieldNumber) { return pg_field_size(env, result, fieldNumber); } /** * Returns the name or oid of the tables field * * @return By default the tables name that field belongs to * is returned but if oid_only is set to TRUE, * then the oid will instead be returned. */ @ReturnNullAsFalse public static String pg_field_table(Env env, @NotNull PostgresResult result, int fieldNumber, @Optional("false") boolean oidOnly) { // The Postgres JDBC driver doesn't have a concept of exposing to the client // what table maps to a particular select item in a result set, therefore the // driver cannot report anything useful to the caller. Thus the driver always // returns "" to ResultSetMetaData.getTableName(fieldNumber+1) env.stub("pg_field_table"); return ""; } /** * Returns the type ID (OID) for the corresponding field number */ @ReturnNullAsFalse public static LongValue pg_field_type_oid(Env env, @NotNull PostgresResult result, int fieldNumber) { try { ResultSetMetaData metaData = result.getMetaData(); String columnTypeName = metaData.getColumnTypeName(fieldNumber + 1); String metaQuery = ("SELECT oid FROM pg_type WHERE typname='" + columnTypeName + "'"); result = pg_query(env, (Postgres) result.getConnection(), metaQuery); Value value = pg_fetch_result(env, result,
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?