Нейл Мэтью - Основы программирования в Linux

Тут можно читать онлайн Нейл Мэтью - Основы программирования в Linux - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство «БХВ-Петербург», год 2009. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Основы программирования в Linux
  • Автор:
  • Жанр:
  • Издательство:
    «БХВ-Петербург»
  • Год:
    2009
  • Город:
    Санкт-Петербург
  • ISBN:
    978-5-9775-0289-4
  • Рейтинг:
    4/5. Голосов: 91
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Нейл Мэтью - Основы программирования в Linux краткое содержание

Основы программирования в Linux - описание и краткое содержание, автор Нейл Мэтью, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым.

Для начинающих Linux-программистов

Основы программирования в Linux - читать онлайн бесплатно полную версию (весь текст целиком)

Основы программирования в Linux - читать книгу онлайн бесплатно, автор Нейл Мэтью
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Теперь поищите компакт-диск и извлеките информацию из первого найденного CD:

res = find_cds("Symphony", &cd_res);

printf("Found %d cds, first has ID %d\n", res, cd_res.cd_id[0]);

res = get_cd(cd_res.cd_id[0], &cd);

printf("get_cd returned %d\n", res);

memset(&ct, 0, sizeof(ct));

res = get_cd_tracks(cd_res.cd_id[0], set);

printf("get_cd_tracks returned %d\n", res);

printf("Title: %s\n", cd.title);

i = 0;

while (i < res) {

printf("\ttrack %d is %s\n", i, ct.track[i]);

i++;

}

В заключение удалите компакт-диск:

res = delete_cd(cd_res.cd_id[0]);

printf("Delete_cd returned %d\n", res);

Затем отключитесь и завершите работу программы:

database_end();

return EXIT_SUCCESS;

}

Реализация интерфейса

Теперь более трудная часть — реализация интерфейса, описанного вами. Вся она хранится в файле app_mysql.с.

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

#include

#include

#include

#include "mysql.h"

#include "app_mysql.h"

static MYSQL my_connection;

static int dbconnected = 0;

static int get_artist_id(char *artist);

Как вы видели ранее в этой главе, подключиться к базе данных очень просто, а отключиться от нее и того проще:

int database_start(char *name, char *pwd) {

if (dbconnected) return 1;

mysql_init(&my_connection);

if (!mysql_real_connect(&my_connection, "localhost",

name, pwd, "blpcd", 0, NULL, 0)) {

fprintf(stderr, "Database connection failure: %d, %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

return 0;

}

dbconnected = 1;

return 1;

} /* database_start */

void database_end() {

if (dbconnected) mysql_close(&my_connection);

dbconnected = 0;

} /* database_end */

Начинается реальная работа благодаря функции add_cd. Вам нужны сначала несколько объявлений и санитарная проверка, Чтобы убедиться в наличии подключения к базе данных. Вы увидите ее во всех написанных функциях, доступных извне.

Напоминаем о том, что программа будет отслеживать имена исполнителей автоматически:

int add_cd(char *artist, char *title, char* catalogue, int *cd_id) {

MYSQL_RES *res_ptr;

MYSQL_ROW mysqlrow;

int res;

char is[250];

char es[250];

int artist_id = -1;

int new_cd_id = -1;

if (!dbconnected) return 0;

Далее нужно проверить, существует ли уже исполнитель, если нет, то создать его. Обо всем этом заботится функция get_artist_id, которую вы скоро увидите:

artist_id = get_artist_id(artist);

Теперь, имея artist_id, вы можете вставлять главную запись компакт-диска. Обратите внимание на применение функции mysql_escape_string, не допускающей специальных символов в названии компакт-диска.

mysql_escape_string(es, title, strlen(title));

sprintf(is,

"INSERT INTO cd(title, artist_id, catalogue) VALUES('%s', %d, '%s')",

es, artist_id, catalogue);

res = mysql_query(&my_connection, is);

if (res) {

fprintf(stderr, "Insert error %d: %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

return 0;

}

Когда вы дойдете до вставки дорожек для данного компакт-диска, вам потребуется знать ID, который использовался при вставке записи о компакт-диске. Вы сделали поле автоматически наращиваемым, поэтому база данных автоматически присвоила ID, но вам нужно явно извлечь это значение. Как было показано ранее в этой главе, сделать это можно с помощью функции LAST_INSERT_ID.

res = mysql_query(&my_connection, "SELECT LAST_INSERT_ID()");

if (res) {

printf("SELECT error: %s\n", mysql_error(&my_connection));

return 0;

} else {

res_ptr = mysql_use_result(&my_connection);

if (res_ptr) {

if ((mysqlrow = mysql_fetch_row(res_ptr))) {

sscanf(mysqlrow[0], "%d", &new_cd_id);

}

mysql_free_result(res_ptr);

}

He стоит беспокоиться о других программах-клиентах, вставляющих компакт-диски в это же время, и о возможной путанице поступающих номеров ID; СУРБД MySQL запоминает присвоенный ID для каждого подключения, поэтому, даже если другое приложение вставило компакт-диск прежде, чем вы извлекли ID, вы все равно получите номер, соответствующий вашей строке, а не строке, добавленной другим приложением.

И последнее, но не по степени важности, установите ID вновь добавленной строки и верните код успешного или аварийного завершения:

*cd_id = new_cd_id;

if (new_cd_id != -1) return 1;

return 0;

}

} /* add_cd */

Теперь посмотрите реализацию функции get_artist_id; процесс очень похож на вставку записи о компакт-диске:

/* Поиск или создание artist_id для заданной строки */

static int get_artist_id(char *artist) {

MYSQL_RES *res_ptr;

MYSQL_ROW mysqlrow;

int res;

char qs[250];

char is[250];

char es[250];

int artist_id = -1;

/* Он уже существует? */

mysql_escape string(es, artist, strlen(artist));

sprintf(qs, "SELECT id FROM artist WHERE name = '%s'", es);

res = mysql_query(&my_connection, qs);

if (res) {

fprintf(stderr, "SELECT error: %s\n", mysql_error(&my_connection));

} else {

res_ptr = mysql_store_result(&my_connection);

if (res_ptr) {

if (mysqr_num_rows(res_ptr) > 0) {

if (mysqlrow = mysql_fetch_row(res_ptr)) {

sscanf(mysqlrow[0], "%d", &artist_id);

}

}

mysql_free_result(res_ptr);

}

}

if (artist_id != -1) return artist_id;

sprintf(is, "INSERT INTO artist(name) VALUES ('%s')", es);

res = mysql_query(&my_connection, is);

if (res) {

fprintf(stderr, "Insert error %d: %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

return 0;

}

res = mysql_query(&my_connection, "SELECT LAST_INSERT_ID()");

if (res) {

printf("SELECT error: %s\n", mysql_error(&my_connection));

return 0;

} else {

res_ptr = mysql_use_result(&my_connection);

if (res_ptr) {

if ((mysqlrow = mysql_fetch_row(res_ptr))) {

sscanf(mysqlrow[0], "%d", &artist_id);

}

mysql_free_result(res_ptr);

}

}

return artist_id;

} /* get_artist_id */

Переходите к вставке информации о дорожках для вашего компакт-диска. И снова защититесь от специальных символов в названиях дорожек:

int add_tracks(struct current_tracks_st *tracks) {

int res;

char is[250];

char es[250];

int i;

if (!dbconnected) return 0;

i = 0;

while (tracks->track[i][0]) {

mysql_escape_string(es, tracks->track[i], strlen(tracks->track[i]));

sprintf(is,

"INSERT INTO track(cd_id, track_id, title) VALUES(%d, %d, '%s')",

tracks->cd_id, i + 1, es);

res = mysql_query(&my_connection, is);

if (res) {

fprintf(stderr, "Insert error %d: %s\n",

mysql_errno(&my_connection), mysql_error(&my_connection));

return 0;

}

i++;

}

return 1;

} /* add tracks */

Теперь переходите к извлечению информации о компакт-диске с заданным значением его ID. Будет применена операция объединения базы данных для извлечения ID исполнителя во время получения данных об ID диска. Это обычно хороший подход: системы управления базами данных отлично знают, как эффективно выполнять сложные запросы, поэтому никогда не пишите прикладной программный код для того, что вы можете просто попросить сделать СУРБД, передав ей запрос на языке SQL. Есть шанс сберечь собственные силы, не тратя их на написание дополнительного программного кода, и получить приложение, работающее более эффективно, разрешив СУРБД выполнить максимально возможный объем работы.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Нейл Мэтью читать все книги автора по порядку

Нейл Мэтью - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Основы программирования в Linux отзывы


Отзывы читателей о книге Основы программирования в Linux, автор: Нейл Мэтью. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x