). Пора подводить итоги 18 часового марафона борьбы с SQLite, итак:
С SQL у SQLite как у всех встроенных плоховато — неподдерживаются TOP, большая часть ALTER TABLE и объединения RIGHT JOIN и FULL OUTER JOIN. Плюс как-то странно воспринимает круглые скобки в части FROM запросов на выборку — alias-ы таблиц объявленные в скобках снаружи скобок не видны например в запросе:
SELECTro.[id]AS [id],
ro.[mid]AS [messageid],
[rate],
[usernick],
[subject],
sf.[name] AS [forumname]
FROM([rate_outbox] ro
INNER JOIN [messages] m ON ro.[mid] = m.[mid])INNER JOIN [server_forums] sf ON m.[gid] = sf.[id]";
из-за выделенных скобок ругается на ro.[id] и ro.[mid].
Visual Studio и SQLite то же не без странностей — непереваривает некоторые таблицы Janus-а например rating вплоть до зависаний, падений студии и сообщений:
---------------------------
Microsoft Visual Studio
---------------------------
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
---------------------------
ОК
---------------------------
Теперь о хорошем что же сделано:
Реструктуризатор — позволяет создать БД и восстановить некоторые вещи если они убиты, правда отличается нездоровой любовью к пересозданию индексов (вобщем как-то работает)
Диалог выбора и конфигурации БД доработан
Практически работающая синхронизация
Теперь снова о плохом:
В виду того что ALTER TABLE практически не реализован реструктуризатор скорее не работает, чем работает
В виду того что TOP не поддерживается пришлось переделать в ScriptFactory свойство Top в метод Top(expression) и выдавать в нем пустую строку, поидее надо также во всех местах где он используется результат обрезать руками (не зделано).
В виду того что в UPDATE не поддерживаются Alias-ы таблицы, то надо переписывать DatabaseManager.MarkOlderThan
В связи со странным восприятием круглых скобок надо посмотреть все запросы внимательно + часть наверно придется переписать.
Ну и наконец самое неприятное при синхронизации валится в самом конце при обновлении LastVersion-ов в таблице vars с сообщением о блокировке БД.
За оценки конечно спасибо. Если кто поможет/подскажет что делать с вот этим: ДА>
ДА>Ну и наконец самое неприятное при синхронизации валится в самом конце при обновлении LastVersion-ов в таблице vars с сообщением о блокировке БД. ДА>
То в течении недели я добил бы и выложил бы куда-нить, то что получилось.
Заодно попробывал бы избавится от применения enum-а DbEngineType везде кроме реструктуризатора (сильно портит нервы при добавлении новой БД), в принципе в реструктуризаторе тоже наверно можно избавится, но туда у меня лезть особого желания нет.
Шаги в данном направлении сделаны в части моего кода надо переписать слегка остальные.
Здравствуйте, Дьяченко Александр, Вы писали:
ДА>За оценки конечно спасибо. Если кто поможет/подскажет что делать с вот этим: ДА>То в течении недели я добил бы и выложил бы куда-нить, то что получилось.
Так скажи, где можно пощупать то, что уже есть?
Здравствуйте, Блудов Павел, Вы писали:
ДА>>За оценки конечно спасибо. Если кто поможет/подскажет что делать с вот этим: ДА>>То в течении недели я добил бы и выложил бы куда-нить, то что получилось. БП>Так скажи, где можно пощупать то, что уже есть?
На RSDN места не хватает. выкладываю на filepost.ru — здесь
Здравствуйте, Блудов Павел, Вы писали:
ДА>>За оценки конечно спасибо. Если кто поможет/подскажет что делать с вот этим: ДА>>То в течении недели я добил бы и выложил бы куда-нить, то что получилось. БП>Так скажи, где можно пощупать то, что уже есть?
На RSDN места не хватает. выкладываю на filepost.ru — здесь. Там исходники + маленькая БД (пользователи + форумы + достаточно свежие LastVersion в таблице vars) если с нуля при синхронизации пытается выкачать 80 метров (из-за вырезания TOP-ов наверное) а мне через мобильнк такое не выкачать.
Здравствуйте, Дьяченко Александр, Вы писали:
ДА>здесь
Отсюда без проблем. Вообще, лучший файлообменник это gmalfs но rapidshare тоже ничего.
Вобщем всё скачалось и собралось. Буду пробовать.
Здравствуйте, Дьяченко Александр, Вы писали:
ДА>Ну и наконец самое неприятное при синхронизации валится в самом конце при обновлении LastVersion-ов в таблице vars с сообщением о блокировке БД.
Это вобщем-то легко объяснимо: в Janus\Core\Synchronization\Synchronizer.cs в методе ProcessSvcResponse имеем
using (JanusDB db = new JanusDB())
{
db.BeginTransaction();
// ...
DBVars.Instance["LastRatingRowVersion"] = SpecialByteConvertor.ToString(svcResp.lastRatingRowVersion);
DBVars.Instance["LastForumRowVersion"] = SpecialByteConvertor.ToString(svcResp.lastForumRowVersion);
// ...
db.ComminTransaction();
}
Так вот, при попытке присвоить значение переменной, хранящейся в БД (DBVars.Instance = smth) создаётся параллельный Update в своём собственном JanusDB.
А вот этого-то SQLite и не может.
Если эти две строчки тупо вынести за Using (один фиг они выполняются сами по себе и не синхронизованы с основной транзакцией) то всё работает.
Ну, почти всё. В Janus\Core\DataManagement\DatabaseManager.cs в методе UpdateTopicInfoByFilter имеем
if (!string.IsNullOrEmpty(filter))
sql = sql + "AND " + filter;
а должно быть
if (!string.IsNullOrEmpty(filter))
sql = sql + " AND " + filter;
Иначе "AND" приклеивается к завершающемуся "= 0" и получается синтаксическая ошибка.
Дальше всё пучком кроме того что sqlite теряет колонку mid на Join'е. Но это я так понял ты уже научился побеждать.
Если нет — пиши будет вместе думать.
Здравствуйте, Блудов Павел, Вы писали:
ДА>>Ну и наконец самое неприятное при синхронизации валится в самом конце при обновлении LastVersion-ов в таблице vars с сообщением о блокировке БД.
БП>Это вобщем-то легко объяснимо: в Janus\Core\Synchronization\Synchronizer.cs в методе ProcessSvcResponse имеем БП>
БП>Так вот, при попытке присвоить значение переменной, хранящейся в БД (DBVars.Instance = smth) создаётся параллельный Update в своём собственном JanusDB. БП>А вот этого-то SQLite и не может.
странно вроде работа паралельная заявлена или она одно из обращений блокирует при этом (а так как из одного потока, то первое обращение блокирует а второе где как раз происходит запись в vars получает отлуп)?
БП>Если эти две строчки тупо вынести за Using (один фиг они выполняются сами по себе и не синхронизованы с основной транзакцией) то всё работает. БП>Ну, почти всё. В Janus\Core\DataManagement\DatabaseManager.cs в методе UpdateTopicInfoByFilter имеем БП>
БП>Иначе "AND" приклеивается к завершающемуся "= 0" и получается синтаксическая ошибка.
это я не трогал.
БП>Дальше всё пучком кроме того что sqlite теряет колонку mid на Join'е. Но это я так понял ты уже научился побеждать. БП>Если нет — пиши будет вместе думать.
Ок. Буду дальше ковырять. Я наверно у DBVars сделаю еще один индексатор с 2 параметрами JanusDB и string так наверно правильнее будет (а не выносить за using).
Обновленный вариант, переделал запросы надуюсь все (но может что забыл) проверял:
Синхронизация (+оборванные ветки)
Новая тема
Сообщение в тему
Оценки
Пометить как прочитанное до указанной даты (вот здесь сильно не уверен так как запрос пришлось корежить сильно)
Здравствуйте, rameel, Вы писали:
ДА>>Забирать здесь
R>Не скачивается. Может лучше у AndrewVK за доступом в репозитории, а там можно и бранч сделать, много удобнее будет, чем каждый раз файлы заливать
Попробуй с другого места у меня вроде дает скачать, к тому же написано что скачано 4 раза.
Да через SVN было бы лучше. Ладно попробую написать AndrewVK.
Здравствуйте, Дьяченко Александр, Вы писали:
БП>>Так вот, при попытке присвоить значение переменной, хранящейся в БД (DBVars.Instance = smth) создаётся параллельный Update в своём собственном JanusDB. БП>>А вот этого-то SQLite и не может.
ДА>странно вроде работа паралельная заявлена или она одно из обращений блокирует при этом (а так как из одного потока, то первое обращение блокирует а второе где как раз происходит запись в vars получает отлуп)?
Заявлено паралельное чтение. А запись только в одни руки.
ДА>Я наверно у DBVars сделаю еще один индексатор с 2 параметрами JanusDB и string так наверно правильнее будет (а не выносить за using).
+1.
Здравствуйте, Блудов Павел, Вы писали:
ДА>>странно вроде работа паралельная заявлена или она одно из обращений блокирует при этом (а так как из одного потока, то первое обращение блокирует а второе где как раз происходит запись в vars получает отлуп)? БП>Заявлено паралельное чтение. А запись только в одни руки.
Супер. Это по теме. Теперь вопрос. Кто-нибудь делал сравнительную характеристику, насколько быстрее медленее будет работать RSDN@Home с SQLLite по сравнению с MSSQL 2000?
Здравствуйте, 0rc, Вы писали:
0rc>Супер. Это по теме. Теперь вопрос. Кто-нибудь делал сравнительную характеристику, насколько быстрее медленее будет работать RSDN@Home с SQLLite по сравнению с MSSQL 2000?
ИМХО, сравнивать еще не с чем. По моему еще не все запросы отлажены до конца. Вот когда дойдет до рабочего состояния, тогда может попробую импортнуть данные в базу и сравнить характеристики.
Здравствуйте, Дьяченко Александр, Вы писали:
ДА>В виду того что TOP не поддерживается пришлось переделать в ScriptFactory свойство Top в метод Top(expression) и выдавать в нем пустую строку, поидее надо также во всех местах где он используется результат обрезать руками (не зделано). Здесь
Здравствуйте, Блудов Павел, Вы писали:
БП>У Оракла, катсти, TOP называется FETCH FIRST ### ROWS ONLY и тоже пишется в конце.
DB2, конечно. У Оракла страый добрый
SELECT * FROM (<original query>) WHERE ROWNUM < ###
У FireBird SELECT FIRST ###. Вощем кто во что горазд.
Здравствуйте, Блудов Павел, Вы писали: БП>В связи с чем идея: вынести поддержку SELECT TOP в провайдера.
Альтернативная идея: внести поддержку Firebird, LiteSQL и Oracle в Linq. Там есть Take() и Skip() БП>Например провайдеру передаётся
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.