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