[winsock][BUG CHECK] Чтение из закрытого порта подключения. Ошибка WinSock: 0

Вчера замутил инструкцию по загрузке данных из FireBird в Excel.

Многократно нарывался на %subj%.

Проблему давил OK-еем. Она не сильно мешала достижения финиша.

Позже сообразил, что она уже вылазила. Причем совсем недавно.

В том случае, проблема лечилась указанием имени пользователя в верхнем регистре (GAMER) — это (насколько я понимаю) задействовало SRP-аутентификацию. А с нижним регистром через раз отрабатывала Legacy_Auth аутентификация.

Но вчера SYSDBA был в верхнем регистре!
(далее…)

IBProvider v5.12 и NetProvider v1.16

На сайт и в личные кабинеты загружены очередные обновления OLE DB и ADO.NET провайдеров.

IBProvider v5.12
В IBProvider, как я тут раньше писал, появилась поддержка колонок с автоинкрементом.

А если конкретнее, то во множестве с описанием колонок, получаемом через интерфейс IColumnsRowset, появилась колонка DBCOLUMN_ISAUTOINCREMENT с BOOL-значением. В ней будет True для колонок с автоинкрементом и False для всех остальных колонок.

Забавно, но в провайдер пришлось внести достаточно радикальные изменения, чтобы сделать «все по уму».

На финише, в IBProvider было внесено еще одно изменение — отображение ошибки Z_MEM_ERROR компрессора данных zlib1 на E_OUTOFMEMORY.

Основные сборки (vc16), как положено, прошли через многопоточное нагрузочное тестирование.

NetProvider v1.16
В OleDbDataReader, создаваемом с указанием CommandBehavior.SchemaOnly, разрешено использование методов Read, HasRows, RecordsAffected.

Предыдущие сборки провайдера запрещали такие вызовы и выкидывали исключение.

Клиент, в процессе переезда с System.Data.OleDb, обнаружил это лютое ограничение и попросил убрать его.

Другое
Доработаны и оптимизированы тесты. Причем для обоих провайдеров. Новые тестовые таблички (в которых по 4K колонок) дали всем прикурить.

Из личных кабинетов убраны сборки IBProvider v3. Все, эпоха закончилась.

Лучше день потерять…

…потом за пять минут долететь.

В рамках тестирования следующей версии IBProvider v5.12 была создана пара UBER таблиц c 4096-ю колонок в каждой, которые добили прямолинейные алгоритмы тестирования схем метаданных «schema.002.*» основной тестовой системы.

Их там три штуки. Тот, который грузит схемы без кэширования, до последнего времени работал 6 часов. После появления вышеобозначенной сладкой парочки — 2 дня и 19 часов. То есть 67 часов.

Это означает, что после завершения всех остальных тестов, компьютер еще кучу времени тупил в одно ядро над одним тестом. 9 ядер простаивали.

Страшно думать, сколько бы оно тупило с отладочной сборкой провайдера. Сто пудов — не меньше недели … (далее…)

Вести с полей

Утром выложил новую тестовую сборку провайдера (3.12.0.33717) с поддержкой IDENTITY колонок FB3.

Не прошло… хотя нет, таки прошло, шесть лет как я это сделал.

Ну, думаю, надо бы теперь соорудить примерчик на .NET, который бы показал «как узнать — имеет колонка автоинкремент или нет?».

Накатал.

////////////////////////////////////////////////////////////////////////////////
//Samples for LCPI ADO.NET Data provider for OLEDB.
//                                                    ibprovider.com. 16.12.2020
using System;
using lcpi.data.oledb;

using structure_lib=lcpi.lib.structure;

namespace Sample_0028{
////////////////////////////////////////////////////////////////////////////////
//class Program

class Program
{
 private const string c_cn_str
  ="provider=LCPI.IBProvider.5;"
  +"location=localhost:d:\\database\\ram\\ibp_test_fb30_d3.gdb;"
  +"dbclient_type=fb.direct;"
  +"user id=gamer;"
  +"password=vermut;";

 //----------------------------------------------------------------------
 static int Main(string[] args)
 {
  int resultCode=0;

  OleDbConnection  cn=null;
  OleDbTransaction tr=null;
  OleDbCommand     cmd=null;
  OleDbDataReader  reader=null;

  try
  {
   cn=new OleDbConnection(c_cn_str);

   cn.Open();

   var dsinfo=cn.GetSchema(OleDbMetaDataCollectionNames.DataSourceInformation);

   Helper__CheckComponents(dsinfo);

   tr=cn.BeginTransaction();

   cmd=new OleDbCommand(null,cn,tr);

   //--------------------
   Console.WriteLine("Recreate TBL_WITH_IDENTITY ...");

   cmd.CommandText
    ="recreate table TBL_WITH_IDENTITY\n"
    +"(ID1 INTEGER GENERATED BY DEFAULT AS IDENTITY,\n"
    +" ID2 INTEGER)";

   cmd.ExecuteNonQuery();

   //--------------------
   Console.WriteLine("Commit retain ...");

   tr.CommitRetaining();

   //--------------------
   cmd.CommandText
    ="select ID1,ID2 from TBL_WITH_IDENTITY";

   reader
    =cmd.ExecuteReader(System.Data.CommandBehavior.SchemaOnly);

   var readerSchema=reader.GetSchemaTable();

   for(int i=0;i!=2;++i) //expected two rows
   {
    var readerSchemaRow=readerSchema.Rows[i];

    Console.WriteLine
     ("[{0}] {1} has autoincrement: {2}",
      i,
      readerSchemaRow[OleDbDataReaderSchemaColumnNames.ColumnName],
      readerSchemaRow[OleDbDataReaderSchemaColumnNames.IsAutoIncrement]);
   }//for i

   //--------------------
   Console.WriteLine("Commit ...");

   tr.Commit();
  }
  catch(Exception e)
  {
   resultCode=1;

   Console.WriteLine("");
   Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message);
  }//catch
  finally
  {
   structure_lib.DisposeUtils.Exec(ref cmd);
   structure_lib.DisposeUtils.Exec(ref tr);
   structure_lib.DisposeUtils.Exec(ref cn);
  }//finally

  return resultCode;
 }//Main

 //-----------------------------------------------------------------------
 private static void Helper__CheckComponents(System.Data.DataTable dsinfo)
 {
  Helper__CheckComponents_DBMS(dsinfo);
 }//Helper__CheckComponents
 
 //-----------------------------------------------------------------------
 private static void Helper__CheckComponents_DBMS(System.Data.DataTable dsinfo)
 {
  var row=dsinfo.Rows[0];

  var dbmsName
   =row[OleDbMetaDataCollectionColumnNames.DataSourceInformation.DataSourceProductName];

  var dbmsVersion
   =row[OleDbMetaDataCollectionColumnNames.DataSourceInformation.DataSourceProductVersion];
 
  if(DBNull.Value.Equals(dbmsName))
   throw new ApplicationException("DBMS Name is not defined!");

  if(DBNull.Value.Equals(dbmsVersion))
   throw new ApplicationException("DBMS Version is not defined!");

  if((string)(dbmsName)!="Firebird")
   throw new ApplicationException("Wrong DBMS name: "+dbmsName+". Expected \"Firebird\".");

  if(new Version((string)dbmsVersion)<new Version("3.0"))
   throw new ApplicationException("Wrong Firebird version: "+dbmsVersion+". Expected version not less than 3.0.");

  Console.WriteLine("OK. We work with {0} {1}",dbmsName,dbmsVersion);
 }//Helper__CheckDBMS
}//class Program

////////////////////////////////////////////////////////////////////////////////
}//Sample_0028

Ну и пока его ваял/тестировал, обнаружилась странная хрень с сервером. Он, то подключается, то не подключается. Никак не может определиться.

Как лично по мне — это очередная ахинея в сервере.

1 год

Привет всем.

Год назад был выпущен IBProvider v5.

🙂

Вести с полей

Решил сам для себя изложить суть текущей проблемы 🙂

С начала недели на отстое стоит незакоммиченный код c поддержкой IDENTITY-колонок FB3.

Задача простая — для всех колонок результирующего множества, напрямую отображаемых на таблицы базы данных, нужно выполнить запрос:

select <индекс колонки> from rdb$relation_fields where rdb$relation_name=’<имя таблицы>‘ and rdb$field_name=’<имя колонки>‘ and rdb$identity_type is NOT NULL

Казалось бы, что тут может быть сложного? (далее…)

Край доделать

Сегодня, выехав на финишную прямую с реализацией поддержки автоинкрементных колонок FB3, я чего-то задумался и решил посмотреть — «а когда, собственно говоря, был обозначен этот вопрос в трекере задач проекта?»

Похоже сегодня обязательно нужно допилить эту штуку 🙂

Поддержка WireCompression в собственном клиенте для FB

На сайт загружена тестовая сборка IBProvider (5.11.0.33464), в которой реализована поддержка сжатия данных подключения собственным клиентом для Firebird.

Чтобы задействовать эту фичу достаточно указать в строке подключения «remote:wire_compression=enabled».

IBProvider, 20 лет


Subj

С новым годом

Вчера перепилил одну функцию в fbclient.dll. В исследовательских целях.

Запустил на ночь тесты с отладочной сборкой этой DLL.

Утром увидел привет от старого знакомого.

Семен Семёныч… С Новым Годом тебя.