From 25dadc85140b1f688a4cf0c2de8b961a07b10f11 Mon Sep 17 00:00:00 2001 From: Peter Mount Date: Mon, 17 Apr 2000 20:07:56 +0000 Subject: Another attempt at 7.0 --- .../jdbc/org/postgresql/util/Serialize.java | 342 +++++++++++++++++++++ 1 file changed, 342 insertions(+) create mode 100644 src/interfaces/jdbc/org/postgresql/util/Serialize.java (limited to 'src/interfaces/jdbc/org/postgresql/util/Serialize.java') diff --git a/src/interfaces/jdbc/org/postgresql/util/Serialize.java b/src/interfaces/jdbc/org/postgresql/util/Serialize.java new file mode 100644 index 0000000000..3af43e6eb8 --- /dev/null +++ b/src/interfaces/jdbc/org/postgresql/util/Serialize.java @@ -0,0 +1,342 @@ +package org.postgresql.util; + +import java.io.*; +import java.lang.*; +import java.lang.reflect.*; +import java.net.*; +import java.util.*; +import java.sql.*; + +/** + * This class uses PostgreSQL's object oriented features to store Java Objects. + * + * It does this by mapping a Java Class name to a table in the database. Each + * entry in this new table then represents a Serialized instance of this + * class. As each entry has an OID (Object IDentifier), this OID can be + * included in another table. + * + * This is too complex to show here, and will be documented in the main + * documents in more detail. + * + */ +public class Serialize +{ + // This is the connection that the instance refers to + protected org.postgresql.Connection conn; + + // This is the table name + protected String tableName; + + // This is the class name + protected String className; + + // This is the Class for this serialzed object + protected Class ourClass; + + /** + * This creates an instance that can be used to serialize or deserialize + * a Java object from a PostgreSQL table. + */ + public Serialize(org.postgresql.Connection c,String type) throws SQLException + { + try { + conn = c; + tableName = type.toLowerCase(); + className = toClassName(type); + ourClass = Class.forName(className); + } catch(ClassNotFoundException cnfe) { + throw new PSQLException("postgresql.serial.noclass",type); + } + + // Second check, the type must be a table + boolean status = false; + ResultSet rs = conn.ExecSQL("select typname from pg_type,pg_class where typname=relname and typname='"+type+"'"); + if(rs!=null) { + if(rs.next()) + status=true; + rs.close(); + } + // This should never occur, as org.postgresql has it's own internal checks + if(!status) + throw new PSQLException("postgresql.serial.table",type); + + // Finally cache the fields within the table + } + + /** + * This fetches an object from a table, given it's OID + * @param oid The oid of the object + * @return Object relating to oid + * @exception SQLException on error + */ + public Object fetch(int oid) throws SQLException + { + try { + Object obj = ourClass.newInstance(); + + // NB: we use java.lang.reflect here to prevent confusion with + // the org.postgresql.Field + java.lang.reflect.Field f[] = ourClass.getDeclaredFields(); + boolean hasOID=false; + int oidFIELD=-1; + StringBuffer sb = new StringBuffer("select"); + char sep=' '; + for(int i=0;i + * + * If the object has an int called OID, and it is > 0, then + * that value is used for the OID, and the table will be updated. + * If the value of OID is 0, then a new row will be created, and the + * value of OID will be set in the object. This enables an object's + * value in the database to be updateable. + * + * If the object has no int called OID, then the object is stored. However + * if the object is later retrieved, amended and stored again, it's new + * state will be appended to the table, and will not overwrite the old + * entries. + * + * @param o Object to store (must implement Serializable) + * @return oid of stored object + * @exception SQLException on error + */ + public int store(Object o) throws SQLException + { + try { + // NB: we use java.lang.reflect here to prevent confusion with + // the org.postgresql.Field + java.lang.reflect.Field f[] = ourClass.getDeclaredFields(); + boolean hasOID=false; + int oidFIELD=-1; + boolean update=false; + + // Find out if we have an oid value + for(int i=0;i0; + } + } + + StringBuffer sb = new StringBuffer(update?"update "+tableName+" set":"insert into "+tableName+" values "); + char sep=update?' ':'('; + for(int i=0;i + * + * Because of this, a Class name may not have _ in the name.

+ * Another limitation, is that the entire class name (including packages) + * cannot be longer than 32 characters (a limit forced by PostgreSQL). + * + * @param name Class name + * @return PostgreSQL table name + * @exception SQLException on error + */ + public static String toPostgreSQL(String name) throws SQLException + { + name = name.toLowerCase(); + + if(name.indexOf("_")>-1) + throw new PSQLException("postgresql.serial.underscore"); + + if(name.length()>32) + throw new PSQLException("postgresql.serial.namelength",name,new Integer(name.length())); + + return name.replace('.','_'); + } + + + /** + * This converts a org.postgresql table to a Java Class name, by replacing _ with + * .

+ * + * @param name PostgreSQL table name + * @return Class name + * @exception SQLException on error + */ + public static String toClassName(String name) throws SQLException + { + name = name.toLowerCase(); + return name.replace('_','.'); + } + +} -- cgit v1.2.1