Пишем простое Windows-приложение на Tcl/Tk с использованием SQLite

Добрый день уважаемому хабрасообществу! Немного здесь информации об очень приятном и лёгком в использовании языке программирования TCL, а особенно, полезной для тех, кто только начинает с ним знакомство. Попробую внести посильный вклад в исправление столь досадного недоразумения.

Преамбула

Появилось у меня задание в институте: в качестве лабораторной работы написать небольшое приложение, оперирующее определённым количеством структурированных данных. Приложение должно запускаться под Windows, не требуя установки каких-либо интерпретаторов, баз данных, фреймворков и любого дополнительного софта. Структура данных такова, что их удобно хранить в реляционной БД. При более свободном выборе ЯП и отсутствия требования к лёгкому запуску на любом компьютере я по привычке написал бы всё на РНР+MySQL, но здесь пришлось искать другие пути.
Спросив у товарищей, кто как решает данную задачу, обнаружил, что пишут в основном на Delphi/Visual Basic с использованием csv-подобных файлов в качестве хранилища. Мне не хотелось пользоваться громоздкими системами и отказываться от SQL. И пришло озарение: а ведь я почти каждый день на работе использую TCL! После недолгих поисков информации было обнаружено, что он отлично подойдёт для решения нашей задачи.

Превращение TCL-кода в windows executable

TCL — интерпретируемый язык. Но есть средство, позволяющее создать исполняемый файл из tcl-кода: TkWrap. Оно упаковывает интерпретатор и наш исходный код в один файл, обеспечивая таким образом необходимую нам удобную переносимость.
Работать с ним очень просто:
  1. Скачиваем и распаковываем TkWrap
  2. В полученном архиве есть три файла, нас интересует fullwrap.exe, т.к. только он поддерживает работу с SQLite. Запускаем его: fullwrap.exe hello.tcl -o hello.exe
    hello.tcl — заранее подготовленный файл с исходным кодом, hello.exe — имя исполняемого файла, который мы получим на выходе.
  3. Запускаем созданный hello.exe и любуемся результатами проделанной работы.
Конечно, чтобы было чем любоваться, необходимо это что-то сначала написать. Теперь о TCL-коде.

Работаем с SQLite из TCL

SQLite — легковесная встраиваемая реляционная база данных (цитата из Википедии). Это значит, что мы можем легко пользоваться всеми прелестями SQL без необходимости запускать какие-либо серверы баз данных. То, что нужно.
Подробное описание работы с SQLite из TCL можно найти на официальном сайте SQLite. Приведу вольный перевод основных моментов:
Команда sqlite3 dbcmd database-name подключает нас к базе данных database-name (если такой не существует, она будет создана автоматически). dbcmd — выдуманный нами идентификатор соединения. После выполнения этой команды нам становится доступна команда dbcmd с различніми методами (которых всего существует 22). Для примера рассмотрим только самый популярный, eval:
dbcmd eval sql ?array-name ? ?script?
Команда выполняет sql-код sql и, если последние параметры опущены, возвращает результат выполнения. Для прохода же по строкам (при выборке) можно использовать что-то такое:
db1 eval {SELECT * FROM t1 ORDER BY a} values {
parray values
puts ""
}

Для каждой из строк таблицы t1 (конечно, она должна для этого существовать) будет создан ассоциативный массив values, содержащий значения этой строки, и выведен на экран.

Пишем наше приложение

Итак, пример: небольшое приложение на Tcl/Tk, позволяющее выполнить произвольный sql-запрос к базе данных ourdb.
proc do_query {} {
upvar query_res query_res
set ret [query [.querytext get 0.0 end]]
set query_res [lindex $ret 1]
if {[lindex $ret 0] !=0} {
.res configure -fg red ;#подсвечиваем красным текст, если база данных вернула ошибку
} {
.res configure -fg black
}
}

proc query {text} { ;# выполняем sql-запрос и возвращаем список, состоящий из кода ошибки (0 при успехе) и текста: результата либо описания ошибки
upvar ourdb ourdb
set errcode [catch {ourdb eval $text} ret]

return [list $errcode $ret]
}
sqlite3 ourdb ourdb;#подключились к базе данных
wm title . "Работаем с SQLite"
label .query -text "Введите запрос к базе данных ourdb:" -compound center
text .querytext -width 100 -height 6
button .execute -text "Выполнить запрос" -command {do_query}

label .restitle -text "Результат:" -compound center
label .res -textvariable query_res -wraplength 200
button .exit -text Выход -command exit
. configure -padx 10 -pady 10 ;# поля для более красивого отображения окна
pack .query .querytext .execute .restitle .res .exit -expand yes ;# отображаем все созданные виджеты

Сохранив этот код и натравив на него описанный выше TkWrapper, получим наше приложение:


Ссылки

Подробнее о TCL можно почитать здесь: http://tmml.sourceforge.net/doc/tcl/
О создании графического интерфейса с помощью Tk: http://linux.yaroslavl.ru/docs/prog/tcltk/tk.html
  • +4
  • 12,4k
  • 9
Поделиться публикацией

Комментарии 9

    0
    На официальном сайте sqlite есть описание интерфейса только для C/C++ и Tcl.
    А сам язык — да, интересный, но втыкаешься не сразу.
      +1
      Где-то через неделю «втыкивания» затягивает и начинает нравиться
      0
      «Если из инструментов у тебя только молоток, все проблемы выглядят как гвозди.» (народная мудрость)
      Я понимаю когда программа на TCL уже есть и надо ее запустить на windows. Но такую историю для публики выкладывать. Мда!!!
        0
        Так эта история как раз и может быть подсказкой в той ситуации, когда программа на TCL уже есть и надо ее запустить на windows, разве нет?
          0
          Таки да. Как раз понадобилось «завернуть программу». Благодаря вашему совету завернул, даже погуглить не успел. Спасибо.
            0
            Как завернуть может и подскажет. Но тогда лучше бы другую статью написать. Хорошую статью про то как заворачивать.
            Или хорошую статью про то как написать переносимое решение на использованной связке, да еще и с такой классной фичей как заворачивать.

            А получилось про сомнительно решение задачи: «Приложение должно запускаться под Windows, не требуя установки каких-либо интерпретаторов, баз данных, фреймворков и любого дополнительного софта.»
          –1
          PHP DevelStudio
            0
            Для нормальной работы с базами хочется иметь возможность выводить данные в виде таблиц и редактировать ячейки этих таблиц, посмотрел на tcl8.5 вроде он с таблицами вообще работать не умеет?
              0

              Инфраструктура открытых ключей (продолжение): удостоверяющий центр на базе утилиты OpenSSL и SQLite3. Сам УЦ написан на Tcl/Tk.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое