Мы всегда рады услышать ваше мнение и пожелания по дальнейшему развитию программы.
0
Under review

Convert 2 UTF8

Илья Агафонов 7 years ago 0

Вчера от IBExpert Team пришло письмо с вложенным SQL скриптом конвертирования баз в различных кодировках в том числе NONE в кодировку UTF8. Вот я и решил поделится может быть пригодится и в библиотекаре...



execute ibeblock
as
begin
--Change these variables
source='LOCALHOST:C:\db\db1.fdb';
sourcecharset='ISO8859_1';
sourcecollate='DE_DE';
target='LOCALHOST:C:\db\db1_utf8.fdb';
scriptdir='c:\db\dump\';
bakfile='C:\db\test.fbk';
--End of variables

cbb = 'execute ibeblock (
LogLine variant)
as
begin
ibec_progress(LogLine);
end';

ibec_BackupDatabase(source,bakfile,'ClientLib=fbclient.dll;Password=masterkey; User=SYSDBA; G;',cbb);

--optionally you can also restore the source database; here it has been commented out.
--ibec_RestoreDatabase(bakfile, source,'ClientLib=fbclient.dll;Password=masterkey; User=SYSDBA; C; REP; O;',cbb);

--Create a connection to the source database and open it
sourceDB = ibec_CreateConnection(__ctFirebird,'DBName="'+source+'";ClientLib=fbclient.dll;User=SYSDBA; Password=masterke; Names='+sourcecharset+'; SqlDialect=3');
use sourceDB;

--Create a comma-separated list of table names, to transfer the data
tnlist='';
komma='';
for
select trim(rdb$relations.rdb$relation_name) from rdb$relations
where rdb$relations.rdb$relation_name not containing '$'
and rdb$relations.rdb$view_blr is null
into
:tn
do
begin
tnlist=tnlist||komma||tn;
komma=',';
end

--Call the Extract Metadata script function, to create a database dump including metadata, data and blobs.
ibec_ExtractMetadata(sourceDB, scriptdir,'GenerateConnect;IncludePassword;SetGenerators;ExtractDescriptions;
SeparateComputedBy;CommitAfter=50000;MaxFileSize=100;UseCreateOrAlter;ExtractBLOBs;
ExtractPrivileges;OnlySelectedPrivileges;UseReinsert;TrimStrings;SeparateFiles;
DateFormat=YYYY-MM-DD;DataTables='||tnlist,cbb);

--If the target database already exists, then drop it, if errors occur, then ignore.
try
res = ibec_dropdatabase(__ctFirebird,
'DBName="'+target+'";
ClientLib=fbclient.dll;
User=SYSDBA; Password=masterke;');
except
end;
if (res is not null)
then ibec_Progress('Datenbank erfolgreich gelцscht');

--Create a new database with the character set UTF8
TargetDb = ibec_createdatabase(__ctFirebird,'DBName="'+target+'";ClientLib=fbclient.dll;PageSize=16384;User=SYSDBA; Password=masterke; DefaultCharset=UTF8; SqlDialect=3;');
ibec_Progress('UTF8 Datenbank erfolgreich erzeugt');

--Reconnect to the source database and make some changes to the header script:
use sourcedb;
txt=ibec_LoadFromFile(scriptdir+'_ibe$start_.sql');

--All fields and variables longer that 8190 bytes need to be cropped, because UTF8 is a multibyte character set.
for select distinct rdb$fields.rdb$field_length from rdb$fields where rdb$fields.rdb$field_length>8190 into :lx
do txt=ibec_StringReplace(txt,'('||lx||')','(8190)', __rfReplaceAll + __rfIgnoreCase);

txt=ibec_StringReplace(txt,'SET NAMES NONE;','SET NAMES '+sourcecharset+';', __rfReplaceAll + __rfIgnoreCase);
txt=ibec_StringReplace(txt,'COLLATE '+sourcecollate,'COLLATE UTF8', __rfReplaceAll + __rfIgnoreCase);
txt=ibec_StringReplace(txt,source,target, __rfReplaceAll + __rfIgnoreCase);
ibec_SaveToFile(scriptdir+'_ibe$start_.sql',txt,__stfOverwrite);

--do the same in the footer script
txt=ibec_LoadFromFile(scriptdir+'_ibe$finish_.sql');
for select distinct rdb$fields.rdb$field_length from rdb$fields where rdb$fields.rdb$field_length>8190 into :lx
do txt=ibec_StringReplace(txt,'('||lx||')','(8190)', __rfReplaceAll + __rfIgnoreCase);
ibec_SaveToFile(scriptdir+'_ibe$finish_.sql',txt,__stfOverwrite);


txt=ibec_LoadFromFile(scriptdir+'runme.all.sql');
txt=ibec_StringReplace(txt,'INPUT ''','INPUT '''+scriptdir, __rfReplaceAll + __rfIgnoreCase);
ibec_SaveToFile(scriptdir+'runme.all.sql',txt,__stfOverwrite);

res = ibec_Exec('ibescript.exe '+scriptdir+'runme.all.sql -N -VD:\db\db1\runme.all.log ','',cbb);
end;

Answer
Andrej Repin 7 years ago
Cпасибо, может и пригодиться.
0
Fixed

Сканер. Модуль записи закрыт из за ошибки.

Stepan 6 years ago • updated by Andrej Repin 6 years ago 7

Зарядил с утра добавляться книги в режиме Индексирования, пришёл, а тут ошибка:

System.InvalidOperationException: Модуль записи закрыт из-за ошибки.
в System.Xml.XmlWellFormedWriter.AdvanceState(Token token)
в System.Xml.XmlWellFormedWriter.WriteEndElement()
в System.Xml.XmlWellFormedWriter.WriteEndDocument()
в  .    (XmlWriter ,    , IEnumerable`1 , IEnumerable`1 )
в Fb2Library.ImportView.(String )
в Fb2Library.ImportView.()
в Fb2Library.ImportView..(Object , RunWorkerCompletedEventArgs )
в System.ComponentModel.BackgroundWorker.OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
в System.ComponentModel.BackgroundWorker.AsyncOperationCompleted(Object arg)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

Answer
Andrej Repin 6 years ago
0
Answered

Сортировка по нескольким колонкам

Андрей Туманов 4 years ago • updated by Andrej Repin 4 years ago 1
Сортировка по нескольким колонкам в списке книг, как в FB2Librarian, а то без нее у в авторов с большим количеством серий полная каша получается
Answer
Andrej Repin 4 years ago
Сортировка по нескольким колонкам возможна либо через контекстное меню, либо использованием комбинации Ctrl+Click на заголовке.
0
Answered

Импорт, почему так долго?

Илья Агафонов 6 years ago • updated by Andrej Repin 6 years ago 8

Мне вот интересно почему так долго? 20 часов импортирует ~16к книг, в дельфевом намного шустрее было...

Answer
Andrej Repin 6 years ago
Три основные причины:
  1. Катастрофическая деградация производительности Firebird базы с увеличением объема
  2. Обновление UI
  3. Маршалинг из Manged в Unmanaged в FirebirdSql драйвере.


1. О производительности Firebird я уже писал:

https://plus.google.com/u/0/117645144499921711425/posts/NLce8cFRfTf
https://plus.google.com/u/0/117645144499921711425/posts/AoRCbSXfcyH

и тут:
https://plus.google.com/u/0/117645144499921711425/posts/Bz8xyoWqu5N

2. Отключение динамического обновления UI возможно даст увеличение производительности на пару процентов.

3. Протокол обмена данными между ADO .NET драйвером и Firebird сервером построен на использовании достаточно больших структур. При каждом запросе к БД происходит заполнение структуры данными в Managed памяти, затем эта структура копируется runtime'ом .NET в Unmanaged память (происходит так называемый маршалинг) и указатель на неё передается дальше в код Firebird'a.

Всё это, в конечном итоге, сказывается на производительности операции импорта.

По поводу базы данных.
  1. Размер странницы рекомендуется выбирать равным размеру кластера в файловой системе. Для NTFS стандартный размер кластера равен 4к (4096)
  2. Флаг "Force Write" заставляет Firebird после каждого изменения в БД скидывать файловые буфера на диск. При этом повышается надёжность, но понижается производительность.
0

Закрытие вкладок в полноэкранном режиме

Александр 6 years ago • updated by ve51 6 years ago 1

Заметил такую вещь. При редактировании информации о книге в полноэкранном режиме нет кнопки закрытия вкладки с этой книгой. Приходится выходить в обычный режим и закрывать.

0
Fixed

Как работать с OPDS​ каталогом?

Андрей Нагибин 3 years ago • updated 3 years ago 10
Как работать с OPDS каталогом?
Answer
Andrej Repin 3 years ago
Исправлено в версии 1.4.1207.0
0
Under review

Перестал работать внешний редактор

Александр Остриков 3 years ago • updated by Andrej Repin 3 years ago 4
Уж извините. Изначально не там вопрос задал. Потом сообразил что не то сделал. Поэтому не бейте. Итак:
Здравствуйте. Года три назад начал пользоваться Вашей программой. Потом как-то отошел от этих дел. Теперь вот опять вернулся- считаю на данный момент самым удачным вариантом библиотекаря (а я их много перепробовал)))
Возник вот какой вопрос- насколько я помню, была реализована функция редактирования текста во внешнем редакторе FBE с сохранением изменений в основном файле. Теперь у меня этого не получается. Если выбрать способ открытия в FBE и внести изменения в текст, то изменения не сохраняются. При добавлении внешних инструментов и выборе FBE в качестве этого инструмента в меню при клике правой кнопкой появляется FBE, но файл не открывается. Ошибок не пишет. Может что-то с настройками внешних инструментов? Галочка с "Игнорировать изменения файла" снята.

На всякий случай W8.1 X64, способ хранения- файловая система.
Answer
Andrej Repin 3 years ago
Попробуйте в параметрах использовать кавычки, т.е. "%i" 
0
Fixed

Ошибка при запуске

NOVl 5 years ago • updated by Andrej Repin 5 years ago 4

Помогите разобраться в причине ошибки. При установке на нетбук AserAspireOne программа запросила Microsoft .NET Framework. После скачки и установки NET Framework программа установилась, но при запуске вышла ошибка "Возникло необработанное исключение".

System.IO.FileFormatException: Формат изображения не распознан. ---> System.Runtime.InteropServices.COMException: Исключение из HRESULT: 0x88982F07
--- Конец трассировки внутреннего стека исключений ---
в System.Windows.Media.Imaging.BitmapFrameDecode.EnsureThumbnail()
в System.Windows.Media.Imaging.BitmapFrameDecode.get_Thumbnail()
в MS.Internal.AppModel.IconHelper.GetBestMatch(ReadOnlyCollection`1 frames, Size size)
в MS.Internal.AppModel.IconHelper.CreateIconHandleFromImageSource(ImageSource image, Size size)
в MS.Internal.AppModel.IconHelper.GetIconHandlesFromImageSource(ImageSource image, IconHandle& largeIconHandle, IconHandle& smallIconHandle)
в System.Windows.Window.UpdateIcon()
в System.Windows.Window.SetupInitialState(Double requestedTop, Double requestedLeft, Double requestedWidth, Double requestedHeight)
в System.Windows.Window.CreateSourceWindow(Boolean duringShow)
в System.Windows.Window.CreateSourceWindowDuringShow()
в System.Windows.Window.SafeCreateWindowDuringShow()
в System.Windows.Window.ShowHelper(Object booleanBox)
в System.Windows.Window.Show()
в Fb2Library.App.OnStartup(StartupEventArgs )
в System.Windows.Application.<.ctor>b__1(Object unused)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

На стационарный комп программа встала без проблем

Answer
Andrej Repin 5 years ago
Проблема проявляется на машинах с Windows XP и связана с png-сжатием в иконке приложения.
0
Completed

Наложение эффектов на обложки

ve51 6 years ago 0

Предлагаю убрать наложение эффектов, либо сделать опциональным.

Answer
Andrej Repin 6 years ago
Реализовано в новой версии

0
Fixed

Домашняя страница записывается в другое поле

Valerij Morozov 5 years ago • updated by Andrej Repin 5 years ago 1

Адрес домашней страницы записывается в поле "Псевдоним".

Answer
Andrej Repin 5 years ago
Исправлено. Будет доступно в следующем обновлении.