My Shiny Weblog!

programming, photography and lifestyle

Съобщение за грешка в Interbase

Наложи ми се да подкарам една елементарна програмка, която използва InterBase, като база данни. Идеята на програмката е да получава събития от четец за карти и да ги регистрира в базата данни, заедно с дата и час. Тъй като нямах никакви впечатления от тази система, отделих малко време да проуча, как точно се работи с InterBase. Няколко неща ми направиха много лошо впечатление. Най-напред установих, че файлчето на базата данни се намира в директорията на самата програма. Веднага се сетих за SQLite и реших, че ще мога директно да го прочета. Подкарах някакъв iSQL shell от InterBase и се опитах да го отворя. Този номер обаче не мина, системата заяви, че трябвало да имам потребителско име и парола за да мога да работя с този файл и трябвало да кажа на системния ми администратор да ми направи потребител. Нормално, в такива случай, човек си задава въпроса “Абе къв администратор, кви 5 лева, аз искам просто да отворя един файл?”. Погледах какво има във въпросния файл, и видях, че всичко вътре е в гладък текст (не се ползва криптография, очевидно). Веднага се запитах – как по дяволите разработчиците на InterBase очакват да ми забранят достъп до данни в прав текст, като ми искат парола. Започнах да ровя из Интернет и не след дълго попаднах на един форум, където ставаше дума за някакъв вграден супер потребител. Без да имам някакви конкретно очаквания, написах за потребител sysdba и за парола masterkey. Системата ме пусна да вляза. Започнах да ровя данните, “валидирах” таблицата, всичко си беше наред. Опитах да подкарам програмката, тя изкара някакъв тъп диалогов прозорец, на български, със съобщение за грешка, което не носи никаква информация. След кратко търсене успях да намеря едно файлче, където се логват грешките в малко по-смислен формат. Там срешнах следната сентенция:

1
Cannot transliterate character between character sets

В началото си помислих, че подобна грешка може да идва само от някой оптимист, който е писал програмката. Обаче като пуснах един google стана ясно, че това велико съобщение за грешка идва директно от базата данни. От него не стават ясни следните неща:

  1. За каква транслитерация става въпрос, след като таблиците са ми в WIN1251 кодировка, която би трябвало да излиза без проблем в Windows?
  2. За кой character става въпрос, къде се намира този character в данните, за да мога да го махна (база съдържа 120 000 записа)?
  3. Между какви две кодировки се опитва базата да “транслитерира” този символ?

Така и не успях да намерия отговор на тези въпроси. Програмката, която имам е просто един PE файл за Windows. До скоро е работила, и в един момент е престанала. Ще се наложи по някакъв начин да си обработвам данните без нея. Все пак изводът от цялата работа, е че в никакъв случай, за каквито и да било цели не трябва да се ползва InterBase, Firebird или както там му викат последно. С един PostgreSQL никога нямаше да имам такива проблеми. Друг любопитен момент е, че InterBase използва огромната библиотека ICU за справяне с различните кодировки, PostgreSQL ползва iconv. Едната е 10 пъти по-голяма от другата и имам извесни съмнения, че гениалното съобщение за грешка идва директно от там.