Beispiel #1
0
        /// <summary>
        /// Insert object in the database. There is should be table in the database with
        /// name equal to the full class name of the inserted object (comparison is
        /// case sensitive). GigaBASE will store to the database all non-static and
        /// non-transient fields from the class. All Java primitive types,
        /// <code>java.lang.string</code>, arrays of primitive types or strings, <code>java.util.Date</code>
        /// are supported by GigaBASE. If <code>int</code> field is marked as <code>volatile</code>, it
        /// is assumed to be autoincremented field - unique value to this field is assigned automatically
        /// by GigaBASE.
        /// </summary>
        /// <param name="obj">object to be inserted inthe database</param>
        /// <returns>reference to the inserted object</returns>
        ///
        public Reference insert(object obj)
        {
            if (socket == null)
            {
                throw new CliError("Session is not opened");
            }
            Type            clazz     = obj.GetType();
            string          className = clazz.Name;
            TableDescriptor tableDesc;

            lock (tableHash) {
                tableDesc = (TableDescriptor)tableHash[className];
                if (tableDesc == null)
                {
                    tableDesc            = new TableDescriptor(clazz);
                    tableHash[className] = tableDesc;
                }
            }
            ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_prepare_and_insert);

            buf.putAsciiz("insert into " + className);
            buf.putByte(tableDesc.nColumns);
            tableDesc.writeColumnDefs(buf);
            tableDesc.writeColumnValues(buf, obj);
            send(buf);
            receive(buf, 12);
            CLIStatus rc = (CLIStatus)buf.getInt();

            if (rc == CLIStatus.cli_ok)
            {
                int rowid = buf.getInt();
                int oid   = buf.getInt();
                if (tableDesc.autoincrement)
                {
                    for (int i = tableDesc.nColumns; --i >= 0;)
                    {
                        if (tableDesc.types[i] == CLIType.cli_autoincrement)
                        {
                            tableDesc.columns[i].SetValue(obj, rowid);
                        }
                    }
                }
                return((oid != 0) ? new Reference(oid) : null);
            }
            else
            {
                throw new CliError("Insert object operation failed with status " + rc);
            }
        }
Beispiel #2
0
        internal int sendReceive(ComBuffer buf)
        {
            send(buf);
            receive(buf, 4);
            int rc = buf.getInt();

            if (rc < 0)
            {
                throw new CliError("Request failed with status " + rc);
            }
            return(rc);
        }
Beispiel #3
0
        internal object getObject(Connection.CLICommand cmd, int n)
        {
            if (stmt == null)
            {
                throw new CliError("ObjectSet was aleady closed");
            }
            if (stmt.con == null)
            {
                throw new CliError("Statement was closed");
            }
            ComBuffer buf = new ComBuffer(cmd, stmt.stmtId);

            if (cmd == Connection.CLICommand.cli_cmd_skip)
            {
                buf.putInt(n);
            }
            stmt.con.send(buf);
            buf.reset(4);
            stmt.con.receive(buf, 4);
            int len = buf.getInt();

            if (len == (int)Connection.CLIStatus.cli_not_found)
            {
                return(null);
            }
            else if (len <= 0)
            {
                throw new CliError("Failed to get object");
            }
            buf.reset(len - 4);
            stmt.con.receive(buf, len - 4);
            currOid = buf.getInt();
            if (currOid == 0)
            {
                return(null);
            }
            updated = false;
            return(currObj = stmt.tableDesc.readObject(buf));
        }
Beispiel #4
0
        /// <summary>
        /// Create table matching specified class.  Name of the table is equal
        /// to class name without any package prefixes. This table will include columns
        /// corresponsinf to all non-static and non-transient fields of specified class and base classes
        /// of this class.
        /// </summary>
        /// <param name="cls">Java class for which table should be created</param>
        /// <returns><code>true</code> if table sucessfully created, <code>false</code>
        /// if table already exists, throws <code>CliError</code> exception in case of all other errors</returns>
        ///
        public bool createTable(Type cls)
        {
            int i;

            if (socket == null)
            {
                throw new CliError("Session is not opened");
            }
            Type c;
            int  nColumns = 0;

            for (c = cls; c != null; c = c.BaseType)
            {
                FieldInfo[] classFields = c.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly);
                for (i = 0; i < classFields.Length; i++)
                {
                    if (!classFields[i].IsStatic && !classFields[i].IsNotSerialized)
                    {
                        nColumns += 1;
                    }
                }
            }
            ComBuffer buf       = new ComBuffer(CLICommand.cli_cmd_create_table);
            String    tableName = cls.Name;

            buf.putAsciiz(tableName);
            buf.putByte(nColumns);
            for (c = cls; c != null; c = c.BaseType)
            {
                FieldInfo[] classFields = c.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly);
                for (i = 0; i < classFields.Length; i++)
                {
                    FieldInfo f              = classFields[i];
                    String    refTableName   = "";
                    String    inverseRefName = "";
                    if (!f.IsStatic && !f.IsNotSerialized)
                    {
                        Type type = f.FieldType;
                        Connection.CLIType cliType;
                        if (type == typeof(byte))
                        {
                            cliType = Connection.CLIType.cli_int1;
                        }
                        else if (type == typeof(short))
                        {
                            cliType = Connection.CLIType.cli_int2;
                        }
                        else if (type == typeof(int))
                        {
                            if (f.GetCustomAttributes(typeof(AutoincrementAttribute), false).Length > 0)
                            {
                                cliType = Connection.CLIType.cli_autoincrement;
                            }
                            else
                            {
                                cliType = Connection.CLIType.cli_int4;
                            }
                        }
                        else if (type == typeof(bool))
                        {
                            cliType = Connection.CLIType.cli_bool;
                        }
                        else if (type == typeof(long))
                        {
                            cliType = Connection.CLIType.cli_int8;
                        }
                        else if (type == typeof(float))
                        {
                            cliType = Connection.CLIType.cli_real4;
                        }
                        else if (type == typeof(double))
                        {
                            cliType = Connection.CLIType.cli_real8;
                        }
                        else if (type == typeof(Reference))
                        {
                            cliType = Connection.CLIType.cli_oid;
                            object[] attribs = f.GetCustomAttributes(typeof(ReferencesAttribute), false);
                            if (attribs.Length == 0)
                            {
                                throw new CliError("Rererences attribute should be specified for rererence field");
                            }
                            ReferencesAttribute ra = (ReferencesAttribute)attribs[0];
                            if (ra.refTableName == null)
                            {
                                throw new CliError("Name of referenced table should be specified");
                            }
                            refTableName = ra.refTableName;
                            if (ra.inverseRefName != null)
                            {
                                inverseRefName = ra.inverseRefName;
                            }
                        }
                        else if (type == typeof(Rectangle))
                        {
                            cliType = Connection.CLIType.cli_rectangle;
                        }
                        else if (type == typeof(string))
                        {
                            cliType = Connection.CLIType.cli_asciiz;
                        }
                        else if (type == typeof(DateTime))
                        {
                            cliType = Connection.CLIType.cli_datetime;
                        }
                        else if (type.IsArray)
                        {
                            type = type.GetElementType();
                            if (type == typeof(byte))
                            {
                                cliType = Connection.CLIType.cli_array_of_int1;
                            }
                            else if (type == typeof(short))
                            {
                                cliType = Connection.CLIType.cli_array_of_int2;
                            }
                            else if (type == typeof(int))
                            {
                                cliType = Connection.CLIType.cli_array_of_int4;
                            }
                            else if (type == typeof(bool))
                            {
                                cliType = Connection.CLIType.cli_array_of_bool;
                            }
                            else if (type == typeof(long))
                            {
                                cliType = Connection.CLIType.cli_array_of_int8;
                            }
                            else if (type == typeof(float))
                            {
                                cliType = Connection.CLIType.cli_array_of_real4;
                            }
                            else if (type == typeof(double))
                            {
                                cliType = Connection.CLIType.cli_array_of_real8;
                            }
                            else if (type == typeof(Reference))
                            {
                                cliType = Connection.CLIType.cli_array_of_oid;
                                object[] attribs = f.GetCustomAttributes(typeof(ReferencesAttribute), false);
                                if (attribs.Length == 0)
                                {
                                    throw new CliError("Rererences attribute should be specified for rererence field");
                                }
                                ReferencesAttribute ra = (ReferencesAttribute)attribs[0];
                                if (ra.refTableName == null)
                                {
                                    throw new CliError("Name of referenced table should be specified");
                                }
                                refTableName = ra.refTableName;
                                if (ra.inverseRefName != null)
                                {
                                    inverseRefName = ra.inverseRefName;
                                }
                            }
                            else if (type == typeof(string))
                            {
                                cliType = Connection.CLIType.cli_array_of_string;
                            }
                            else
                            {
                                throw new CliError("Unsupported array type " + type.Name);
                            }
                        }
                        else
                        {
                            throw new CliError("Unsupported field type " + type.Name);
                        }
                        buf.putByte((int)cliType);
                        buf.putByte(0);
                        buf.putAsciiz(f.Name);
                        buf.putAsciiz(refTableName);
                        buf.putAsciiz(inverseRefName);
                    }
                }
            }
            send(buf);
            receive(buf, 4);
            int rc = buf.getInt();

            if (rc == (int)CLIStatus.cli_table_already_exists)
            {
                return(false);
            }
            else if (rc < 0)
            {
                throw new CliError("Create table failed with status: " + rc);
            }
            return(true);
        }
Beispiel #5
0
 internal int sendReceive(ComBuffer buf)
 {
     send(buf);
     receive(buf, 4);
     int rc = buf.getInt();
     if (rc < 0) {
     throw new CliError("Request failed with status " + rc);
     }
     return rc;
 }
Beispiel #6
0
 /// <summary>
 /// Insert object in the database. There is should be table in the database with
 /// name equal to the full class name of the inserted object (comparison is 
 /// case sensitive). GigaBASE will store to the database all non-static and 
 /// non-transient fields from the class. All Java primitive types, 
 /// <code>java.lang.string</code>, arrays of primitive types or strings, <code>java.util.Date</code>
 /// are supported by GigaBASE. If <code>int</code> field is marked as <code>volatile</code>, it
 /// is assumed to be autoincremented field - unique value to this field is assigned automatically 
 /// by GigaBASE. 
 /// </summary>
 /// <param name="obj">object to be inserted inthe database</param>
 /// <returns>reference to the inserted object</returns>
 ///
 public Reference insert(object obj)
 {
     if (socket == null) {
     throw new CliError("Session is not opened");
     }
     Type clazz = obj.GetType();
     string className = clazz.Name;
     TableDescriptor tableDesc;
     lock (tableHash) {
     tableDesc = (TableDescriptor)tableHash[className];
     if (tableDesc == null) {
     tableDesc = new TableDescriptor(clazz);
     tableHash[className] = tableDesc;
     }
     }
     ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_prepare_and_insert);
     buf.putAsciiz("insert into " + className);
     buf.putByte(tableDesc.nColumns);
     tableDesc.writeColumnDefs(buf);
     tableDesc.writeColumnValues(buf, obj);
     send(buf);
     receive(buf, 12);
     CLIStatus rc = (CLIStatus)buf.getInt();
     if (rc == CLIStatus.cli_ok) {
     int rowid = buf.getInt();
     int oid = buf.getInt();
     if (tableDesc.autoincrement) {
     for (int i = tableDesc.nColumns; --i >= 0;) {
     if (tableDesc.types[i] == CLIType.cli_autoincrement) {
     tableDesc.columns[i].SetValue(obj, rowid);
     }
     }
     }
     return (oid != 0) ? new Reference(oid) : null;
     } else {
     throw new CliError("Insert object operation failed with status " + rc);
     }
 }
Beispiel #7
0
 /// <summary>
 /// Create table matching specified class.  Name of the table is equal
 /// to class name without any package prefixes. This table will include columns
 /// corresponsinf to all non-static and non-transient fields of specified class and base classes
 /// of this class. 
 /// </summary>
 /// <param name="cls">Java class for which table should be created</param>
 /// <returns><code>true</code> if table sucessfully created, <code>false</code> 
 /// if table already exists, throws <code>CliError</code> exception in case of all other errors</returns>
 ///
 public bool createTable(Type cls)
 {
     int i;
     if (socket == null) {
     throw new CliError("Session is not opened");
     }
     Type c;
     int nColumns = 0;
     for (c = cls; c != null; c = c.BaseType) {
     FieldInfo[] classFields = c.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly);
     for (i = 0; i < classFields.Length; i++) {
         if (!classFields[i].IsStatic && !classFields[i].IsNotSerialized) {
             nColumns += 1;
         }
     }
     }
     ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_create_table);
     String tableName = cls.Name;
     buf.putAsciiz(tableName);
     buf.putByte(nColumns);
     for (c = cls; c != null; c = c.BaseType) {
     FieldInfo[] classFields = c.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly);
     for (i = 0; i < classFields.Length; i++) {
     FieldInfo f = classFields[i];
         String refTableName = "";
         String inverseRefName = "";
         if (!f.IsStatic && !f.IsNotSerialized) {
             Type type = f.FieldType;
             Connection.CLIType cliType;
             if (type == typeof(byte)) {
                 cliType = Connection.CLIType.cli_int1;
             } else if (type == typeof(short)) {
                 cliType = Connection.CLIType.cli_int2;
             } else if (type == typeof(int)) {
                 if (f.GetCustomAttributes(typeof(AutoincrementAttribute), false).Length > 0) {
                     cliType = Connection.CLIType.cli_autoincrement;
                 }
                 else {
                     cliType = Connection.CLIType.cli_int4;
                 }
             } else if (type == typeof(bool)) {
                 cliType = Connection.CLIType.cli_bool;
             } else if (type == typeof(long)) {
                 cliType = Connection.CLIType.cli_int8;
             } else if (type == typeof(float)) {
                 cliType = Connection.CLIType.cli_real4;
             } else if (type == typeof(double)) {
                 cliType = Connection.CLIType.cli_real8;
             } else if (type == typeof(Reference)) {
                 cliType = Connection.CLIType.cli_oid;
                 object[] attribs = f.GetCustomAttributes(typeof(ReferencesAttribute), false);
                 if (attribs.Length == 0) {
                     throw new CliError("Rererences attribute should be specified for rererence field");
                 }
                 ReferencesAttribute ra = (ReferencesAttribute)attribs[0];
                 if (ra.refTableName == null) {
                     throw new CliError("Name of referenced table should be specified");
                 }
                 refTableName = ra.refTableName;
                 if (ra.inverseRefName != null) {
                     inverseRefName = ra.inverseRefName;
                 }
             } else if (type == typeof(Rectangle)) {
                 cliType = Connection.CLIType.cli_rectangle;
             } else if (type == typeof(string)) {
                 cliType = Connection.CLIType.cli_asciiz;
             } else if (type == typeof(DateTime)) {
                 cliType = Connection.CLIType.cli_datetime;
             } else if (type.IsArray) {
                 type = type.GetElementType();
                 if (type == typeof(byte)) {
                     cliType = Connection.CLIType.cli_array_of_int1;
                 } else if (type == typeof(short)) {
                     cliType = Connection.CLIType.cli_array_of_int2;
                 } else if (type == typeof(int)) {
                     cliType = Connection.CLIType.cli_array_of_int4;
                 } else if (type == typeof(bool)) {
                     cliType = Connection.CLIType.cli_array_of_bool;
                 } else if (type == typeof(long)) {
                     cliType = Connection.CLIType.cli_array_of_int8;
                 } else if (type == typeof(float)) {
                     cliType = Connection.CLIType.cli_array_of_real4;
                 } else if (type == typeof(double)) {
                     cliType = Connection.CLIType.cli_array_of_real8;
                 } else if (type == typeof(Reference)) {
                     cliType = Connection.CLIType.cli_array_of_oid;
                     object[] attribs = f.GetCustomAttributes(typeof(ReferencesAttribute), false);
                     if (attribs.Length == 0) {
                         throw new CliError("Rererences attribute should be specified for rererence field");
                     }
                     ReferencesAttribute ra = (ReferencesAttribute)attribs[0];
                     if (ra.refTableName == null) {
                         throw new CliError("Name of referenced table should be specified");
                     }
                     refTableName = ra.refTableName;
                     if (ra.inverseRefName != null) {
                         inverseRefName = ra.inverseRefName;
                     }
                 } else if (type == typeof(string)) {
                     cliType = Connection.CLIType.cli_array_of_string;
                 } else {
                     throw new CliError("Unsupported array type " + type.Name);
                 }
             } else {
                 throw new CliError("Unsupported field type " + type.Name);
             }
             buf.putByte((int)cliType);
             buf.putByte(0);
             buf.putAsciiz(f.Name);
             buf.putAsciiz(refTableName);
             buf.putAsciiz(inverseRefName);
         }
     }
     }
     send(buf);
     receive(buf, 4);
     int rc = buf.getInt();
     if (rc == (int)CLIStatus.cli_table_already_exists) {
     return false;
     } else if (rc < 0) {
     throw new CliError("Create table failed with status: " + rc);
     }
     return true;
 }
Beispiel #8
0
 internal object getObject(Connection.CLICommand cmd, int n)
 {
     if (stmt == null) {
     throw new CliError("ObjectSet was aleady closed");
     }
     if (stmt.con == null) {
     throw new CliError("Statement was closed");
     }
     ComBuffer buf = new ComBuffer(cmd, stmt.stmtId);
     if (cmd == Connection.CLICommand.cli_cmd_skip) {
     buf.putInt(n);
     }
     stmt.con.send(buf);
     buf.reset(4);
     stmt.con.receive(buf, 4);
     int len = buf.getInt();
     if (len == (int)Connection.CLIStatus.cli_not_found) {
     return null;
     } else if (len <= 0) {
     throw new CliError("Failed to get object");
     }
     buf.reset(len-4);
     stmt.con.receive(buf, len-4);
     currOid = buf.getInt();
     if (currOid == 0) {
     return null;
     }
     updated = false;
     return currObj = stmt.tableDesc.readObject(buf);
 }
Beispiel #9
0
 internal object readObject(ComBuffer buf)
 {
     Object obj = constructor.Invoke(constructorParameters);
     int i, j, n, len;
     for (i = 0, n = nColumns; i < n; i++)
     {
     Connection.CLIType type = (Connection.CLIType)buf.getByte();
     if (type != types[i])
     {
         throw new CliError("Unexpected type of column: " + type
             + " instead of " + types[i]);
     }
     switch (types[i])
     {
         case Connection.CLIType.cli_int1:
             columns[i].SetValue(obj, buf.getByte());
             break;
         case Connection.CLIType.cli_int2:
             columns[i].SetValue(obj, buf.getShort());
             break;
         case Connection.CLIType.cli_int4:
         case Connection.CLIType.cli_autoincrement:
             columns[i].SetValue(obj, buf.getInt());
             break;
         case Connection.CLIType.cli_int8:
             columns[i].SetValue(obj, buf.getLong());
             break;
         case Connection.CLIType.cli_real4:
             columns[i].SetValue(obj, buf.getFloat());
             break;
         case Connection.CLIType.cli_real8:
             columns[i].SetValue(obj, buf.getDouble());
             break;
         case Connection.CLIType.cli_bool:
             columns[i].SetValue(obj, buf.getByte() != 0);
             break;
         case Connection.CLIType.cli_oid:
         {
             int oid = buf.getInt();
             columns[i].SetValue(obj, (oid != 0) ? new Reference(oid) : null);
             break;
         }
         case Connection.CLIType.cli_rectangle:
             columns[i].SetValue(obj, buf.getRectangle());
             break;
         case Connection.CLIType.cli_asciiz:
             columns[i].SetValue(obj, buf.getString());
             break;
         case Connection.CLIType.cli_datetime:
             columns[i].SetValue(obj, new DateTime(((long)buf.getInt() & 0xFFFFFFFFL)*1000000));
             break;
         case Connection.CLIType.cli_array_of_int1:
         {
             len = buf.getInt();
             byte[] arr = new byte[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getByte();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_int2:
         {
             len = buf.getInt();
             short[] arr = new short[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getShort();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_int4:
         {
             len = buf.getInt();
             int[] arr = new int[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getInt();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_int8:
         {
             len = buf.getInt();
             long[] arr = new long[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getLong();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_real4:
         {
             len = buf.getInt();
             float[] arr = new float[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getFloat();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_real8:
         {
             len = buf.getInt();
             double[] arr = new double[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getDouble();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_bool:
         {
             len = buf.getInt();
             bool[] arr = new bool[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getByte() != 0;
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_oid:
         {
             len = buf.getInt();
             Reference[] arr = new Reference[len];
             for (j = 0; j < len; j++)
             {
                 int oid = buf.getInt();
                 arr[j] = oid != 0 ? new Reference(oid) : null;
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         case Connection.CLIType.cli_array_of_string:
         {
             len = buf.getInt();
             string[] arr = new string[len];
             for (j = 0; j < len; j++)
             {
                 arr[j] = buf.getAsciiz();
             }
             columns[i].SetValue(obj, arr);
             break;
         }
         default:
             throw new CliError("Unsupported type " + types[i]);
     }
     }
     return obj;
 }
Beispiel #10
0
        internal object readObject(ComBuffer buf)
        {
            Object obj = constructor.Invoke(constructorParameters);
            int    i, j, n, len;

            for (i = 0, n = nColumns; i < n; i++)
            {
                Connection.CLIType type = (Connection.CLIType)buf.getByte();
                if (type != types[i])
                {
                    throw new CliError("Unexpected type of column: " + type
                                       + " instead of " + types[i]);
                }
                switch (types[i])
                {
                case Connection.CLIType.cli_int1:
                    columns[i].SetValue(obj, buf.getByte());
                    break;

                case Connection.CLIType.cli_int2:
                    columns[i].SetValue(obj, buf.getShort());
                    break;

                case Connection.CLIType.cli_int4:
                case Connection.CLIType.cli_autoincrement:
                    columns[i].SetValue(obj, buf.getInt());
                    break;

                case Connection.CLIType.cli_int8:
                    columns[i].SetValue(obj, buf.getLong());
                    break;

                case Connection.CLIType.cli_real4:
                    columns[i].SetValue(obj, buf.getFloat());
                    break;

                case Connection.CLIType.cli_real8:
                    columns[i].SetValue(obj, buf.getDouble());
                    break;

                case Connection.CLIType.cli_bool:
                    columns[i].SetValue(obj, buf.getByte() != 0);
                    break;

                case Connection.CLIType.cli_oid:
                {
                    int oid = buf.getInt();
                    columns[i].SetValue(obj, (oid != 0) ? new Reference(oid) : null);
                    break;
                }

                case Connection.CLIType.cli_rectangle:
                    columns[i].SetValue(obj, buf.getRectangle());
                    break;

                case Connection.CLIType.cli_asciiz:
                    columns[i].SetValue(obj, buf.getString());
                    break;

                case Connection.CLIType.cli_datetime:
                    columns[i].SetValue(obj, new DateTime(((long)buf.getInt() & 0xFFFFFFFFL) * 1000000));
                    break;

                case Connection.CLIType.cli_array_of_int1:
                {
                    len = buf.getInt();
                    byte[] arr = new byte[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getByte();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_int2:
                {
                    len = buf.getInt();
                    short[] arr = new short[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getShort();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_int4:
                {
                    len = buf.getInt();
                    int[] arr = new int[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getInt();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_int8:
                {
                    len = buf.getInt();
                    long[] arr = new long[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getLong();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_real4:
                {
                    len = buf.getInt();
                    float[] arr = new float[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getFloat();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_real8:
                {
                    len = buf.getInt();
                    double[] arr = new double[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getDouble();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_bool:
                {
                    len = buf.getInt();
                    bool[] arr = new bool[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getByte() != 0;
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_oid:
                {
                    len = buf.getInt();
                    Reference[] arr = new Reference[len];
                    for (j = 0; j < len; j++)
                    {
                        int oid = buf.getInt();
                        arr[j] = oid != 0 ? new Reference(oid) : null;
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                case Connection.CLIType.cli_array_of_string:
                {
                    len = buf.getInt();
                    string[] arr = new string[len];
                    for (j = 0; j < len; j++)
                    {
                        arr[j] = buf.getAsciiz();
                    }
                    columns[i].SetValue(obj, arr);
                    break;
                }

                default:
                    throw new CliError("Unsupported type " + types[i]);
                }
            }
            return(obj);
        }