Чтение из файла в Blob посредством API

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
sunduk4
Сообщения: 18
Зарегистрирован: 02 май 2006, 13:45

Чтение из файла в Blob посредством API

Сообщение sunduk4 » 02 май 2006, 14:32

Пытаюсь прочитать данные из файла в blob -

Код: Выделить всё

    if (isc_dsql_allocate_statement(status, &DB, &blb_stmt))
    {
        ERREXIT(status, 1)
    }

   char    blb_select[1000] = "update table set blobfield = ? where id = 1"; 

               blb_sqlda = (XSQLDA *) malloc(XSQLDA_LENGTH (1));
               blb_sqlda->sqln = 1;
               blb_sqlda->sqld = 1;
               blb_sqlda->version = 1;

               blb_sqlda->sqlvar[0].sqldata = (char *) &blob_id;
               blb_sqlda->sqlvar[0].sqltype = SQL_BLOB;
               blb_sqlda->sqlvar[0].sqllen = sizeof(ISC_QUAD);


             isc_create_blob2(status,
                              &DB,
                              &trans,
                              &blob_handle,
                              &blob_id, 
                              0,
                              NULL 
             );

             left_count = lposition - fposition;

             while (left_count > 0)
               {
                 if (left_count < 16384)
                   {
                     read_count = left_count;
                     left_count = 0;
                   }
                 else
                   {
                     read_count = 16384;
                     left_count = left_count - 16384;
                   }
                 fread(blob_segment, sizeof(char), read_count, bstream);

                 isc_put_segment(status,
                                 &blob_handle,
                                 read_count,
                                 blob_segment
                 );

                 if (status[0] == 1 &&status[1])
                    {
                      ERREXIT(status, 1);
                    }
               };


               if (isc_dsql_execute_immediate(status, &DB, &trans, 0, blb_select, 1, blb_sqlda))
               {
                  ERREXIT(status, 1)
               }


              isc_close_blob(status,&blob_handle);
Ошибки нет, данные из файла читаются, а в блобе - пусто. Подскажите, пожалуйста, что не так?

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 02 май 2006, 14:55

А может стоит isc_close_blob() вызывать повыше - до использования в запросе?..

sunduk4
Сообщения: 18
Зарегистрирован: 02 май 2006, 13:45

Сообщение sunduk4 » 02 май 2006, 15:21

Сделал так -

Код: Выделить всё


              isc_close_blob(status,&blob_handle); 


               if (isc_dsql_execute_immediate(status, &DB, &trans, 0, blb_select, 1, blb_sqlda)) 
               { 
                  ERREXIT(status, 1) 
               } 

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

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 03 май 2006, 07:56

Получается что ты как-то неправильно обрабатываешь блобы с изображениями.

sunduk4
Сообщения: 18
Зарегистрирован: 02 май 2006, 13:45

Сообщение sunduk4 » 03 май 2006, 09:43

Пишу блоб из базы в файл вот таким образом -

Код: Выделить всё


    FILE                        *bstream;

                             blob_id = *(ISC_QUAD *) (chn_sqlda->sqlvar[chn_i].sqldata);
                             fposition = ftell(bstream);
                             isc_open_blob2(
                                            status,
                                            &DB,
                                            &trans,
                                            &blob_handle,
                                            &blob_id, 
                                            0,
                                            NULL
                             );

                             blob_stat = isc_get_segment(
                                            status,
                                            &blob_handle, 
                                            &actual_seg_len,
                                            sizeof(blob_segment),
                                            blob_segment
                             );


                             while (blob_stat == 0 ||status[1] == isc_segment)
                             {
                                blob_stat =isc_get_segment(status,
                                                           &blob_handle,
                                                           &actual_seg_len,
                                                           sizeof(blob_segment),
                                                           blob_segment
                                );

                               fwrite(blob_segment, strlen(blob_segment), 1, bstream);

                             };
                             isc_close_blob(status,&blob_handle);
в один файл льется все, и текст и изображения, наружу выдаются первая и последняя позиции в файле, куда записались данные из блоба. по ним потом соответственно идет чтение.

Dimitry Sibiryakov
Заслуженный разработчик
Сообщения: 1436
Зарегистрирован: 15 сен 2005, 09:05

Сообщение Dimitry Sibiryakov » 03 май 2006, 13:21

strlen(blob_segment)?????
Ну и кто ты после этого? Нормальные люди использовали бы actual_seg_len, причем начинали запись в файл не со второго сегмента а с первого.

sunduk4
Сообщения: 18
Зарегистрирован: 02 май 2006, 13:45

Сообщение sunduk4 » 03 май 2006, 14:14

Это в принципе моя первая программа на C, поэтому попрошу сильно больно не пинать..
Запись в файл исправил -

Код: Выделить всё

                             blob_id = *(ISC_QUAD *) (chn_sqlda->sqlvar[chn_i].sqldata);
                             fposition = ftell(bstream);
                             isc_open_blob2(
                                            status,
                                            &DB,
                                            &trans,
                                            &blob_handle,
                                            &blob_id,
                                            0,                                            
                                            NULL
                             );

                             blob_stat = isc_get_segment(
                                            status,
                                            &blob_handle,
                                            &actual_seg_len,
                                            sizeof(blob_segment),
                                            blob_segment
                             );

                             fwrite(blob_segment, actual_seg_len, 1, bstream);

                             while (blob_stat == 0 ||status[1] == isc_segment)
                             {
                                blob_stat =isc_get_segment(status,
                                                           &blob_handle,
                                                           &actual_seg_len,
                                                           sizeof(blob_segment),
                                                           blob_segment
                                );

                                fwrite(blob_segment, actual_seg_len, 1, bstream);

                             };
похоже я еще при чтении с fread перемудрил.. в файле виден заголовок блоба, тип содержимого, а при чтении все равно получаю пустоту..

Ответить