Нейл Мэтью - Основы программирования в Linux
- Название:Основы программирования в Linux
- Автор:
- Жанр:
- Издательство:«БХВ-Петербург»
- Год:2009
- Город:Санкт-Петербург
- ISBN:978-5-9775-0289-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Нейл Мэтью - Основы программирования в Linux краткое содержание
В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стандартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.
Для начинающих Linux-программистов
Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Зная, как извлекать строки, можно перейти к рассмотрению обработки полученных реальных данных.
MySQL, как большинство баз данных SQL, возвращает два вида данных:
□ данные, извлеченные из таблицы и называемые данными столбцов;
□ данные о данных, так называемые метаданные, например, имена столбцов и их типы.
Сначала сосредоточимся на получении данных, как таковых, в пригодном к использованию виде.
Функция mysql_field_count
предоставляет некоторую базовую информацию о результате запроса. Она принимает ваше подключение как объект и возвращает количество полей (столбцов) в результирующем наборе.
unsigned int mysql_field_count(MYSQL * connection);
Помимо этого вы можете использовать mysql_field_count
и в других случаях, таких как определение причины аварийного завершения вызова функции mysql_store_result
. Если mysql_store_result
возвращает NULL
, а функция mysql_field_count
— положительное число, можно предположить ошибку извлечения. Если же функция mysql_field_count
возвращает 0, нет извлекаемых столбцов, что объясняет сбой при попытке сохранить результат. Естественно ожидать, что вы знаете, сколько предполагаемых столбцов должно быть получено в конкретном запросе. Таким образом, эта функция особенно полезна в компонентах общей обработки запросов и в любой ситуации, когда запросы формируются на лету.
В программах, написанных для более ранних версий MySQL, вы можете встретить функцию mysql_num_fields
. Она может принимать в качестве параметра указатель на структуру дескриптора подключения или структуру результата запроса и возвращает количество столбцов.
Если оставить в стороне заботы о форматировании, вы уже знаете, как немедленно вывести данные. Добавьте простую функцию display_row
в программу select2.c.
Обратите внимание на то, что для упрощения примера данные о подключении, результате и строке, полученные из функции mysql_fetch_row
, все сделаны глобальными. В рабочей программе мы не рекомендуем делать это.
1. Далее приведена очень простая подпрограмма для вывода данных:
void display_row() {
unsigned int field_count;
field_count = 0;
while (field_count < mysql_field_count(&my_commection)) {
printf("%s ", sqlrow[field_count]);
field_count++;
}
printf("\n");
}
2. Вставьте ее в конец файла select2.c и добавьте объявление и вызов функции:
void display_row();
int main(int argc, char *argv[]) {
int res;
mysql_init(&my_connection);
if (mysql_real_connect(&my_connection, "localhost", "rick",
"bar", "rick", 0, NULL, 0)) {
printf("Connection success\n");
res = mysql_query(&my_connection,
"SELECT childno, fname, age FROM children WHERE age > 5");
if (res) {
printf("SELECT error: %s\n", mysql_error(&my_connection));
} else {
res_ptr = mysql_use_result(&my_connection);
if (res_ptr) {
while ((sqlrow = mysql_fetch_row(res_ptr))) {
printf("Fetched data...\n");
display_row();
}
}
}
}
}
3. Теперь сохраните законченный проект с именем select3.c. В заключение откомпилируйте и выполните select3, как показано далее:
$ gcc -I/usr/include/mysql select3. с -L/usr/lib/mysql -lmysqlclient -о select3
$ ./select3
Connection success
Fetched data...
1 Jenny 21
Fetched data...
2 Andrew 17
$
Итак, программа работает, несмотря на не слишком эстетически привлекательный вывод. Но вы не смогли учесть в результате возможные значения NULL
. Если вы хотите вывести более искусно отформатированные (в виде таблицы, например) данные, следует получить из MySQL данные и метаданные. Одновременно считать как данные, так и метаданные в новую структуру вы можете с помощью функции mysql_fetch_field
.
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
Вызывать эту функцию следует многократно, до тех пор, пока не будет возвращено значение NULL
, которое сигнализирует о том, что данные закончились. Далее вы можете использовать указатель на структуру данных о поле для получения сведений о столбце. Структура типа MYSQL_FIELD
определена в файле mysql.h, как показано в табл. 8.12.
Таблица 8.12
Поле в структуре типа MYSQL_FIELD |
Описание |
---|---|
char *name; |
Имя столбца в виде строки |
char *table; |
Имя таблицы, из которой получен столбец. Оно особенно полезно в запросе с использованием нескольких таблиц. Имейте в виду, что вычисляемое значение в результате, такое как MAX , будет иметь пустую строку для имени таблицы |
char *def; |
При вызове функции mysql_list_fields (которую мы не обсуждаем) это поле содержит значение в столбце по умолчанию |
enum enum_field_types type; |
Тип столбца. См. пояснения сразу после таблицы |
unsigned int length; |
Ширина столбца, заданная при определении таблицы |
unsigned int max_length; |
Если применяется функция mysql_store_result , это поле содержит длину в байтах самого длинного извлеченного значения столбца. Если применяется функция mysql_use_result , поле не задается |
unsigned int flags; |
Флаги содержат информацию об определении столбца, а не о найденных данных. у распространенных флагов очевидные значения: NOT_NULL_FLAG , PRI_KEY_FLAG , UNSIGNED_FLAG , AUTO_INCREMENT_FLAG и BINARY_FLAG . Полный список флагов можно найти в документации MySQL |
unsigned int decimals; |
Количество знаков после десятичной точки. Справедливо только для числовых полей |
Типов столбца огромное множество. Полный перечень можно найти в файле mysql_com.h и в документации.
К самым распространенным относятся следующие:
FIELD_TYPE_DECIMAL
FIELD_TYPE_LONG
FIELD_TYPE_STRING
FIELD_TYPE_VAR_STRING
Далее приведен особенно полезный макрос IS_NUM
, возвращающий значение true
, если тип поля числовой:
if (IS_NUM(myslq_field_ptr->type)) printf("Numeric type field\n");
Прежде чем обновлять вашу программу, следует упомянуть еще одну функцию:
MYSQL_FIELD_OFFSET mysql_field_seek(MYSQL_RES* result,
MYSQL_FIELD_OFFSET offset);
Ее можно использовать для переопределения текущего номера поля, который автоматически увеличивается при каждом вызове mysql_fetch_field
. Если передать нулевое смещение, вы вернетесь назад к первому столбцу.
Теперь, имея всю необходимую информацию для написания программы выборки, покажите все дополнительные данные, относящиеся к заданному столбцу.
Далее приведена программа select4.c, которую мы воспроизводим полностью, чтобы у вас был полный пример для изучения. В программе нет расширенного анализа типов столбцов, в ней только демонстрируются требуемые основные правила.
#include
#include
Интервал:
Закладка: