Что нового

Обращение с паролем к SQLite на локальном диске

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Всем привет и хорошего настроения!

Подскажите, пожалуйста, как с помощью Au3 выполнить запрос к базе данных SQLite на диске С?

В официальной справке нашёл замечательный кусок кода, в котором не хватает всего одной детали: как указать директорию базы и пароль к ней.

Код:
#include <MsgBoxConstants.au3>
#include <SQLite.au3>
#include <SQLite.dll.au3>

Local $hQuery, $aRow, $sMsg
_SQLite_Startup()
ConsoleWrite("_SQLite_LibVersion=" & _SQLite_LibVersion() & @CRLF)
_SQLite_Open() ; open :memory: Database
_SQLite_Exec(-1, "CREATE TABLE aTest (a,b,c);") ; CREATE a Table
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('c','2','World');") ; INSERT Data
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('b','3',' ');") ; INSERT Data
_SQLite_Exec(-1, "INSERT INTO aTest(a,b,c) VALUES ('a','1','Hello');") ; INSERT Data
_SQLite_Query(-1, "SELECT b FROM aTest ORDER BY a;", $hQuery) ; the query
While _SQLite_FetchData($hQuery, $aRow) = $SQLITE_OK
    $sMsg &= $aRow[0]
WEnd
_SQLite_Exec(-1, "DROP TABLE aTest;") ; Remove the table
MsgBox($MB_SYSTEMMODAL, "SQLite", "Get Data using a Query : " & $sMsg)
_SQLite_Close()
_SQLite_Shutdown()

; Output:
; ;~ Hello World


Для создания тестовой базы можно использовать запрос:

Код:
CREATE TABLE [Rio_03] ([Ind_Num] integer NOT NULL PRIMARY KEY AUTOINCREMENT, [DateX] NOT NULL, [TimeX] NOT NULL, [Name] varchar NOT NULL, [Event] varchar NOT NULL)

В дальнейшем планирую использовать set/get функции к этой базе:

Код:
INSERT INTO Rio_03([DateX], [TimeX], [Name], [Event]) VALUES (date('now', 'localtime'), time('now', 'localtime'), 'rvoronov', 'Random row');
SELECT [DateX], [TimeX], [Name], [Event] FROM [Rio_03] WHERE [Ind_Num] = (SELECT MAX([Ind_Num]) FROM Rio_03)
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Re: Обращение к SQLite на локальном диске

Нашёл, как выполнить запрос к НЕ запароленой базе. Осталось узнать, как обращаться к базе "вежливо", с паролем.

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>

_SQLite_Startup()

_SQLite_Open('C:\Users\rvoronov\ ... \Rio_SQL.db')
_SQLite_Exec(-1, "INSERT INTO Rio_03([DateX], [TimeX], [Name], [Event]) VALUES (date('now', 'localtime'), time('now', 'localtime'), 'rvoronov', 'Random row')")

_SQLite_Close()
_SQLite_Shutdown()



Добавлено:
Сообщение автоматически объединено:

Собрал пример пример простой программы, позволяющей как добавлять строки в SQLite базу данных, так и просмотреть последнее добавление. Всё ещё интересует вопрос, что в этом коде нужно изменить в случае, если существует пароль к базе.

Код:
#include <SQLite.au3>
#include <SQLite.dll.au3>
#include <MsgBoxConstants.au3>

; Для работы с SQLite запросами
Global Const $dbFullName = 'C:\Users\rvoronov\Documents\Package_200\Personal\Tryals\SQL-tasks\Rio_SQL.db'
Global Const $qrAddRow = "INSERT INTO Rio_03([DateX], [TimeX], [Name], [Event]) VALUES (date('now', 'localtime'), time('now', 'localtime'), 'rvoronov', 'Random row')"
Global Const $qrShowLR = "SELECT [DateX], [TimeX], [Name], [Event] FROM [Rio_03] WHERE [Ind_Num] = (SELECT MAX([Ind_Num]) FROM Rio_03)"

; Переменные, описывающие форму
Global $hGUI ; Для обращения к форме
Global Const $hGUI_H = 70  ; Высота
Global Const $hGUI_W = 160 ; Ширина

; Переменные, описывающие кнопки
Global $Btn1 ; Для работы с кнопками
Global $Btn2 ; Для работы с кнопками
Global Const $Btn_H =  20 ; Высота кнопок
Global Const $Btn_W = 140 ; Ширина кнопок
Global Const $Btn_X =  10 ; Положение кнопок по горизонтали
Global Const $Btn_Y1 = 10 ; Положение первой кнопки по вертикали
Global Const $Btn_Y2 = 40 ; Положение второй кнопки по вертикали

Form_GUI_Main()

While 1
   Switch GUIGetMsg()
	  Case $Btn1
		 _Execute_SQLite_Query($qrAddRow)
		 MsgBox(1, "", "Сообщение отправлено!")
	  Case $Btn2
		 _Execute_SQLite_Query($qrShowLR)
   Case -3
		 MsgBox(1, "Инфо", "Завершение программы.")
		 Exit
   EndSwitch
WEnd

Func Form_GUI_Main()
   $hGUI = GUICreate("Меню", $hGUI_W, $hGUI_H)
   $Btn1 = GUICtrlCreateButton("Отправить сообщение.", $Btn_X, $Btn_Y1, $Btn_W, $Btn_H)
   $Btn2 = GUICtrlCreateButton("Получить сообщение.",  $Btn_X, $Btn_Y2, $Btn_W, $Btn_H)
   GUISetState()
EndFunc

Func _Execute_SQLite_Query($Query)
   Local $hQuery, $aRow
   _SQLite_Startup()
	  _SQLite_Open($dbFullName)
	  _SQLite_Exec(-1, $Query)
	  If $Query = $qrShowLR Then
		 _SQLite_Query(-1, $Query, $hQuery)
		 _SQLite_FetchData($hQuery, $aRow, False, False)
		 MsgBox(1, "Инфо", "Последнюю запись добавил: " & $aRow[2] & @CRLF & "От " & $aRow[0] & " в " & $aRow[1])
		 _SQLite_QueryFinalize($hQuery)
	  EndIf
   _SQLite_Close()
   _SQLite_Shutdown()
EndFunc
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Попробуйте почитать здесь: SQLite with password

Тема там очень старенькая - 07 April 2010...

Standard SQLite3 API doesn't offer any form of protection...
Суть: В стандартных средствах SQLite3 нет возможности использовать какую-либо форму защиты...

-------------
11 пост - возможно Вам поможет. Правда я не проверял ни чего из этого...
 
Автор
Rioran

Rioran

Everything is possible and achievable.
Сообщения
26
Репутация
2
Zak, спасибо, любопытная ссылка!

Насколько понял, вопрос там решается с помощью PRAGMA - набора команд по заданию параметров SQLite базы данных. При этом использование:

Код:
PRAGMA key = 'xxx'

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

Неужели из выше сказанного следует, что установив пароль на бд "изнутри" SQLite, открыть такую базу мы можем исключительно "руками"?

UPD_01: не обратил внимание на номер поста, выше комментировал 2-й и 7-й посты по ссылке.
UPD_02: а впрочем 11-й пост тоже на тему PRAGMA key = (...)
 
Верх