Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Firebird, InterBase Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Добрый день всем!

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


Простите.. по парюсь со следующем: где взять исходники с примерами на голом СИ? Не знаю кому как, но мне как-то легче воспринимается. А гугление на вскидку, выдает все что угодно только не эти экзэмплы.
10 июн 20, 11:55    [22148634]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 10575
pietro_888,

в корневой папке Firebird examples/api/
10 июн 20, 12:07    [22148653]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Роюсь вот в примерах.. Не прошу решить задчу) прошу подскажите с общим курсом.

Был у меня проектик, на чистом С. Мне так надо. Люблю этот язык, и кодить на нем люблю.. и быстродействие фантастическое.
В том проекте я слепил взаимодействие с 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';

Т.е прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку "среднего уровня" .
11 июн 20, 13:13    [22149331]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

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

11 июн 20, 13:34    [22149341]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Так!

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

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 ?
11 июн 20, 14:03    [22149361]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

pietro_888
прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку
"среднего уровня" .

Хочешь - сооружай. Не хочешь - не сооружай. Раз у тебя "хайлоад" - придётся принять во
внимание какой процент быстродействия твоя прослойка сожрёт во имя "не знаю заранее и
знать не хочу".

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:03    [22149362]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

pietro_888
В каком месте во всей этой системе запросов происходит выделение фактического объема
памяти под результат запроса?
Допустим 818 строк. или 1000.

Результат получается и обрабатывается построчно. Нормальные люди не выделяют память под
весь result set именно потому, что он может быть и 100500 записей, что сожрёт всё ОЗУ и
обрушит программу с ООМ.

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:06    [22149365]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
pietro_888,

в качестве примеров можно посмотреть еще исходники IBX и FIBPlus. Они на pascal, но будет понятно.
Из C - IBPP, и что-то там еще. Посмотрел у себя на сайте - там какое-то старье, надо бы подновить информацию...
11 июн 20, 14:10    [22149369]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

kdv
в качестве примеров можно посмотреть еще исходники IBX и FIBPlus.

Это если только в качестве примеров "как делать не нужно, хоть и можно".

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:18    [22149374]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
>>во имя "не знаю заранее и знать не хочу".
Согласен с Вами, это несколько эмоционально написал.

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

>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
11 июн 20, 14:32    [22149385]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

pietro_888
Т.е при каждом isc_dsql_fetch запрос к базе?

Получил запись - сделал с ней что хотел - выкинул - пошёл за следующей.

Posted via ActualForum NNTP Server 1.5

11 июн 20, 14:35    [22149390]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
pietro_888
>>Результат получается и обрабатывается построчно.
Не понял.
Т.е при каждом isc_dsql_fetch запрос к базе?
Один раз выделяется буфер под одну запись, а потом в этот буфер делаем последовательные фетчи.

После обработки всех записей буфер освобождается
11 июн 20, 14:36    [22149391]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
Дошло, понял.
У меня С-код будет либо на одной машине с FB крутится либо если на разных то соединяться прямым гигабитным проводом.
Так что вопросы траффика не стоит..

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

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

Товарищи спасибо за дружественность, с вашей помошью кое что для начала понял, для старта.
11 июн 20, 14:45    [22149394]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 11914
pietro_888
Так что вопросы траффика не стоит..
Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
pietro_888
Получается, память так-таки выделяется, но на сервере??
Подозреваю, что только для указателей на конкретные записи
11 июн 20, 14:50    [22149398]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
pietro_888
Member

Откуда:
Сообщений: 6
>>Зачем выделять память под 1000 записей, если одновременно идет работа только с одной?
Да ХЗ если честно.. привык мыслить в таком контексте. Надо отправить в аппарат 1000 идентов - извлек 1000 и пулеметной очередью выпустил по сети. А действительно нефиг в память копировать.
11 июн 20, 14:54    [22149400]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
pietro_888
Получается, память так-таки выделяется, но на сервере??

- на сервере - зависит от запроса (метода доступа, которым он выполняется).
- дальше сервер отправляет клиенту пакеты по сети. Обычно - сколько записей влезет в пакет, столько и влезет.
- клиентская часть получает записи этими же пакетами. И на каждый fetch из API прикидывается, что получает запись с сервера, а на самом деле достает очередную из пакета. Пакет кончился - принимает следующий пакет, и т.д.

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

На клиенте складывать записи в буфер или не складывать - зависит от задачи. Если обработка построчная, можно не складывать. Если надо по выборке елозить туда-сюда (например, показывать клиенту), значит надо буферизировать.
как-то так.
11 июн 20, 15:52    [22149439]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Tonal
Member

Откуда: Новосибирск
Сообщений: 187
C mysql есть 2 режима работы курсора.
Первый - драйвер вычитывает весть резалтсет на клиента, распределяя под это память самостоятельно, а потом отдаёт по стольку записей, сколько запросил, но уже с клиента.
И Второй - когда результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.

Естественно есть большие отличия что и как именно хранится на сервере у мускула и птички в этом режиме.
Но с точки зрения клиента грубо можно рассматривать примерно так.
12 июн 20, 17:42    [22149905]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Ну да, у мускуля просто выбора нет с историческим отсутствием транзакций и блокировочной
архитектурой: не вычитаешь весь резалт-сет, он либо будет неконсистентным, либо поставит
весь сервер колом.

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

Posted via ActualForum NNTP Server 1.5

12 июн 20, 17:53    [22149910]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
hvlad
Member

Откуда:
Сообщений: 10961
Tonal
результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет.
Вот именно по второму режиму и работает птичка.
Конечно нет.
12 июн 20, 18:00    [22149911]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
Tonal
Вот именно по второму режиму и работает птичка.

что за фантазии...
драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы.
Как там конкретный .net драйвер написан - это его личное дело.
"Птичка" к драйверу вообще никаким боком, в данном случае.
13 июн 20, 03:17    [22150054]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4221
kdv
Tonal
Вот именно по второму режиму и работает птичка.

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


Не знаю, что за "брифкейз", но речь шла (я так понял) о том, что клиент (isc api fbclient) заставляет за каждой записью делать отдельный запрос на сервер, и нет возможности сделать запрос "Сервер, верни мне сразу 100 записей резалтсета (или сколько есть) одним пакетом!"
14 июн 20, 22:08    [22150596]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50418

Не дело API лезть в низкоуровневый обмен клиента и сервера. Программа должна просто
спрашивать "дай мне следующую запись" (или "дай мне Х записей"), а что при этом происходит
между клиентом и сервером это их интимное дело.

Posted via ActualForum NNTP Server 1.5

14 июн 20, 22:14    [22150603]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4221
Dimitry Sibiryakov
что при этом происходит
между клиентом и сервером это их интимное дело.
Это, конечно, красиво выглядит и удобно.
Но управлять размерами буфферов, т.е. памятью, иногда очень полезно и наверху.
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера стащить все тысячи и тысячи записей для отчёта, чем делать тысячи фетчей (которые вызовут хз сколько сетевых запросов).
На медленной сети это особенно важно. Через спутник, например.
14 июн 20, 22:24    [22150611]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
YuRock
Member

Откуда: Донецк
Сообщений: 4221
YuRock
Бывает гораздо лучше выделить десяток мегабайт
Программист часто способен заранее довольно точно предсказать размер резалтсета и в записях и в байтах.
Клиент же - нифига. Он не знает, сколько записей может быть.
14 июн 20, 22:27    [22150614]     Ответить | Цитировать Сообщить модератору
 Re: Ищу примеры на С  [new]
kdv
Member

Откуда: iBase.ru
Сообщений: 28886
YuRock
Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера

слишком много вас таких, желающий вытащить "десяток мегабайт". Никакой памяти не напасёшся.
А потом, например, при SORT создается временный файл, который ОС пытается разместить в памяти полностью.
А ты его затем утаскиваешь.
Впрочем, заканчивается это всё точно так же - приходит 10-20 таких клиентов, каждому подай отчет 2-5 гиг, в результате память кончается, и всё это тащится на клиента с диска. А потом жалуются.
14 июн 20, 22:36    [22150620]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Firebird, InterBase Ответить