Beispiel #1
0
        /// <summary>
        /// Drop index
        /// </summary>
        /// <param name="tableName">name of the table</param>
        /// <param name="fieldName">name of the field</param>
        ///
        public void dropIndex(String tableName, String fieldName)
        {
            ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_alter_index);

            buf.putAsciiz(tableName);
            buf.putAsciiz(fieldName);
            buf.putByte(0);
            sendReceive(buf);
        }
Beispiel #2
0
        /// <summary>
        /// Add case sensitive index
        /// </summary>
        /// <param name="tableName">name of the table</param>
        /// <param name="fieldName">name of the field</param>
        /// <param name="caseInsensitive">attribute specifying whether index is case insensitive or not</param>
        ///
        public void addIndex(String tableName, String fieldName, bool caseInsensitive)
        {
            ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_alter_index);

            buf.putAsciiz(tableName);
            buf.putAsciiz(fieldName);
            buf.putByte(caseInsensitive
                    ? (int)(CLIFieldQualifier.cli_indexed | CLIFieldQualifier.cli_case_insensitive)
                    : (int)CLIFieldQualifier.cli_indexed);
            sendReceive(buf);
        }
Beispiel #3
0
        /// <summary>
        /// Drop specified table
        /// </summary>
        /// <param name="tableName">name of the table</param>
        ///
        public void dropTable(String tableName)
        {
            ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_drop_table);

            buf.putAsciiz(tableName);
            sendReceive(buf);
        }
Beispiel #4
0
 internal void writeColumnDefs(ComBuffer buf)
 {
     for (int i = 0, n = nColumns; i < n; i++)
     {
         buf.putByte((int)types[i]);
         buf.putAsciiz(columns[i].Name);
     }
 }
Beispiel #5
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 #6
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 #7
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 #8
0
 /// <summary>
 /// Drop specified table
 /// </summary>
 /// <param name="tableName">name of the table</param>
 ///
 public void dropTable(String tableName)
 {
     ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_drop_table);
     buf.putAsciiz(tableName);
     sendReceive(buf);
 }
Beispiel #9
0
 /// <summary>
 /// Drop index
 /// </summary>
 /// <param name="tableName">name of the table</param>
 /// <param name="fieldName">name of the field</param>
 ///
 public void dropIndex(String tableName, String fieldName)
 {
     ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_alter_index);
     buf.putAsciiz(tableName);
     buf.putAsciiz(fieldName);
     buf.putByte(0);
     sendReceive(buf);
 }
Beispiel #10
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 #11
0
 /// <summary>
 /// Add case sensitive index
 /// </summary>
 /// <param name="tableName">name of the table</param>
 /// <param name="fieldName">name of the field</param>
 /// <param name="caseInsensitive">attribute specifying whether index is case insensitive or not</param>
 ///
 public void addIndex(String tableName, String fieldName, bool caseInsensitive)
 {
     ComBuffer buf = new ComBuffer(CLICommand.cli_cmd_alter_index);
     buf.putAsciiz(tableName);
     buf.putAsciiz(fieldName);
     buf.putByte(caseInsensitive
             ? (int)(CLIFieldQualifier.cli_indexed|CLIFieldQualifier.cli_case_insensitive)
             : (int)CLIFieldQualifier.cli_indexed);
     sendReceive(buf);
 }
Beispiel #12
0
 internal void writeColumnValues(ComBuffer buf, Object obj)
 {
     int i, j, n, len;
     for (i = 0, n = nColumns; i < n; i++)
     {
     switch (types[i])
     {
         case Connection.CLIType.cli_int1:
             buf.putByte((byte)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_int2:
             buf.putShort((short)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_int4:
             buf.putInt((int)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_int8:
             buf.putLong((long)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_real4:
             buf.putFloat((float)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_real8:
             buf.putDouble((double)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_bool:
             buf.putByte((bool)columns[i].GetValue(obj) ? 1 : 0);
             break;
         case Connection.CLIType.cli_oid:
             Reference r = (Reference)columns[i].GetValue(obj);
             buf.putInt(r != null ? r.oid : 0);
             break;
         case Connection.CLIType.cli_rectangle:
             Rectangle rect = (Rectangle)columns[i].GetValue(obj);
             if (rect == null)
             {
                 rect = new Rectangle();
             }
             buf.putRectangle(rect);
             break;
         case Connection.CLIType.cli_asciiz:
             buf.putString((string)columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_datetime:
             buf.putInt((int)(((DateTime)columns[i].GetValue(obj)).Ticks / 1000000));
             break;
         case Connection.CLIType.cli_array_of_int1:
             buf.putByteArray((byte[])columns[i].GetValue(obj));
             break;
         case Connection.CLIType.cli_array_of_int2:
         {
             short[] arr = (short[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putShort(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_int4:
         {
             int[] arr = (int[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putInt(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_int8:
         {
             long[] arr = (long[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putLong(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_real4:
         {
             float[] arr = (float[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putFloat(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_real8:
         {
             double[] arr = (double[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putDouble(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_bool:
         {
             bool[] arr = (bool[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putByte(arr[j] ? 1 : 0);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_oid:
         {
             Reference[] arr = (Reference[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putInt(arr[j] != null ? arr[j].oid : 0);
             }
             break;
         }
         case Connection.CLIType.cli_array_of_string:
         {
             string[] arr = (string[])columns[i].GetValue(obj);
             len = arr == null ? 0 : arr.Length;
             buf.putInt(len);
             for (j = 0; j < len; j++)
             {
                 buf.putAsciiz(arr[j]);
             }
             break;
         }
         case Connection.CLIType.cli_autoincrement:
             break;
         default:
             throw new CliError("Unsupported type " + types[i]);
     }
     }
 }
Beispiel #13
0
 internal void writeColumnDefs(ComBuffer buf)
 {
     for (int i = 0, n = nColumns; i < n; i++) {
     buf.putByte((int)types[i]);
     buf.putAsciiz(columns[i].Name);
     }
 }
Beispiel #14
0
        internal void writeColumnValues(ComBuffer buf, Object obj)
        {
            int i, j, n, len;

            for (i = 0, n = nColumns; i < n; i++)
            {
                switch (types[i])
                {
                case Connection.CLIType.cli_int1:
                    buf.putByte((byte)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_int2:
                    buf.putShort((short)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_int4:
                    buf.putInt((int)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_int8:
                    buf.putLong((long)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_real4:
                    buf.putFloat((float)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_real8:
                    buf.putDouble((double)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_bool:
                    buf.putByte((bool)columns[i].GetValue(obj) ? 1 : 0);
                    break;

                case Connection.CLIType.cli_oid:
                    Reference r = (Reference)columns[i].GetValue(obj);
                    buf.putInt(r != null ? r.oid : 0);
                    break;

                case Connection.CLIType.cli_rectangle:
                    Rectangle rect = (Rectangle)columns[i].GetValue(obj);
                    if (rect == null)
                    {
                        rect = new Rectangle();
                    }
                    buf.putRectangle(rect);
                    break;

                case Connection.CLIType.cli_asciiz:
                    buf.putString((string)columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_datetime:
                    buf.putInt((int)(((DateTime)columns[i].GetValue(obj)).Ticks / 1000000));
                    break;

                case Connection.CLIType.cli_array_of_int1:
                    buf.putByteArray((byte[])columns[i].GetValue(obj));
                    break;

                case Connection.CLIType.cli_array_of_int2:
                {
                    short[] arr = (short[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putShort(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_int4:
                {
                    int[] arr = (int[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putInt(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_int8:
                {
                    long[] arr = (long[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putLong(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_real4:
                {
                    float[] arr = (float[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putFloat(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_real8:
                {
                    double[] arr = (double[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putDouble(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_bool:
                {
                    bool[] arr = (bool[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putByte(arr[j] ? 1 : 0);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_oid:
                {
                    Reference[] arr = (Reference[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putInt(arr[j] != null ? arr[j].oid : 0);
                    }
                    break;
                }

                case Connection.CLIType.cli_array_of_string:
                {
                    string[] arr = (string[])columns[i].GetValue(obj);
                    len = arr == null ? 0 : arr.Length;
                    buf.putInt(len);
                    for (j = 0; j < len; j++)
                    {
                        buf.putAsciiz(arr[j]);
                    }
                    break;
                }

                case Connection.CLIType.cli_autoincrement:
                    break;

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