static int GetChars(IntPtr L) { try { ToLua.CheckArgsCount(L, 6); System.Data.Common.DbDataReader obj = (System.Data.Common.DbDataReader)ToLua.CheckObject(L, 1, typeof(System.Data.Common.DbDataReader)); int arg0 = (int)LuaDLL.luaL_checknumber(L, 2); long arg1 = LuaDLL.tolua_checkint64(L, 3); char[] arg2 = ToLua.CheckCharBuffer(L, 4); int arg3 = (int)LuaDLL.luaL_checknumber(L, 5); int arg4 = (int)LuaDLL.luaL_checknumber(L, 6); long o = obj.GetChars(arg0, arg1, arg2, arg3, arg4); LuaDLL.tolua_pushint64(L, o); return(1); } catch (Exception e) { return(LuaDLL.toluaL_exception(L, e)); } }
// Use chunking via SetChars to transfer a value from a reader to a gettersetter private static void SetChars_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { int length = 0; // Deal with large values by sending bufferLength of NoLengthLimit (== assume // CheckXetParameters will ignore requested-length checks in this case) length = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, NoLengthLimit /* actual */, 0, NoLengthLimit /* buffer length */, offset, NoLengthLimit /* requested length */ ); // Use fixed chunk size for all cases to avoid inquiring from reader. int chunkSize; if (MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) { chunkSize = __maxByteChunkSize; } else { chunkSize = __maxCharChunkSize; } char[] buffer = new char[ chunkSize ]; long charsRead; long charsWritten = 1; // prime value to get into write loop long currentOffset = offset; long lengthWritten = 0; while ((length < 0 || lengthWritten < length) && 0 != (charsRead = reader.GetChars(ordinal, currentOffset, buffer, 0, chunkSize)) && 0 != charsWritten) { charsWritten = setters.SetChars(sink, ordinal, currentOffset, buffer, 0, checked((int) charsRead)); sink.ProcessMessagesAndThrow(); checked{ currentOffset += charsWritten; } checked{ lengthWritten += charsWritten; } } // Make sure to trim any left-over data (remember to trim at end of offset, not just the amount written setters.SetCharsLength(sink, ordinal, currentOffset); sink.ProcessMessagesAndThrow(); }
private static void SetChars_FromReader(SmiEventSink_Default sink, SmiTypedGetterSetter setters, int ordinal, SmiMetaData metaData, DbDataReader reader, int offset) { int num4; long num6; int num5 = 0; num5 = CheckXetParameters(metaData.SqlDbType, metaData.MaxLength, -1L, 0L, -1, offset, -1); if (MetaDataUtilsSmi.IsAnsiType(metaData.SqlDbType)) { num4 = 0x1f40; } else { num4 = 0xfa0; } char[] buffer = new char[num4]; long num2 = 1L; long dataOffset = offset; for (long i = 0L; ((num5 < 0) || (i < num5)) && ((0L != (num6 = reader.GetChars(ordinal, dataOffset, buffer, 0, num4))) && (0L != num2)); i += num2) { num2 = setters.SetChars(sink, ordinal, dataOffset, buffer, 0, (int) num6); sink.ProcessMessagesAndThrow(); dataOffset += num2; } setters.SetCharsLength(sink, ordinal, dataOffset); sink.ProcessMessagesAndThrow(); }