Пример #1
0
 /// <summary>
 /// Prepare (if needed) and execute select statement
 /// Only object set returned by the select for updated statement allows
 /// update and deletion of the objects.
 /// </summary>
 /// <param name="forUpdate">if cursor is opened in for update mode</param>
 /// <returns>object set with the selected objects</returns>
 ///
 public ObjectSet fetch(bool forUpdate)
 {
     int i, n;
     ComBuffer buf;
     if (!prepared) {
     buf = new ComBuffer(Connection.CLICommand.cli_cmd_prepare_and_execute, stmtId);
     n = tableDesc.nColumns;
     buf.putByte(nParams);
     buf.putByte(n);
     int len = stmtLen;
     bool addNull = false;
     if (len == 0 || stmt[len-1] != 0) {
         addNull = true;
         len += nParams;
         buf.putShort(len+1);
     } else {
         len += nParams;
         buf.putShort(len);
     }
     i = 0;
     Parameter p = parameters;
     do {
         byte ch = stmt[i++];
         buf.putByte(ch);
         len -= 1;
         if (ch == '\0') {
             if (len != 0) {
                 if (p.type == Connection.CLIType.cli_undefined) {
                     throw new CliError("Unbound parameter " + p.name);
                 }
                 buf.putByte((int)p.type);
                 p = p.next;
                 len -= 1;
             }
         }
     } while (len != 0);
     if (addNull) {
         buf.putByte('\0');
     }
     tableDesc.writeColumnDefs(buf);
     } else { // statement was already prepared
     buf = new ComBuffer(Connection.CLICommand.cli_cmd_execute, stmtId);
     }
     this.forUpdate = forUpdate;
     buf.putByte(forUpdate ? 1 : 0);
     for (Parameter p = parameters; p != null; p = p.next) {
     switch (p.type) {
       case Connection.CLIType.cli_oid:
       case Connection.CLIType.cli_int4:
         buf.putInt(p.ivalue);
         break;
       case Connection.CLIType.cli_int1:
       case Connection.CLIType.cli_bool:
         buf.putByte((byte)p.ivalue);
         break;
       case Connection.CLIType.cli_int2:
         buf.putShort((short)p.ivalue);
         break;
       case Connection.CLIType.cli_int8:
         buf.putLong(p.lvalue);
         break;
       case Connection.CLIType.cli_real4:
         buf.putFloat(p.fvalue);
         break;
       case Connection.CLIType.cli_real8:
         buf.putDouble(p.dvalue);
         break;
       case Connection.CLIType.cli_asciiz:
         buf.putAsciiz(p.svalue);
         break;
     }
     }
     prepared = true;
     return new ObjectSet(this, con.sendReceive(buf));
 }
Пример #2
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]);
                }
            }
        }
Пример #3
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]);
     }
     }
 }
Пример #4
0
        /// <summary>
        /// Prepare (if needed) and execute select statement
        /// Only object set returned by the select for updated statement allows
        /// update and deletion of the objects.
        /// </summary>
        /// <param name="forUpdate">if cursor is opened in for update mode</param>
        /// <returns>object set with the selected objects</returns>
        ///
        public ObjectSet fetch(bool forUpdate)
        {
            int       i, n;
            ComBuffer buf;

            if (!prepared)
            {
                buf = new ComBuffer(Connection.CLICommand.cli_cmd_prepare_and_execute, stmtId);
                n   = tableDesc.nColumns;
                buf.putByte(nParams);
                buf.putByte(n);
                int  len     = stmtLen;
                bool addNull = false;
                if (len == 0 || stmt[len - 1] != 0)
                {
                    addNull = true;
                    len    += nParams;
                    buf.putShort(len + 1);
                }
                else
                {
                    len += nParams;
                    buf.putShort(len);
                }
                i = 0;
                Parameter p = parameters;
                do
                {
                    byte ch = stmt[i++];
                    buf.putByte(ch);
                    len -= 1;
                    if (ch == '\0')
                    {
                        if (len != 0)
                        {
                            if (p.type == Connection.CLIType.cli_undefined)
                            {
                                throw new CliError("Unbound parameter " + p.name);
                            }
                            buf.putByte((int)p.type);
                            p    = p.next;
                            len -= 1;
                        }
                    }
                } while (len != 0);
                if (addNull)
                {
                    buf.putByte('\0');
                }
                tableDesc.writeColumnDefs(buf);
            }
            else // statement was already prepared
            {
                buf = new ComBuffer(Connection.CLICommand.cli_cmd_execute, stmtId);
            }
            this.forUpdate = forUpdate;
            buf.putByte(forUpdate ? 1 : 0);
            for (Parameter p = parameters; p != null; p = p.next)
            {
                switch (p.type)
                {
                case Connection.CLIType.cli_oid:
                case Connection.CLIType.cli_int4:
                    buf.putInt(p.ivalue);
                    break;

                case Connection.CLIType.cli_int1:
                case Connection.CLIType.cli_bool:
                    buf.putByte((byte)p.ivalue);
                    break;

                case Connection.CLIType.cli_int2:
                    buf.putShort((short)p.ivalue);
                    break;

                case Connection.CLIType.cli_int8:
                    buf.putLong(p.lvalue);
                    break;

                case Connection.CLIType.cli_real4:
                    buf.putFloat(p.fvalue);
                    break;

                case Connection.CLIType.cli_real8:
                    buf.putDouble(p.dvalue);
                    break;

                case Connection.CLIType.cli_asciiz:
                    buf.putAsciiz(p.svalue);
                    break;
                }
            }
            prepared = true;
            return(new ObjectSet(this, con.sendReceive(buf)));
        }