|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Добрый день всем! Для нового проекта решил освоить FB. Вопросы настройки сервера решились быстро (debian8), код пишу на чистом С в аналогичной среде на debian. Пакеты содержащие все необходимое (на тему ibase.h и libfbclient.so) проинсталил. Простите.. по парюсь со следующем: где взять исходники с примерами на голом СИ? Не знаю кому как, но мне как-то легче воспринимается. А гугление на вскидку, выдает все что угодно только не эти экзэмплы. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 11:55 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888, в корневой папке Firebird examples/api/ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2020, 12:07 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Роюсь вот в примерах.. Не прошу решить задчу) прошу подскажите с общим курсом. Был у меня проектик, на чистом С. Мне так надо. Люблю этот язык, и кодить на нем люблю.. и быстродействие фантастическое. В том проекте я слепил взаимодействие с 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.06.2020, 13:13 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
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.06.2020, 13:34 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Так! Вас понял. Вот из того же экземпла: 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.06.2020, 14:03 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888прежде чем я смогу нормально работать с проектом, придется соорудить свою прослойку "среднего уровня" . Хочешь - сооружай. Не хочешь - не сооружай. Раз у тебя "хайлоад" - придётся принять во внимание какой процент быстродействия твоя прослойка сожрёт во имя "не знаю заранее и знать не хочу". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:03 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888В каком месте во всей этой системе запросов происходит выделение фактического объема памяти под результат запроса? Допустим 818 строк. или 1000. Результат получается и обрабатывается построчно. Нормальные люди не выделяют память под весь result set именно потому, что он может быть и 100500 записей, что сожрёт всё ОЗУ и обрушит программу с ООМ. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:06 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888, в качестве примеров можно посмотреть еще исходники IBX и FIBPlus. Они на pascal, но будет понятно. Из C - IBPP, и что-то там еще. Посмотрел у себя на сайте - там какое-то старье, надо бы подновить информацию... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:10 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
kdvв качестве примеров можно посмотреть еще исходники IBX и FIBPlus. Это если только в качестве примеров "как делать не нужно, хоть и можно". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:18 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
>>во имя "не знаю заранее и знать не хочу". Согласен с Вами, это несколько эмоционально написал. >>Нормальные люди не выделяют память под весь result set А я думал.. под это надо представлять с каким ОЗУ имеешь дело и использовать если что опцию LIMIT в запросе. Конечно ПО тестируется на реальном железе. >>Результат получается и обрабатывается построчно. Не понял. Т.е при каждом isc_dsql_fetch запрос к базе? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:32 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888Т.е при каждом isc_dsql_fetch запрос к базе? Получил запись - сделал с ней что хотел - выкинул - пошёл за следующей. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:35 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888 >>Результат получается и обрабатывается построчно. Не понял. Т.е при каждом isc_dsql_fetch запрос к базе? После обработки всех записей буфер освобождается ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:36 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Дошло, понял. У меня С-код будет либо на одной машине с FB крутится либо если на разных то соединяться прямым гигабитным проводом. Так что вопросы траффика не стоит.. Далее. SELECT в данных примерах делается в обертке транзакции. Результат атомарен пока я не закрою транзакцию? Получается, память так-таки выделяется, но на сервере?? Товарищи спасибо за дружественность, с вашей помошью кое что для начала понял, для старта. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:45 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888 Так что вопросы траффика не стоит.. pietro_888 Получается, память так-таки выделяется, но на сервере?? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:50 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
>>Зачем выделять память под 1000 записей, если одновременно идет работа только с одной? Да ХЗ если честно.. привык мыслить в таком контексте. Надо отправить в аппарат 1000 идентов - извлек 1000 и пулеметной очередью выпустил по сети. А действительно нефиг в память копировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 14:54 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
pietro_888Получается, память так-таки выделяется, но на сервере?? - на сервере - зависит от запроса (метода доступа, которым он выполняется). - дальше сервер отправляет клиенту пакеты по сети. Обычно - сколько записей влезет в пакет, столько и влезет. - клиентская часть получает записи этими же пакетами. И на каждый fetch из API прикидывается, что получает запись с сервера, а на самом деле достает очередную из пакета. Пакет кончился - принимает следующий пакет, и т.д. Бывают запросы, когда в пакете по 1 записи. Но это специфика. На клиенте складывать записи в буфер или не складывать - зависит от задачи. Если обработка построчная, можно не складывать. Если надо по выборке елозить туда-сюда (например, показывать клиенту), значит надо буферизировать. как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.06.2020, 15:52 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
C mysql есть 2 режима работы курсора. Первый - драйвер вычитывает весть резалтсет на клиента, распределяя под это память самостоятельно, а потом отдаёт по стольку записей, сколько запросил, но уже с клиента. И Второй - когда результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет. Вот именно по второму режиму и работает птичка. Естественно есть большие отличия что и как именно хранится на сервере у мускула и птички в этом режиме. Но с точки зрения клиента грубо можно рассматривать примерно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 17:42 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Ну да, у мускуля просто выбора нет с историческим отсутствием транзакций и блокировочной архитектурой: не вычитаешь весь резалт-сет, он либо будет неконсистентным, либо поставит весь сервер колом. Версионные движки уже появились, но от наследия уже не избавиться. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 17:53 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Tonal результат выполнения остаётся на сервере, и за каждой записью драйвер туда отдельно лезет. Вот именно по второму режиму и работает птичка. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.06.2020, 18:00 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
TonalВот именно по второму режиму и работает птичка. что за фантазии... драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы. Как там конкретный .net драйвер написан - это его личное дело. "Птичка" к драйверу вообще никаким боком, в данном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2020, 03:17 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
kdv TonalВот именно по второму режиму и работает птичка. что за фантазии... драйвер кэширует столько данных, сколько ему надо. Например, в IBX/FIBPlus есть компоненты, которые вычитывают по одной записи, а есть компоненты, которые буферизируют считываемые данные. А есть технология брифкейз, когда ClientDataSet вообще сразу вычитывает весь резалтсет с сервера. Обычно так работают stateless-системы. Как там конкретный .net драйвер написан - это его личное дело. "Птичка" к драйверу вообще никаким боком, в данном случае. Не знаю, что за "брифкейз", но речь шла (я так понял) о том, что клиент (isc api fbclient) заставляет за каждой записью делать отдельный запрос на сервер, и нет возможности сделать запрос "Сервер, верни мне сразу 100 записей резалтсета (или сколько есть) одним пакетом!" ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2020, 22:08 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Не дело API лезть в низкоуровневый обмен клиента и сервера. Программа должна просто спрашивать "дай мне следующую запись" (или "дай мне Х записей"), а что при этом происходит между клиентом и сервером это их интимное дело. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2020, 22:14 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov что при этом происходит между клиентом и сервером это их интимное дело. Но управлять размерами буфферов, т.е. памятью, иногда очень полезно и наверху. Бывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера стащить все тысячи и тысячи записей для отчёта, чем делать тысячи фетчей (которые вызовут хз сколько сетевых запросов). На медленной сети это особенно важно. Через спутник, например. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2020, 22:24 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
YuRock Бывает гораздо лучше выделить десяток мегабайт Клиент же - нифига. Он не знает, сколько записей может быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2020, 22:27 |
|
Ищу примеры на С
|
|||
---|---|---|---|
#18+
YuRockБывает гораздо лучше выделить десяток мегабайт и одним пакетом с сервера слишком много вас таких, желающий вытащить "десяток мегабайт". Никакой памяти не напасёшся. А потом, например, при SORT создается временный файл, который ОС пытается разместить в памяти полностью. А ты его затем утаскиваешь. Впрочем, заканчивается это всё точно так же - приходит 10-20 таких клиентов, каждому подай отчет 2-5 гиг, в результате память кончается, и всё это тащится на клиента с диска. А потом жалуются. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2020, 22:36 |
|
|
start [/forum/topic.php?fid=40&msg=39968223&tid=1560328]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 279ms |
total: | 429ms |
0 / 0 |