internal unsafe static IntPtr SetColumn(int var_type, IntPtr var_ptr, int len, string column_name, int statement, IntPtr data_ptr, void *user_data) { CLI.UnmanagedBuffer *buffer = (CLI.UnmanagedBuffer *)user_data; if (var_type == (int)CLI.FieldType.cli_asciiz || var_type == (int)CLI.FieldType.cli_pasciiz) { SetBufferTypeAndSize(buffer, (CLI.FieldType)var_type, len, true); return(buffer->data); } else if (CLI.IsArrayType((CLI.FieldType)var_type)) { if (buffer->fetch_data) { SetBufferTypeAndSize(buffer, (CLI.FieldType)var_type, len * CLI.SizeOfCliType[(int)var_type - (int)CLI.FieldType.cli_array_of_oid], true); return(buffer->data); } else { return(IntPtr.Zero); // FastDB won't fetch a field if we return nil } } else // sanity check { throw new CliError("Unsupported type: " + Enum.GetName(typeof(CLI.FieldType), buffer->type)); } }
protected unsafe static void SetBufferTypeAndSize(CLI.UnmanagedBuffer *buf, CLI.FieldType NewType, int NewSize, bool TypeCheck) { int n; if (!TypeCheck || CLI.IsArrayType(NewType)) { n = NewSize; } else if (NewType == CLI.FieldType.cli_asciiz || NewType == CLI.FieldType.cli_pasciiz) { n = NewSize + 1; } else { n = CLI.SizeOfCliType[(int)NewType]; } if (n > buf->capacity) { buf->data = Marshal.ReAllocCoTaskMem(buf->data, ALIGN(n)); buf->capacity = n; } buf->size = n; if (buf->type != (int)NewType) { buf->type = (int)NewType; } }
internal unsafe static IntPtr GetColumn(int var_type, IntPtr var_ptr, ref int len, string column_name, int statement, void *user_data) { CLI.UnmanagedBuffer *buffer = (CLI.UnmanagedBuffer *)user_data; if (CLI.IsArrayType((CLI.FieldType)var_type)) { len = buffer->size / CLI.SizeOfCliType[var_type - (int)CLI.FieldType.cli_array_of_oid]; } else if (var_type == (int)CLI.FieldType.cli_asciiz || var_type == (int)CLI.FieldType.cli_pasciiz) { len = buffer->size - 1; } else { len = buffer->size; } return(buffer->data); }