/// <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)); }
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]); } } }
/// <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))); }