powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ищу примеры на С
25 сообщений из 65, страница 1 из 3
Ищу примеры на С
    #39967787
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день всем!

Для нового проекта решил освоить FB. Вопросы настройки сервера решились быстро (debian8), код пишу на чистом С в аналогичной среде на debian. Пакеты содержащие все необходимое (на тему ibase.h и libfbclient.so) проинсталил.


Простите.. по парюсь со следующем: где взять исходники с примерами на голом СИ? Не знаю кому как, но мне как-то легче воспринимается. А гугление на вскидку, выдает все что угодно только не эти экзэмплы.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39967798
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888,

в корневой папке Firebird examples/api/
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968215
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Роюсь вот в примерах.. Не прошу решить задчу) прошу подскажите с общим курсом.

Был у меня проектик, на чистом С. Мне так надо. Люблю этот язык, и кодить на нем люблю.. и быстродействие фантастическое.
В том проекте я слепил взаимодействие с MySQL. Вот что мне нравилось, так это простота несмотря на "низкоуровневость".

Сначала делаю SELECT, потом:
res = mysql_store_result(mysql);
numrows = mysql_num_rows(res);
numfields = mysql_num_fields(res);

И уже все понятно: сколько строк.. полей, и мне СЛАВА БОГУ ничего явно не требовалось указывать, выделять память вручную.
Разворачивай себе.. пока не упрешься в конец цикла по numrows или numfields, а память выделяется автоматом сколько надо при выполнении запроса.

Ну типа:
printf("%s" , sqlrow[n]); - и всего делов, грубо говоря. Ну, по задаче..

В Firebird мы полезли ради раздаваемых по клиентским приложениям сигналам по установке триггеров.
Моя часть на том же С. Т.к - быстродействие, сооружаем hi-load.

То что я туплю пока.. это абсолютно точно. Несколько дней потуплю еще. Но подскажите прямо - это я туплю, или написание С-кода на API напоминает сборку на ассемблере?? Я уже в паре мест нашел требование вручную указать размер массива, т.е его надо сначала спросить у базы, т.к я не знаю заранее и знать не хочу) размерность таблицы. Ну точнее хочу, но абсолютно не хочу переписывать в 100 местах потом код при модификации самой таблицы..

Ну или.. опять таки я возможно туплю но в найденном экземпле присутствует предварительное выделение памяти под данные, напр.
sqlda->sqlvar[2].sqldata = (char *) phone_ext;
и потом еще вручную нуль-терминировать конец строки:
phone_ext[sqlda->sqlvar[2].sqllen] = '\0';

Т.е прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку "среднего уровня" .
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968223
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888опять таки я возможно туплю но в найденном экземпле присутствует предварительное выделение
памяти под данные, напр.
sqlda->sqlvar[2].sqldata = (char *) phone_ext;
и потом еще вручную нуль-терминировать конец строки:
phone_ext[sqlda->sqlvar[2].sqllen] = '\0';

ISC API и его примеры рассчитаны на то, что программа знает какие поля в базе. Поэтому
если у тебя в базе поле "PHONE_EXT CHAR(10)", ты в программе просто объявляешь "char
phone_ext[10];" и не паришься ни с каким терминированием. После этого вызов
isc_dsql_fetch() автоматически заполняет твои переменные данными и ты работаешь с этими
переменными, не тратя времени на дополнительные обращения к API для получения собственно
данных.

PS: MySQL API тоже так умеет, просто не каждый дочитает до нужного места.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968239
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так!

Вас понял. Вот из того же экземпла:

while ((fetch_stat = isc_dsql_fetch(status, &stmt, 1, sqlda)) == 0)

//тут куча printf по этой строке

isc_dsql_fetch - извлекает одну строку. Так ведь? Вероятно так же как аналогичные *fetch* в MySQL.

Ранее я делаю
sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH(3)); - в рассчете допустим, что я точно знаю что хочу получить 3 поля.

Но вот чего я не могу знать в общем случае в принципе, так это сколько будет строк.
Более того, 2 последовательных одинаковых SELECTa могут вернуть разное количкство строк, т.к HI LOAD. (реально у меня 2-15 транзакций в секунду).

В каком месте во всей этой системе запросов происходит выделение фактического объема памяти под результат запроса?
Допустим 818 строк. или 1000.
В момент isc_dsql_execute ?
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968240
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку
"среднего уровня" .

Хочешь - сооружай. Не хочешь - не сооружай. Раз у тебя "хайлоад" - придётся принять во
внимание какой процент быстродействия твоя прослойка сожрёт во имя "не знаю заранее и
знать не хочу".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968243
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888В каком месте во всей этой системе запросов происходит выделение фактического объема
памяти под результат запроса?
Допустим 818 строк. или 1000.

Результат получается и обрабатывается построчно. Нормальные люди не выделяют память под
весь result set именно потому, что он может быть и 100500 записей, что сожрёт всё ОЗУ и
обрушит программу с ООМ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968245
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888,

в качестве примеров можно посмотреть еще исходники IBX и FIBPlus. Они на pascal, но будет понятно.
Из C - IBPP, и что-то там еще. Посмотрел у себя на сайте - там какое-то старье, надо бы подновить информацию...
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968250
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvв качестве примеров можно посмотреть еще исходники IBX и FIBPlus.

Это если только в качестве примеров "как делать не нужно, хоть и можно".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968259
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>во имя "не знаю заранее и знать не хочу".
Согласен с Вами, это несколько эмоционально написал.

>>Нормальные люди не выделяют память под весь result set
А я думал.. под это надо представлять с каким ОЗУ имеешь дело и использовать если что опцию LIMIT в запросе.
Конечно ПО тестируется на реальном железе.

>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968263
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888Т.е при каждом isc_dsql_fetch запрос к базе?

Получил запись - сделал с ней что хотел - выкинул - пошёл за следующей.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968264
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
Один раз выделяется буфер под одну запись, а потом в этот буфер делаем последовательные фетчи.

После обработки всех записей буфер освобождается
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968267
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дошло, понял.
У меня С-код будет либо на одной машине с FB крутится либо если на разных то соединяться прямым гигабитным проводом.
Так что вопросы траффика не стоит..

Далее. SELECT в данных примерах делается в обертке транзакции.
Результат атомарен пока я не закрою транзакцию?

Получается, память так-таки выделяется, но на сервере??

Товарищи спасибо за дружественность, с вашей помошью кое что для начала понял, для старта.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968271
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888
Так что вопросы траффика не стоит..
Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
pietro_888
Получается, память так-таки выделяется, но на сервере??
Подозреваю, что только для указателей на конкретные записи
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968273
pietro_888
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>>Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
Да ХЗ если честно.. привык мыслить в таком контексте. Надо отправить в аппарат 1000 идентов - извлек 1000 и пулеметной очередью выпустил по сети. А действительно нефиг в память копировать.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968299
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pietro_888Получается, память так-таки выделяется, но на сервере??
- на сервере - зависит от запроса (метода доступа, которым он выполняется).
- дальше сервер отправляет клиенту пакеты по сети. Обычно - сколько записей влезет в пакет, столько и влезет.
- клиентская часть получает записи этими же пакетами. И на каждый fetch из API прикидывается, что получает запись с сервера, а на самом деле достает очередную из пакета. Пакет кончился - принимает следующий пакет, и т.д.

Бывают запросы, когда в пакете по 1 записи. Но это специфика.

На клиенте складывать записи в буфер или не складывать - зависит от задачи. Если обработка построчная, можно не складывать. Если надо по выборке елозить туда-сюда (например, показывать клиенту), значит надо буферизировать.
как-то так.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968654
Фотография Tonal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
C mysql есть 2 режима работы курсора.
Первый - драйвер вычитывает весть резалтсет на клиента, распределяя под это память самостоятельно, а потом отдаёт по стольку записей, сколько запросил, но уже с клиента.
И Второй - когда результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.

Естественно есть большие отличия что и как именно хранится на сервере у мускула и птички в этом режиме.
Но с точки зрения клиента грубо можно рассматривать примерно так.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, у мускуля просто выбора нет с историческим отсутствием транзакций и блокировочной
архитектурой: не вычитаешь весь резалт-сет, он либо будет неконсистентным, либо поставит
весь сервер колом.

Версионные движки уже появились, но от наследия уже не избавиться.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968659
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Tonal
результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.
Конечно нет.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39968740
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TonalВот именно по второму режиму и работает птичка.
что за фантазии...
драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы.
Как там конкретный .net драйвер написан - это его личное дело.
"Птичка" к драйверу вообще никаким боком, в данном случае.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39969103
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
TonalВот именно по второму режиму и работает птичка.

что за фантазии...
драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы.
Как там конкретный .net драйвер написан - это его личное дело.
"Птичка" к драйверу вообще никаким боком, в данном случае.

Не знаю, что за "брифкейз", но речь шла (я так понял) о том, что клиент (isc api fbclient) заставляет за каждой записью делать отдельный запрос на сервер, и нет возможности сделать запрос "Сервер, верни мне сразу 100 записей резалтсета (или сколько есть) одним пакетом!"
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39969107
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не дело API лезть в низкоуровневый обмен клиента и сервера. Программа должна просто
спрашивать "дай мне следующую запись" (или "дай мне Х записей"), а что при этом происходит
между клиентом и сервером это их интимное дело.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39969111
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
что при этом происходит
между клиентом и сервером это их интимное дело.
Это, конечно, красиво выглядит и удобно.
Но управлять размерами буфферов, т.е. памятью, иногда очень полезно и наверху.
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера стащить все тысячи и тысячи записей для отчёта, чем делать тысячи фетчей (которые вызовут хз сколько сетевых запросов).
На медленной сети это особенно важно. Через спутник, например.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39969112
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Бывает гораздо лучше выделить десяток мегабайт
Программист часто способен заранее довольно точно предсказать размер резалтсета и в записях и в байтах.
Клиент же - нифига. Он не знает, сколько записей может быть.
...
Рейтинг: 0 / 0
Ищу примеры на С
    #39969115
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockБывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера
слишком много вас таких, желающий вытащить "десяток мегабайт". Никакой памяти не напасёшся.
А потом, например, при SORT создается временный файл, который ОС пытается разместить в памяти полностью.
А ты его затем утаскиваешь.
Впрочем, заканчивается это всё точно так же - приходит 10-20 таких клиентов, каждому подай отчет 2-5 гиг, в результате память кончается, и всё это тащится на клиента с диска. А потом жалуются.
...
Рейтинг: 0 / 0
25 сообщений из 65, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Ищу примеры на С
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]