summaryrefslogtreecommitdiff
path: root/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/interfaces/jdbc/org/postgresql/jdbc2/Array.java')
-rw-r--r--src/interfaces/jdbc/org/postgresql/jdbc2/Array.java364
1 files changed, 0 insertions, 364 deletions
diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java
deleted file mode 100644
index e38b0c92ed..0000000000
--- a/src/interfaces/jdbc/org/postgresql/jdbc2/Array.java
+++ /dev/null
@@ -1,364 +0,0 @@
-package org.postgresql.jdbc2;
-
-import org.postgresql.core.BaseConnection;
-import org.postgresql.core.BaseResultSet;
-import org.postgresql.core.BaseStatement;
-import org.postgresql.core.Field;
-import org.postgresql.util.PSQLException;
-import org.postgresql.util.PSQLState;
-
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Map;
-import java.util.Vector;
-
-/*
- * Array is used collect one column of query result data.
- *
- * <p>Read a field of type Array into either a natively-typed
- * Java array object or a ResultSet. Accessor methods provide
- * the ability to capture array slices.
- *
- * <p>Other than the constructor all methods are direct implementations
- * of those specified for java.sql.Array. Please refer to the javadoc
- * for java.sql.Array for detailed descriptions of the functionality
- * and parameters of the methods of this class.
- *
- * @see ResultSet#getArray
- */
-
-
-public class Array implements java.sql.Array
-{
- private BaseConnection conn = null;
- private Field field = null;
- private BaseResultSet rs;
- private int idx = 0;
- private String rawString = null;
-
- /*
- * Create a new Array
- *
- * @param conn a database connection
- * @param idx 1-based index of the query field to load into this Array
- * @param field the Field descriptor for the field to load into this Array
- * @param rs the ResultSet from which to get the data for this Array
- */
- public Array(BaseConnection conn, int idx, Field field, BaseResultSet rs )
- throws SQLException
- {
- this.conn = conn;
- this.field = field;
- this.rs = rs;
- this.idx = idx;
- this.rawString = rs.getFixedString(idx);
- }
-
- public Object getArray() throws SQLException
- {
- return getArray( 1, 0, null );
- }
-
- public Object getArray(long index, int count) throws SQLException
- {
- return getArray( index, count, null );
- }
-
- public Object getArray(Map map) throws SQLException
- {
- return getArray( 1, 0, map );
- }
-
- public Object getArray(long index, int count, Map map) throws SQLException
- {
- if ( map != null ) // For now maps aren't supported.
- throw org.postgresql.Driver.notImplemented();
-
- if (index < 1)
- throw new PSQLException("postgresql.arr.range", PSQLState.DATA_ERROR);
- Object retVal = null;
-
- ArrayList array = new ArrayList();
-
- /* Check if the String is also not an empty array
- * otherwise there will be an exception thrown below
- * in the ResultSet.toX with an empty string.
- * -- Doug Fields <dfields-pg-jdbc@pexicom.com> Feb 20, 2002 */
-
- if ( rawString != null && !rawString.equals("{}") )
- {
- char[] chars = rawString.toCharArray();
- StringBuffer sbuf = new StringBuffer();
- boolean foundOpen = false;
- boolean insideString = false;
- for ( int i = 0; i < chars.length; i++ )
- {
- if ( chars[i] == '\\' )
- //escape character that we need to skip
- i++;
- else if (!insideString && chars[i] == '{' )
- {
- if ( foundOpen ) // Only supports 1-D arrays for now
- throw org.postgresql.Driver.notImplemented();
- foundOpen = true;
- continue;
- }
- else if (chars[i] == '"')
- {
- insideString = !insideString;
- continue;
- }
- else if (!insideString && (chars[i] == ',' || chars[i] == '}') ||
- i == chars.length - 1)
- {
- if ( chars[i] != '"' && chars[i] != '}' && chars[i] != ',' )
- sbuf.append(chars[i]);
- array.add( sbuf.toString() );
- sbuf = new StringBuffer();
- continue;
- }
- sbuf.append( chars[i] );
- }
- }
- String[] arrayContents = (String[]) array.toArray( new String[array.size()] );
- if ( count == 0 )
- count = arrayContents.length;
- index--;
- if ( index + count > arrayContents.length )
- throw new PSQLException("postgresql.arr.range", PSQLState.DATA_ERROR);
-
- int i = 0;
- switch ( getBaseType() )
- {
- case Types.BIT:
- retVal = new boolean[ count ];
- for ( ; count > 0; count-- )
- ((boolean[])retVal)[i++] = AbstractJdbc2ResultSet.toBoolean( arrayContents[(int)index++] );
- break;
- case Types.SMALLINT:
- case Types.INTEGER:
- retVal = new int[ count ];
- for ( ; count > 0; count-- )
- ((int[])retVal)[i++] = AbstractJdbc2ResultSet.toInt( arrayContents[(int)index++] );
- break;
- case Types.BIGINT:
- retVal = new long[ count ];
- for ( ; count > 0; count-- )
- ((long[])retVal)[i++] = AbstractJdbc2ResultSet.toLong( arrayContents[(int)index++] );
- break;
- case Types.NUMERIC:
- retVal = new BigDecimal[ count ];
- for ( ; count > 0; count-- )
- ((BigDecimal[])retVal)[i++] = AbstractJdbc2ResultSet.toBigDecimal( arrayContents[(int)index++], 0 );
- break;
- case Types.REAL:
- retVal = new float[ count ];
- for ( ; count > 0; count-- )
- ((float[])retVal)[i++] = AbstractJdbc2ResultSet.toFloat( arrayContents[(int)index++] );
- break;
- case Types.DOUBLE:
- retVal = new double[ count ];
- for ( ; count > 0; count-- )
- ((double[])retVal)[i++] = AbstractJdbc2ResultSet.toDouble( arrayContents[(int)index++] );
- break;
- case Types.CHAR:
- case Types.VARCHAR:
- retVal = new String[ count ];
- for ( ; count > 0; count-- )
- ((String[])retVal)[i++] = arrayContents[(int)index++];
- break;
- case Types.DATE:
- retVal = new java.sql.Date[ count ];
- for ( ; count > 0; count-- )
- ((java.sql.Date[])retVal)[i++] = AbstractJdbc2ResultSet.toDate( arrayContents[(int)index++] );
- break;
- case Types.TIME:
- retVal = new java.sql.Time[ count ];
- for ( ; count > 0; count-- )
- ((java.sql.Time[])retVal)[i++] = AbstractJdbc2ResultSet.toTime( arrayContents[(int)index++], rs, getBaseTypeName() );
- break;
- case Types.TIMESTAMP:
- retVal = new Timestamp[ count ];
- for ( ; count > 0; count-- )
- ((java.sql.Timestamp[])retVal)[i++] = AbstractJdbc2ResultSet.toTimestamp( arrayContents[(int)index++], rs, getBaseTypeName() );
- break;
-
- // Other datatypes not currently supported. If you are really using other types ask
- // yourself if an array of non-trivial data types is really good database design.
- default:
- throw org.postgresql.Driver.notImplemented();
- }
- return retVal;
- }
-
- public int getBaseType() throws SQLException
- {
- return conn.getSQLType(getBaseTypeName());
- }
-
- public String getBaseTypeName() throws SQLException
- {
- String fType = field.getPGType();
- if ( fType.charAt(0) == '_' )
- fType = fType.substring(1);
- return fType;
- }
-
- public java.sql.ResultSet getResultSet() throws SQLException
- {
- return getResultSet( 1, 0, null );
- }
-
- public java.sql.ResultSet getResultSet(long index, int count) throws SQLException
- {
- return getResultSet( index, count, null );
- }
-
- public java.sql.ResultSet getResultSet(Map map) throws SQLException
- {
- return getResultSet( 1, 0, map );
- }
-
- public java.sql.ResultSet getResultSet(long index, int count, java.util.Map map) throws SQLException
- {
- Object array = getArray( index, count, map );
- Vector rows = new Vector();
- Field[] fields = new Field[2];
- fields[0] = new Field(conn, "INDEX", conn.getPGType("int2"), 2);
- switch ( getBaseType() )
- {
- case Types.BIT:
- boolean[] booleanArray = (boolean[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("bool"), 1);
- for ( int i = 0; i < booleanArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( (booleanArray[i] ? "YES" : "NO") ); // Value
- rows.addElement(tuple);
- }
- case Types.SMALLINT:
- fields[1] = new Field(conn, "VALUE", conn.getPGType("int2"), 2);
- case Types.INTEGER:
- int[] intArray = (int[]) array;
- if ( fields[1] == null )
- fields[1] = new Field(conn, "VALUE", conn.getPGType("int4"), 4);
- for ( int i = 0; i < intArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( Integer.toString(intArray[i]) ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.BIGINT:
- long[] longArray = (long[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("int8"), 8);
- for ( int i = 0; i < longArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( Long.toString(longArray[i]) ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.NUMERIC:
- BigDecimal[] bdArray = (BigDecimal[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("numeric"), -1);
- for ( int i = 0; i < bdArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( bdArray[i].toString() ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.REAL:
- float[] floatArray = (float[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("float4"), 4);
- for ( int i = 0; i < floatArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( Float.toString(floatArray[i]) ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.DOUBLE:
- double[] doubleArray = (double[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("float8"), 8);
- for ( int i = 0; i < doubleArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( Double.toString(doubleArray[i]) ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.CHAR:
- fields[1] = new Field(conn, "VALUE", conn.getPGType("char"), 1);
- case Types.VARCHAR:
- String[] strArray = (String[]) array;
- if ( fields[1] == null )
- fields[1] = new Field(conn, "VALUE", conn.getPGType("varchar"), -1);
- for ( int i = 0; i < strArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( strArray[i] ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.DATE:
- java.sql.Date[] dateArray = (java.sql.Date[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("date"), 4);
- for ( int i = 0; i < dateArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( dateArray[i].toString() ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.TIME:
- java.sql.Time[] timeArray = (java.sql.Time[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("time"), 8);
- for ( int i = 0; i < timeArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( timeArray[i].toString() ); // Value
- rows.addElement(tuple);
- }
- break;
- case Types.TIMESTAMP:
- java.sql.Timestamp[] timestampArray = (java.sql.Timestamp[]) array;
- fields[1] = new Field(conn, "VALUE", conn.getPGType("timestamp"), 8);
- for ( int i = 0; i < timestampArray.length; i++ )
- {
- byte[][] tuple = new byte[2][0];
- tuple[0] = conn.getEncoding().encode( Integer.toString((int)index + i) ); // Index
- tuple[1] = conn.getEncoding().encode( timestampArray[i].toString() ); // Value
- rows.addElement(tuple);
- }
- break;
-
- // Other datatypes not currently supported. If you are really using other types ask
- // yourself if an array of non-trivial data types is really good database design.
- default:
- throw org.postgresql.Driver.notImplemented();
- }
- BaseStatement stat = (BaseStatement) conn.createStatement();
- return (ResultSet) stat.createResultSet(fields, rows, "OK", 1, 0, false);
- }
-
- public String toString()
- {
- return rawString;
- }
-}
-