odbc.f  Доступ к базам данным через ODBC

Библиотека доступа к базам данным через ODBC написана по следам библиотеки Андрея Черезова с таким же названием и схожей функциональностью. Оттуда целиком взяты некоторые фрагменты кода, относящиеся к доступу к источникам данных, и оставленые те же имена слов и их стековая нотация. Различия заключается в самом чтении/записи данных. У Андрея все данные, каков бы ни был их тип, читаются как строки. Для его задач, в основном, предполагающих перегрузку данных из базы на веб-страницу, такой подход удобен и логичен. Однако для программ, выполняющих интенсивные вычисления и заранее знающих тип своих данных, преобразование данных из строк при чтении не нужно и,более того, излишне.

1. Установление соединения с базой данных
2. SQL-запрос к базе и получение информации
3. Связывание полей с переменными и чтение данных

1. Установление соединения с базой данных

StartSQL ( -- fodbc ? )
Инициализирует подсистему доступа к БД. Возвращает флаг успешности и дескриптор соединения.
StopSQL ( fodbc -- )
Разрывает соединение с базой данных и освобождает использованную память.
ConnectSQL ( S" datasource" S" login" S" password" fodbc -- ? )
Устанавливает соединение с конкретным источником данных. Если имя и пароль не требуются, можно передать на стеке 4 нуля - по два на каждую строку.

2. SQL-запрос к базе и получение информации

ExecuteSQL ( stat fodbc -- ior )
Посылает к базе данных указанный запрос stat. Запрос должен быть ASCIIZ-строкой. Возвращается код успешности, определяемый драйвером.
SQL_OK? ( ior -- ? )
Проверяет, был ли успешен запрос, вернувший код ior.
Следующие слова могут быть выполнены только после успешного окончания SQL-запроса:
ResultCols ( fodbc -- n )
Возвращает число полей в полученных данных (возвращенных оператором SELECT).
AffectedRows ( fodbc -- n )
Возвращает число записей, которые изменились, были добавлены или удалены в ходе выполнения SQL-запроса (имеет смысл для запросов типа DELETE, UPDATE, INSERT).
ColNumAttribute ( col attr fodbc -- n )
Возвращает числовое значение произвольного атрибута attr колонки (поля) col. Колонки нумеруются с единицы. Нулевая колонка содержит служебную информацию - закладку.
ConnectSQL ( buf col attr fodbc -- fodbc ? )
Возвращает в предоставленный буфер buf произвольный атрибут-строку attr для поля col. Длина буфера (и возвращаемой строки) не может быть больше 50 байтов.
ColSize ( col fodbc -- n )
Возвращает количество байтов, нужных для хранения поля col. Например, для целого поля будет возвращено число 4.
ColDisplaySize ( col fodbc -- n )
Возвращает количество байтов, необходимых для представления поля в виде строки, плюс еще один байт на завершающий нулевой символ. Например, для целого поля может быть возвращено число 10.
ColType ( col fodbc -- n )
Возвращает константу - тип поля col.
ColCount ( fodbc -- n )
Возвращает количество полей в результирующем наборе данных.
ColName ( buf col fodbc -- )
Возвращает в предоставленный буфер имя поля col.

3. Связывание полей с переменными и чтение данных

BIND ( -- )
Подготавливает данные, необходимые для последующих операций связывания полей из базы данных с переменными. Связывание выполняется для последнего запроса, выполненного словом ExecuteSQL. Для каждого поля словом типа SQL_INTEGER ( ->bl; -- )объявляется своя переменная. Поддерживаются следующие типы:
Объявляется словом Тип переменной
SQL_INTEGERЦелая
SQL_SMALLINTМаленькая целая
SQL_FLOATC плавающей точкой
SQL_DOUBLEС плавающей точкой двойной длины
SQL_CHARASCIIZ-строка
SQL_BINARYПроизвольные двоичные данные
SQL_BITБитовая
SQL_DATEДата
SQL_TIMEВремя
SQL_TIMESTAMPОтметка даты/времени
Для каждой переменной создается два имени. Например, код SQL_INTEGER var создаст две переменных с именами var и var#. Первое имя при вызове вернет значение поля из текущей записи, второе имя - фактическую длину данных в переменной, выраженную в байтах.
BIND; ( -- )
Разрывает все связи полей с переменными и уничтожает переменные.
ISNULL ( var# -- ? )
Проверяет, не содержит ли указанная переменная, связанная с полем,пустое значение. Обратите внимание: передается на сама переменная, а ее индикатор длины.
NextRow ( fodbc -- ? )
Читает очередную запись из результирующего набора данных. Возвращается флаг - имеется ли следующая запись.
NextRowWithInfo ( fodbc -- ior )
Читает очередную запись, но возвращает код драйвера. Используется для отладки.
Таблица в базе определена следующим образом:

CREATE TABLE cats(
name CHAR(20),
year INT
);

Распечатать ее значения можно примерно так:
REQUIRE " ~yz/lib/common.f
0 VALUE db
: print-cats
StartSQL 0= IF ." Не могу запустить ODBC" BYE THEN TO db
S" catbase" S" admin" S" pussy" ConnectSQL
0= IF ." Не могу подсоединиться к источнику данных CATBASE" BYE THEN
" SELECT * FROM cats" db ExecuteSQL ?dberror
BIND
SQL_CHAR name
SQL_INT year
BEGIN
db NextRow
WHILE
." Кот " name .ASCIIZ ." родился в " year . ." году" CR
REPEAT
BIND;
db StopSQL ;