Russian Qt Forum

Qt => Базы данных => Тема начата: Yuriy от Октября 12, 2011, 21:35



Название: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 21:35
Всем привет. Вчера впервые решил опробывать работу своих программ в Windows 7 64 bit.
Сборку делал на Win XP 32 bit. Все безупречно работает. Но вот почему то в новой версии виндоуз выдает ошибку при попытке записи данных в БД SQlite3: Attempt to write to read-only database.

В чем может быть дело ? Может быть кто-нибудь уже сталкивался ?


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 12, 2011, 21:36
Права есть на запись?


Название: Re: Attempt to write to read-only database
Отправлено: BRE от Октября 12, 2011, 21:37
В чем может быть дело ? Может быть кто-нибудь уже сталкивался ?
В правах к самому файлу или папке где он лежит. Ты его не в Program Files положил?


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 21:40
Я честно говоря не знаю. Документы сохраняются и в папку программы и там откуда считываю БД, но вот например на C: не сохраняются. Думаю это такой трюк Win 7. Пользоваться этой поделкой от M$ не собираюсь, но вдруг кто-нибудь будет использовать мое приложение под Win7, нужно быть уверенным, что все работает.

у меня два exe-шника и оба лежат C:\Visual3D\bin


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 21:43
И в эту папку пишутся файлы, конфиги, и читаются без проблем из под программы. Без проблем создаются файлы из под моей программы с помощью fopen, fflush и fclose. Только не в корневой папке C: А БД почему-то не сохраняются. Вообще я использую БД SQlite3 и не задаю userName, password, port и hostName при открытии БД. Может быть дело в этом ???


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 12, 2011, 22:01
Покажи как создаешь подключение.


Название: Re: Attempt to write to read-only database
Отправлено: BRE от Октября 12, 2011, 22:03
[off] Микрософт наконец дошел до того, что права доступа все таки нужны, добавили их в win7 (ну через жопу конечно сделали), а пользователи не поняв что это все для их блага, либо сразу отрубают UAC, либо по традиции работают с админскими правами. :) Сам недавно столкнулся, пришлось проработать вопрос...
Еще понравилось решение вопроса с повышением привилегий программ-установщиков. Кто-то скажет нужен специальный файл манифест, где все это будет описано, но есть способ проще. Используется специальный эвристический алгоритм, который анализирует имя запускаемого файла и если там есть что-то типа setup, install или чего-то подобного, до венда без всяких манифестов запросит пароль и поднимет привилегии этому процессу. :)  [/off]


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:06
В одной статические функции, а в первой (потому как реже используются БД) обычным классом:

Добавляю соединение:
Код:
void readconstants::openDB(const int &Type)
{
    QSqlDatabase db;

switch (Type)
{
case 0:
    db = QSqlDatabase::addDatabase("QSQLITE","myConstConnect");
    break;
case 1:
    db = QSqlDatabase::addDatabase("QSQLITE","myRoomConnect");
    break;
case 2:
......

Здесь работаю с БД разными функциями
Код:
void writedb::writePanelsState(const QString &fileName,const QByteArray &geo_data,const QByteArray &layout_data)
{
QSqlDatabase db = QSqlDatabase::database("mySettingsConnect",false);
db.setDatabaseName(fileName);
if (!db.open())
    {
        QMessageBox::warning(0, QString::fromUtf8("Ошибка"), QString::fromUtf8("Ошибка при подключении к базе данных %1.").arg(fileName));
        return;
    }

db.transaction();

QSqlQuery query(db);
query.exec("DELETE FROM PanelsData;");

query.prepare("INSERT INTO PanelsData (LayoutData, GeoData) "
                   "VALUES (:layout, :geo)");
     query.bindValue(":layout", layout_data);
     query.bindValue(":geo", geo_data);
     if (!query.exec())
         QMessageBox::warning(0, QString::fromUtf8("Ошибка"), QString::fromUtf8("Не смогли записать информацию о панелях."));

db.commit();
//if (db.isOpen())  db.close(); memory leak - закрываю с помощью RemoveDB
}

Убираю соединение:
Код:
void readconstants::closeDB(const int &Type)
{
switch (Type)
{
case 0:
    QSqlDatabase::removeDatabase("myConstConnect");
    break;
case 1:
    QSqlDatabase::removeDatabase("myRoomConnect");
    break;
case 2:
    QSqlDatabase::removeDatabase("mySettingsConnect");
    break;
case 3:
    QSqlDatabase::removeDatabase("myBaseMaterialConnect");
    break;


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:10
[off] Микрософт наконец дошел до того, что права доступа все таки нужны, добавили их в win7 (ну через жопу конечно сделали), а пользователи не поняв что это все для их блага, либо сразу отрубают UAC, либо по традиции работают с админскими правами. :) Сам недавно столкнулся, пришлось проработать вопрос...
Еще понравилось решение вопроса с повышением привилегий программ-установщиков. Кто-то скажет нужен специальный файл манифест, где все это будет описано, но есть способ проще. Используется специальный эвристический алгоритм, который анализирует имя запускаемого файла и если там есть что-то типа setup, install или чего-то подобного, до венда без всяких манифестов запросит пароль и поднимет привилегии этому процессу. :)  [/off]

Ну и хрень, как бы тогда права 0666 установить с помощью InnoSetup  скрипта на установленную папку.  ;D
И еще не смог WiFi подключить под эту ОС, поэтому в Debian  или Win XP могу только выйти на форум, потом уже перезагружать в Win 7 и пробывать... Вообщем бред из бреда.


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 12, 2011, 22:12
В InnoSetup это делается очень легко, на сколько я помню. Поищи в хэлпе. А еще лучше, создавай БД в ApplicationData.


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:28
погуглил немного, а то ведь в Win 7 инета не будет  ;D
http://sqlite.phxsoftware.com/forums/t/1163.aspx

Решение следующее:
This a reccurrent error in Vista and 7. The user must set the administrator privileges to the aplication in the properties. Otherwise the error appears.

И всего - навсего нужно будет объяснить конечным пользователям это же. Создать какую-нибудь политику и куда-нибудь ее всунуть! Блин, как же это все напрягает если честно. Эти sheduled task'и пачками, которые невозможно отключить, это шерстение на жестком диске, вся эта "умная" Windows'овская обработка в тихушку ! Блин это не система а вирус


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:37
А вот и решение по запуску программ с повышенными привелегиями, которое я теперь заучу и буду диктовать по телефону своим клиентам:

1) Запускаете планировщик заданий (Пуск ---> Все программы ---> Стандартные ---> Служебные ---> Планировщик заданий)
2) Нажимаете "Создать задачу"
3) Указываете Имя для новой задачи и ставите флажок "Выполнять с наивысшими правами"
4) Переходите на вкладку Действия, нажимаете "Создать", в следующем окне нажимаем "Обзор"
5) Указываете путь к нужному приложению и нажимаете "Открыть"
6) Нажимаете "ОК", затем снова "ОК"
7) Создайте ярлык на рабочем столе ( Нажмите правую кнопку мыши, выберете "Создать" ---> "Ярлык")
8) В поле Расположение объекта введите:
schtasks /run /tn mytask_admin

где mytask_admin - имя созданной нами задачи. Если в имеми содержаться робелы, обязательно укажите его в кавычках.
9) Введите имя ярлыка и нажмите Готово

И кто мне скажет, что такой подход - не КОСТЫЛЬ ? И после этого еще кто-то говорит что Linux для "красноглазых" ???


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 12, 2011, 22:40
Что-то больно все сложно. Уверен, что это единственное решение?


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:45
Пантер, спасибо за Ваше участие в обсуждении проблемы.

Я немного расстроился. Нужно было модели доделывать, а я два дня с этим Win 7 занимаюсь вместо основной работы. Ну а как же еще. Либо сторонние приложения использовать типа Elevated Shortcut, либо демон писать и его в службы засовывать, либо вот так по телефону клиентам толдычить. Возможность переноса папки с программой в этом случае проблематичная. Я всегда делал программы Portable, которые имеют свои настройки и содержатся в пределах одной папки, а теперь придется вот такие трюки выполнять и как только клиент переустановит Windows снова ему перезаряжать программу.

А может быть какой-нибудь exe-шничек сейчас сварганю, типа FirstConfig.exe чтобы он вшивал программу в систему, но уж очень я не люблю таких вещей.


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 12, 2011, 22:47
Мне все равно кажется, что есть простое решение. К сожалению, сейчас под рукой нет винды, но завтра на работе постараюсь глянуть, если время будет.


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 12, 2011, 22:54
Мне все равно кажется, что есть простое решение. К сожалению, сейчас под рукой нет винды, но завтра на работе постараюсь глянуть, если время будет.

Буду очень признателен. Я еще не совсем вник, но судя по всему есть такая UAC , которую отключают либо запускают систему под администратором. Речь идет о простых пользователях, которым нужен ярлык на рабочем столе и все. Поэтому я поставил Win 7 с ориг образа, такой как у всех, без изменений. И возможны еще проблемы. Создание таких ярлыков может быть недоступно в версиях типа home, starter и т.д.
Все это нужно проверять. Очень обломно с вин работать. Завтра поговорю с клиентами, может быть они на Linux согласятся.


Название: Re: Attempt to write to read-only database
Отправлено: loneybibi от Октября 13, 2011, 00:01
Не расстраивайся ! :) Все намного проще! Согласен windows == вирус :)))
Сам когда свое приложение собирал под Win7, тоже не мог записать ничего в файл. Программа находилась на диске С и UAC блокировал все попытки программы писать в файл и даже просто сохранить какую то информацию в текстовом файле. Проблема была в том что Win7 UAC требует у программы права на запись файла, которые она должна получить при запуске. Вообщем решил это с помощью manifest файлов. Вот тема на форуме решение в конце описано мной подробно (будут вопросы пиши ICQ:400055065):
http://forum.vingrad.ru/forum/topic-332538/kw-user-account-control/hl/manifest/index.html#st_15_view_0


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 13, 2011, 02:29
Спасибо огромное, loneybibi !

Это отличная мысль, буду пробывать !!!
Я пару лет назад на WineHQ.org подробно описывал использование манифестов, извлекая его из msaccess.exe и просто выкладывал в одном каталоге вместе с исполняемыми файлами windows. Под wine'ом Access2007 не шел именно из за этих манифестов, которые в  нем были зашиты, но он их не видел:
http://bugs.winehq.org/show_bug.cgi?id=19297


Но я честно только сейчас узнал про секцию trustInfo.

Это здорово как только опробую, напишу о результатах сего происка !!!


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 18, 2011, 13:52
Отписываюсь по результатам:
Действительно, проблема оказалась в административных привилегиях Windows Seven.
Для того чтобы база данных SQLite3 могла писать необходимо запустить свою программу как администратор.

Либо прописать в .manifest requestedExecutionLevel level="highestAvailable"
для отключения зашивки манифестов можно добавить в файл проекта следующую строку:
CONFIG -= embed_manifest_exe
и тогда будет создан manifest в одной папке с исполняемым файлом. Его можно отредактировать, либо использовать Restorator или любой другой хак ресурсов. И переписать права доступа.

При этом в Seven'е на иконке Вашего приложения появится значок радиации желтого цвета и при запуске программа будет кричать, типа давай не будем запускать это приложение, оно хочет привилегий, хочет делать записи и т.д.
Вот такая печальная история....


Название: Re: Attempt to write to read-only database
Отправлено: LisandreL от Октября 18, 2011, 14:48
А вы базу то храните в %APPDATA% (или %ALLUSERSPROFILE%, если она общая для всех пользователей) или где бог на душу положит?


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 18, 2011, 15:40
Там 5 - 12 баз данных (создаются в процессе работы) и все в пределах C:\Visual3D\
Одна для хранения ImageCache, другая для Покупателей, третья с Прототипами и т.д.

работаю с ними с использованием ATTACH DATABASE, но проблема не в этом. Не знаю как еще отключить этот самый UAC, может быть после его отключения пропадут значки радиации и всякие Windows'овские ужасающие предупреждения  ;D

Только что обратил внимание: на моем аватаре написано Чайник. Поправьте кто-нибудь пожалуйста.


Название: Re: Attempt to write to read-only database
Отправлено: Пантер от Октября 18, 2011, 15:54
Только что обратил внимание: на моем аватаре написано Чайник. Поправьте кто-нибудь пожалуйста.
Наберешь нужное количество сообщений, надпись поменяется.


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 18, 2011, 20:06
Мне просто кажется непристойным название моего профиля "Чайник". Напишите что-нибудь поприличнее. Или сотрите мой профиль ко всем чертям.


Название: Re: Attempt to write to read-only database
Отправлено: BRE от Октября 18, 2011, 20:47
Мне просто кажется непристойным название моего профиля "Чайник". Напишите что-нибудь поприличнее. Или сотрите мой профиль ко всем чертям.
В настройках профиля можешь сам написать что хочешь. :)


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 18, 2011, 21:33
 8) увы php скрипты не грузятся вместо аватаров. Придется много-много писать сообщений по делу и зарабатывать себе статус. Будем стараться  ;).


Название: Re: Attempt to write to read-only database
Отправлено: loneybibi от Октября 19, 2011, 08:31
Не знаю как еще отключить этот самый UAC, может быть после его отключения пропадут значки радиации и всякие Windows'овские ужасающие предупреждения  ;D

Только что обратил внимание: на моем аватаре написано Чайник. Поправьте кто-нибудь пожалуйста.

Зачем его отключать!? :) Я тебе давал ссылку на форум винграда на мой пост по манифестам, думаю некоторые моменты ты упустил. В конце есть ссылка (последняя, да и не только, на хабр ссылка тоже про манифесты описывает способы обхождения Uac) на доп. документацию на msdn на русском, там описывают работу утилиты MageUI для создание манифестов. В моем посте приведен шаблон манифеста самый простой. Есть еще параметр такой как TrustLevel который может быть = FullTrust. И если ты не хочешь что бы приложение спрашивало пользователя о повышении административных прав то подпиши приложение цифровым подписью что бы UAc не кипишевал и не выдавал запросов, если вообще полный доступ к win то цифровым сертификатом (на msdn и про создание и получение pfx сертификатов написано тоже) , укажи его в манифесте и приложение будет получать полные административные права без участия пользователя и всяких запросов.

:)
Мат часть:
MageUI с графическим интерфейсом для создание манифестов в том числе и FullTrust
http://msdn.microsoft.com/ru-ru/library/acz3y3te.aspx
MakeCertificate создание тестовых сертификатов самому локально для отладки
http://msdn.microsoft.com/ru-ru/library/bfsktky3.aspx


Название: Re: Attempt to write to read-only database
Отправлено: Yuriy от Октября 19, 2011, 19:15
Спасибо, loneybibi.
Буду дальше изучать. Напишу о результатах. А еще лучше составлю FAQ для тех кто пишет приложения с использованием QSLite3 для Windows. Думаю эта тема будет полезна со временем.