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

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

В рамках тестирования следующей версии 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.

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

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

Вести с полей

С 11 декабря по 21 декабря проехало нагрузочное тестирование:
— IBP v5.9.0.33098
— LCPI OLE DB Services v1.12.0.874

Сборки: vc16, debug/release, 32/64 бита.

Тестировалась работа с базами 1 и 3 диалектов.

Подключение — fb.direct и через fbclient.dll (64bit only).

В 10 потоков.

Часть заездов с 32-битами завершилась из-за OUTOFMEMORY (4GB все таки маловато), но не упала.

А, ну да. Сервер — Firebird 3.0.5.33180 SS x64 Win.

InterBase at BorCon 2001

Оставлю здесь ссылку на эту заметку — InterBase at BorCon 2001.