powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / commit
23 сообщений из 23, страница 1 из 1
commit
    #32409941
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

На выходных написал программку для обновления таблички из текстового файла на с++ через ib api.

Селекты делаются нормально, но как только пытаюсь удалить(или вставить) данные, программа подвисает на операции:
isc_commit_transaction

транзакция создается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 string tpb="";
 tpb+=(char)isc_tpb_version3;
 tpb+=(char)isc_tpb_write;
 tpb+=(char)isc_tpb_read_committed;
 tpb+=(char)isc_tpb_no_rec_version;
 tpb+=(char)isc_tpb_nowait;
 isc_start_transaction(status, &fHandle,  1 , &db->fHandle, tpb.length(), (char*)tpb.c_str());
 if (status[ 0 ] ==  1  && status[ 1 ]) 
  {
   fError=FBERR_STARTTRANSACTION;
   db->showError(&status[ 0 ]);
   return;
  }

коммит делается так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 isc_commit_transaction(status, &fHandle);
 if (status[ 0 ] ==  1  && status[ 1 ]) 
  {
   fError=FBERR_COMMIT;
   fDb->showError(&status[ 0 ]);
   return;
  };


есть идеи?
причем программа один раз отработала на ура.
затем я сделал кое-какие косметические изменения(не помню какие, вроде бы не важные)
и все. работать перестала.

те же операции но через программу написанную на делфи происходят влет.
...
Рейтинг: 0 / 0
commit
    #32409943
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да, еще.
транзакция по умолчанию:
Код: plaintext
1.
 isc_start_transaction(status, &fHandle,  1 , &db->fHandle,  0 , NULL);

ничего не меняет
...
Рейтинг: 0 / 0
commit
    #32410026
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может deadlock -и?
Попробуй commit перед запросом и commit после запроса.

p.s. Я почти не использую isc_commit_transaction, просто выполняю runQuery("commit"); - пока
срабатывало как надо
...
Рейтинг: 0 / 0
commit
    #32414483
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дело вот как обстоит, довольно любопытно.

если я исполняю запрос, который не возвращает набор данных
(insert, delete etc)
а затем пытаюсь сделать
isc_dsql_fetch()
то ошибок я не получаю, зато при попытке удаления statment handle
isc_dsql_free_statement( status, &fHandle, DSQL_drop );
приложение подвисает на неопределенное время.

вот такая фишка.
думаю нужно определять тип запроса при помощи
isc_dsql_sql_info
...
Рейтинг: 0 / 0
commit
    #32414574
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k
дело вот как обстоит, довольно любопытно.

если я исполняю запрос, который не возвращает набор данных
(insert, delete etc)
а затем пытаюсь сделать
isc_dsql_fetch()
то ошибок я не получаю, зато при попытке удаления statment handle
isc_dsql_free_statement( status, &fHandle, DSQL_drop );
приложение подвисает на неопределенное время.

вот такая фишка.
думаю нужно определять тип запроса при помощи
isc_dsql_sql_info


Знаешь, я б тебе посоветовал изучить содержимое файла examples/apifull.c. Я свои классы
начал писать только после внимательного изучения примеров( судя по твоему вопросу ты туда
даже не заглядывал или заглядывал мельком), постовляемых с FB (точнее IB 6.0) + API guidе И
у меня пока (тьфу, тьфу,тьфу) еще не было серьезных проблем.

Правда для FB 1.5 надо кое-что подправить.
Для Linux:
1) Заменить
Код: plaintext
1.
2.
3.
4.
typedef struct vary {
    short          vary_length;
    char           vary_string [ 1 ];
} VARY;


на
Код: plaintext
1.
2.
3.
4.
typedef struct vary2 {
    short          vary_length;
    char           vary_string [ 1 ];
} VARY;


И компилировать так:
gcc -o apifull apifull.c -lfbclient -lcrypt
...
Рейтинг: 0 / 0
commit
    #32431932
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за подсказку, почитал, подумал.
теперь у меня работают инсерты, селекты и прочее.

по идее хранимые процедуры тоже должны работать, он не проверял.

работает почти все, кто заинтересован в посмотрении, обращайтесь в мыло:
alex_k at trk7 dot ru
...
Рейтинг: 0 / 0
commit
    #32432276
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
isc_start_transaction(status, &fHandle,  1 , &db->fHandle, tpb.length(), (char*)tpb.c_str());

С String (AnsiString) .c_str() не есть гуд. Сам накалывался на этих прЫколах:
Код: plaintext
1.
2.
3.
4.
5.
6.
AnsiString a,b;

b= "b" ;
a=b;
*b.c_str()='A';
b= "B" ; 

Внимание - вопрс: чему теперь равняется a?


100% гарантию дает старый добрый массив.
_________________
"Hello, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
commit
    #32432315
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
внимание вопрос.
причем сдесь AnsiString?
...
Рейтинг: 0 / 0
commit
    #32432481
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Со string не работал - врать не буду. Просто предположил, что м.б. имеет место указанный глюк.
_________________
"Hello, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
commit
    #32432496
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на характер проверил
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
   std::string a,b;
   char *ptr;

   b= "b" ;
   a=b;
   ptr=(char *)b.c_str();
   *ptr='A';
   b= "B" ;

теже яйца, только в профиль...
_________________
"Hello, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
commit
    #32432516
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ладно, поверю тебе не проверяя.
и что делать? посыпать голову пеплом? пусть пока так будет, появится более лучший вариант, переделаю
...
Рейтинг: 0 / 0
commit
    #32432559
Фотография Ex_Soft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зачем пеплом-то?

Я просто выделяю массив char'ов. Потом туда strcpy то что нужно... Далее действуем по правилу великого чешского ученого Буравчика

_________________
"Hello, word!" - 17 errors 56 warnings
...
Рейтинг: 0 / 0
commit
    #32433628
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alex_k
>по идее хранимые процедуры тоже должны работать, он не проверял.
Select сработает однозначно, а вот для execute procedure надо немного по другому. Я сделал так:
if (statement_type==isc_info_sql_stmt_exec_procedure)
isc_dsql_execute2(status, &trans, &stmt, SQL_DIALECT_V6, NULL,sqlda);

(statement_type получено ранее с помощью isc_dsql_sql_info)

Если все нормально, то структура sqlda содержит значения полей, возвращаемые execute procedure

Если ты сделал на основе apifull, то есть там еще один подводный камень:
Размер всех данных возвращаемых isc_dsql_fetch не должен превышать 1024 байт, поскольку там
используется довольно оригинальный метод выделения памяти под sqldata: вместо более простого
malloc/free для каждого sqldata, там используется один общий buffer[1024] . Поэтому если
использовать данный метод, то, мне кажется, лучше определить динамический массив и в
случае необходимости делать realloc.
...
Рейтинг: 0 / 0
commit
    #32433995
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2somebody

может стоит опубликовать исходники?
обсудим, что к чему, может кому пригодится...
...
Рейтинг: 0 / 0
commit
    #32437049
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alex_k
>может стоит опубликовать исходники?
>обсудим, что к чему, может кому пригодится...

Прошу прощения за долгое молчание - киндеры мои приболели, не до инета
было.

Насчет исходников - если есть где опубликовать или просто интересно
взглянуть - вышлю, мне не жалко. А вот обсуждать не знаю чего. Для меня
это уже давно пройденный этап. Да и IB/FB это у меня как дополнительная
нагрузка + кормушка, а так специализация у меня несколько другая.
...
Рейтинг: 0 / 0
commit
    #32438931
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2alex_k
Сырцы здесь Проверялось только для Линукс. Ссылка активна максимум 2 недели
...
Рейтинг: 0 / 0
commit
    #32438942
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотрел, спасибо.
можно я твой trim дюзну?
ну и вообще :-) по желанию если что понравится?
...
Рейтинг: 0 / 0
commit
    #32439154
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex_k
можно я твой trim дюзну?
ну и вообще :-) по желанию если что понравится?

Так для того и выложил, чтобы "дюзал" все что понравится
А trim там случайно оказался - забыл убрать, когда вставлял фрагмент из другой проги.
Ну и есть там кое-какие баги/полубаги(мне пока жить не мешают) - если нужно, могу список
набросать.
...
Рейтинг: 0 / 0
commit
    #32440706
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
список не надо, я простым копированием не занимаюсь.
пока не пойму, использовать не буду, но вообще интересно, щас во всю пересматриваю свой код :-)
...
Рейтинг: 0 / 0
commit
    #32441289
somebody
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну удачи тебе. Сам свои сырцы выкладывать бушь?
...
Рейтинг: 0 / 0
commit
    #32441297
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
позже :-)
когда буду хоть чуть-чуть доволен результатами.


у меня оказывается совсем нет параметров :-) как без них выкладывать?
...
Рейтинг: 0 / 0
commit
    #32450522
alex_k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
очень долго думал зачем менять
Код: plaintext
1.
2.
3.
4.
typedef struct vary {
    short          vary_length;
    char           vary_string [ 1 ];
} VARY;

на
Код: plaintext
1.
2.
3.
4.
typedef struct vary2{
    short          vary_length;
    char           vary_string [ 1 ];
} VARY;

в линуксе

так и не понял...

у меня нормально работает и под виндой vc6 и под фришкой gcc 2.95 без этих изменений
...
Рейтинг: 0 / 0
commit
    #32452221
Somebody2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2alex_k
Для начала уточни что у именно тебя работает Я имел ввиду только apifull.c из примеров и не
работоспособность, а возможность компиляции. Так вот, apifull.c без этих изменений компилиться
не должен в принципе. Данная структура vary нужна для работы с varchar-ами . С FB 1.5 эта
структура определена в ibase.h и поскольку она также определена в apifull.c то имеем "redefinition of
`struct vary'" . В принципе можно было заменить на

typedef struct vary VARY -

просто я тогда поленился заглянуть в ibase.h и не знал, что в ibase.h и в apifull.c эта структура
определена почти одинаково.

Короче говоря, имелось ввиду то, что эти изменения нужны только для успешной компиляции
apifull.c (чтобы избежать ошибки redefinition of `struct vary'). Прошу прощения если это не было
ясно сразу. ;-)
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / commit
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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