powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / знак переноса строки?
25 сообщений из 76, страница 2 из 4
знак переноса строки?
    #36071099
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery
если не пользоваться isql с только что найденной тобой ошибкой

Это не ошибка, это фича. isql приводит переводы строки перед отправкой в
БД и после получения. Отсюда, кстати, растут ноги удвоения возврата
каретки, на которое тут жаловались недавно: isql несколько неправильно
обращается с исходниками, который в БД загнаны другими инструментами.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071175
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery...
Ещё раз, медленно, по буквам - если не пользоваться isql с только что найденной тобой ошибкой, и сделать-таки varchar(2), с каковой поправкой я согласился, то на чём работает КЛИЕНТ, под ту систему и будет скомпилен ПЕРЕНОС СТРОКИ .
Безо всяких дополнительных проверок унутре процедуры.
Ну да, примерно так и есть... И если процедуру создать из-под Windows и даже с Varchar(2) получить перевод строки в виде \x0d\x0a, то клиент работающий под Linux будет очень удивлен вот этому \x0d, точнее он не удивится, а выведет его на экран (и в зависимости от того, где конкретно это случится можно получить много вариантов...) и кроме того, у такого клиента полученная строка '\x0d\x0a' (т.е. только сам перевод строки, без ничего дополнительно) не будет равен пустой строке - это будет строка с длиной в 1 символ. Вот именно поэтому ascii_char( 10 ) будет работать практически всегда. Ну кроме тех случаев, когда клиент ждет перевод строки именно из двух символов CR и LF. Но это я считаю просчетом проектирования...

PS: И дело не в isql, не ошибка это в нем... С чего ты вдруг решил, что это ошибка?
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071177
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
WildSery
если не пользоваться isql с только что найденной тобой ошибкой

Это не ошибка, это фича. isql приводит переводы строки перед отправкой в
БД и после получения. Отсюда, кстати, растут ноги удвоения возврата
каретки, на которое тут жаловались недавно: isql несколько неправильно
обращается с исходниками, который в БД загнаны другими инструментами
.

Вот именно! По правильному было бы это делать так, как еще во времена MS-DOS делалось - на входе (это например то место, откуда читается текст процедуры...) все символы возврата каретки CR (0x0D) просто пропускать, а символ перевода строки LF (0x0A) и считать переводом строки. А на выходе перед символом LF добавлять символ CR. Если для той системы в которой работает isql это нужно (под Windows - да, под *nix - нет)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071186
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtПо правильному было бы это делать так, как еще во времена MS-DOS делалось...
Глубоко задумался: - А иде эт оно в PS-DOS делалось?
И про "По правильному было бы это делать так" - это кому правильно?

DzirtЕсли для той системы в которой работает isql это нужно (под Windows - да, под *nix - нет)
Хм... Так во времна PS-DOS, какбэ, DOS был DOS-ом, UNIX - unix-ом.
И ни кто не требовал, штоп оно все в "одном флаконе" работало...

Так что сцылка на хистори - не в зачет.

Как бы народ FB тут не первый день юзает, из-под чего только не юзают, а кипишь ток ты поднял.
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071191
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во-первых, PS-DOS - это не MS-DOS. Впрочем,
различий именно по этой части в них я не припомню.

Во-вторых, если таки действительно поведение будет
различаться для разных систем (а судя по всему, это
так), то говорить что все тут нормально - глупо.

Хотя тезис - проверяйте все на конкретных клиентах
(подходящий нам - у которых все клиенты виндовые) -
имеет место быть. Вот как-то так...

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071440
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Di_LIneDzirtПо правильному было бы это делать так, как еще во времена MS-DOS делалось...
Глубоко задумался: - А иде эт оно в PS-DOS делалось?
...

Я могу напомнить... Вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <stdio.h>
#include <string.h>

void main()
{
    // строка состоящая из '1', трех фозвратов каретки и перевода строки
    const char *str = "1\r\r\r\n";
    // запишем строку в файл в режиме двоичный (mode = "wb")
    // файл file_binary будет содержать  5  байт
    FILE *fp = fopen( "file_bin", "wb" );
    if ( fp )  {
        fwrite( str, strlen( str ),  1 , fp );
        fclose( fp );
        }
    
    // прочитаем file_binary в текстовом режиме (mode = "rt")
    FILE *fin = fopen( "file_bin", "rt" );
    if ( fin )  {
        // выходной файл будем писать тоже в текстовом режиме - хотя тут уже без разницы
        // можно заменить записть и на двоичный режим, все будет сделано при чтении из файла
        FILE *fout = fopen( "file_text", "wt" );
        if ( fout )  {
            char mass[ 100 ];
            // читаем построчно файл file_bin и построчно же выводим его в file_text
            while ( fgets( mass, sizeof( mass ), fin ) )  {
                fputs( mass, fout );
                }
            fclose( fout );
            }

        fclose( fin );
        }
}
Скомпилируем bcc32 версии 5.5.1 (эти функции работы с файлами в нем даже сейчас работают так же, как во времена Turbo C 2.0) или Borland C++ 4.5 (досовской версией) и выполним полученную программу. Содержимое файлов:

Код: plaintext
1.
2.
3.
4.
C:\0\FILE_BIN
0000000000: 31 0D 0D 0D 0A          │                          1♪♪♪◙

C:\0\FILE_TEX
0000000000: 31 0D 0A                │                          1♪◙

Вот так это и работало.

Di_LIne...
И про "По правильному было бы это делать так" - это кому правильно?

DzirtЕсли для той системы в которой работает isql это нужно (под Windows - да, под *nix - нет)
Хм... Так во времна PS-DOS, какбэ, DOS был DOS-ом, UNIX - unix-ом.
И ни кто не требовал, штоп оно все в "одном флаконе" работало ...

Так что сцылка на хистори - не в зачет.


Ну вот и прикинь - никто вроде не требовал, а писали так, чтобы работало правильно.
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071571
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtНу вот и прикинь - никто вроде не требовал, а писали так, чтобы работало правильно.Гы. Открыл в FAR-е файлик сделал 10 "ентеров". Сохранил. Открыл как HEX. И чиго?
- 10 штук 0D0A налицо. Размер файлика = 20 байт.
Ы?
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071580
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Di_LIneDzirtНу вот и прикинь - никто вроде не требовал, а писали так, чтобы работало правильно.Гы. Открыл в FAR-е файлик сделал 10 "ентеров". Сохранил. Открыл как HEX. И чиго?
- 10 штук 0D0A налицо. Размер файлика = 20 байт.
Ы?
Ты открыл для себя Фар? Поздравляю! :)

А что сказать-то хотел?
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071590
Фотография S.G.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По сабжу - а неплохо бы иметь спец. константу для этого дела, имхо...
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071606
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtТы открыл для себя Фар? Поздравляю! :)
А то! FAR - супер ось!
Вот только какой-то гад к моей версии форточки прикрутил...
Не знаешь, как их открутить от FAR-а?


DzirtА что сказать-то хотел?
А то, что сделай такой файлик.txt и посмотри, как его отобразят редакторы в разных осях...
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071617
Фотография Di_LIne
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Экспиримент №2:
Создай 2 файлика:
1. с содержанием 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0A
2. с содержанием 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0D

И отправь оба на принтер (9 pin) и удивись.
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071664
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Отсюда, кстати, растут ноги удвоения возврата
каретки, на которое тут жаловались недавно: isql несколько неправильно
обращается с исходниками, который в БД загнаны другими инструментами.


Начитавшись тут про бедные вернутые каретки, попробовал я извлечь метаданные
isql'ем. Беглый взгляд на результат выявил, что "лишние" символы вставляются
только при выводе текстовый блобов (тексты процедур, вьюх, описаний и т.п.).
В моей базе они все с crlf, а выводятся crcrlf.

Залез я в исходники птицы (которые 2.1.3) и нашёл там виновника - SHOW_print_metadata_text_blob,
которая вызывает ISQL_printf, которая, в свою очередь, вызывает стандартную
fprintf, которая пишет в поток isqlGlob.Out.
Насколько я помню (с помощью гугла :) ), если поток открыт в текстовом
режиме, то при выводе lf заменяется на crlf, что мы и наблюдаем. :)

НО! Есть один нюанс: isqlGlob.Out открывается через fopen(ftmp.c_str(), "w+b"),
то есть в двоичном (непреобразующем) режиме.

Вывод:
1) либо я чего не увидел/не понял (оченно вероятно);
2) у MS VC мания заменять лыфы на цырылыфы превозмогает над стандартом. ;))
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071751
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Di_LIneЭкспиримент №2:
Создай 2 файлика:
1. с содержанием 0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0A
2. с содержанием 0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0D

И отправь оба на принтер (9 pin) и удивись.
Не буду я удивляться, я и так знаю, что произойдет.
Если написанное тобой в символах, то так и выведет:
0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0D0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0D
и каретка будет установлена после последнего символа, а если это в в HEX-кодах, то соответственно:

1. Каретка в начале строки (сколько ему не посылай CR "начальнее" строки не бывает), прогон бумаги на 1 строку (один LF)
2. Прогон бумаги на 16 строк (у тебя 16 LF, я посчитал), каретка в начало строки (один CR)

Опять таки - ты чего сказать-то хотел?

PS: Я тебе еще напомню (это чтобы предвосхитить эксперимент №3), что у матричных принтеров перевод строки (LF который) не вызывал автоматического возврата каретки, т.е. она в какой позиции была в такой и оставалась.
PPS: Я подозреваю, что тебе просто скучно... ;)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071794
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-rSHOW_print_metadata_text_blob,

Именно в нём стоит коммент, который сбил меня с толку.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071863
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r...
НО! Есть один нюанс: isqlGlob.Out открывается через fopen(ftmp.c_str(), "w+b"),
то есть в двоичном (непреобразующем) режиме.

Вывод:
1) либо я чего не увидел/не понял (оченно вероятно);
2) у MS VC мания заменять лыфы на цырылыфы превозмогает над стандартом. ;))
А еще в файле isql.cpp есть функция
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
static processing_state newoutput(const TEXT* outfile)
{
/**************************************
 *
 *	n e w o u t p u t
 *
 **************************************
 *
 * Functional description
 *	Change the current output file
 *
 *	Parameters:  outfile : Name of file to receive query output
 *
 **************************************/
...
которая переоткрывает файл для вывода, например при выполнении оператора
Код: plaintext
output 'имя_файла';
и делает это уже в текстовом режиме (режим в "a" не указан, по-умолчанию считается "текстовый"):
Код: plaintext
1.
2.
3.
4.
5.
...
		outfile = path;
		FILE* fp = fopen(outfile, "a");
		if (fp)
		{
...

При выводе же на экран isqlGlob.Out содержит файл STDOUT (файловый дескриптор 1), который по умолчанию считается текстовым, и CR перед каждым LF тоже добавляется.
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071872
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r...
НО! Есть один нюанс: isqlGlob.Out открывается через fopen(ftmp.c_str(), "w+b") ,
то есть в двоичном (непреобразующем) режиме.
...
Это ты нашел в функции
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
static processing_state copy_table(TEXT* source,
						 TEXT* destination,
						 TEXT* otherdb)
{
/**************************************
 *
 *	c o p y _ t a b l e
 *
 **************************************
 *
 * Functional description
 *	Create a new table based on an existing one.
...
Она к показу метаданных вообще не относится...
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071895
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dzirt
Это ты нашел в функции
Код: plaintext
1.
2.
3.
static processing_state copy_table(TEXT* source,
						 TEXT* destination,
						 TEXT* otherdb)
...
Она к показу метаданных вообще не относится...
Каюсь, смотрел по F7 методом косого чтения. ;)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071896
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать сделать например так (функция void SHOW_print_metadata_text_blob(FILE* fp, ISC_QUAD* blobid, bool escape_squote), файл src\isql\show.epp, строка 1031) - вместо:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
...
    while (blob.getSegment(sizeof(buffer) -  1 , buffer, length))
    {
        // Need to step through the buffer until we hit a '\n' and then print the
        // line.  This is because '\n' are included in blob text.
        // CVC: The above comment and the code do not match.

        buffer[length] =  0 ;
        if (escape_squote)
        {
            for (const UCHAR* p = (UCHAR*) buffer; *p; ++p)
            {
                if (*p == SINGLE_QUOTE)
                    fputc(*p, fp);
                fputc(*p, fp);
            }
            fflush(fp);
        }
        else
            ISQL_printf(fp, buffer);
    }
...

написать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
...
    while (blob.getSegment(sizeof(buffer) -  1 , buffer, length))
    {
        // Need to step through the buffer until we hit a '\n' and then print the
        // line.  This is because '\n' are included in blob text.
        // CVC: The above comment and the code do not match.

        buffer[length] =  0 ;
        for (const UCHAR* p = (UCHAR*) buffer; *p; ++p)
        {
            if (*p != '\r')
            {
                if (escape_squote && *p == SINGLE_QUOTE)
                    fputc(*p, fp);
                fputc(*p, fp);
            }
        }
        fflush(fp);
    }
...
т.е. попросту убрать из входного потока все символы возврата каретки CR.
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071901
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
dennis-rSHOW_print_metadata_text_blob,

Именно в нём стоит коммент, который сбил меня с толку.

Да. Коммент там классный. Особенно приписка от некого CVC, что
коммент и код ничуть не совпадают. Да здравствует копи-паст! :))
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071925
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtМожно попробовать сделать например так
Код: plaintext
...
... т.е. попросту убрать из входного потока все символы возврата каретки CR.
Это конечно да, но не исключено, что бывают особенные платформы, где правят одни CRы.
:]

p.s. Ещё чуть-чуть и CORE-915 можно считать закрытым. ;)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071934
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-rDzirtМожно попробовать сделать например так
Код: plaintext
...
... т.е. попросту убрать из входного потока все символы возврата каретки CR.
Это конечно да, но не исключено, что бывают особенные платформы, где правят одни CRы.
...
Ну, тогда так:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
#ifdef PLATFORM_WITH_CR_ONLY
            if (*p != '\n')
#else
            if (*p != '\r')
#endif
...
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071940
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dzirt
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
...
        if (escape_squote)
        {
            for (const UCHAR* p = (UCHAR*) buffer; *p; ++p)
            {
                if (*p == SINGLE_QUOTE)
                    fputc(*p, fp);
                fputc(*p, fp);
            }
            fflush(fp);
        }
        else
            ISQL_printf(fp, buffer);
...

Кстати! Код, который в if, вааще-то насчёт квотированных строк, а не переводов строк.
И для печати метаданных используется то, что в else. :)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071955
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dzirt
Ну, тогда так:
Код: plaintext
1.
2.
3.
4.
5.
6.
...
#ifdef PLATFORM_WITH_CR_ONLY
            if (*p != '\n')
#else
            if (*p != '\r')
#endif
...

Это не наш метод. Надо, чтоб у всех всё было одинаково!
Одинаково плохо.

Например, переводить текстовые блобы в html, а вместо crlf - <br>. Хы. :-)
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071963
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dennis-r...
Кстати! Код, который в if, вааще-то насчёт квотированных строк, а не переводов строк.
И для печати метаданных используется то, что в else. :)
Я знаю. Просто цикл совместил в один, и то что было в else "ушло".
...
Рейтинг: 0 / 0
знак переноса строки?
    #36071986
dennis-r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dzirt
Я знаю. Просто цикл совместил в один, и то что было в else "ушло".
А! Точно! Не заметил. Ну, тогда это пора комитить в cvs и сделать товарища
zaher dirkey счастливым. Обещанного, говорят, три года ждут. 30 августа
будет как раз.
...
Рейтинг: 0 / 0
25 сообщений из 76, страница 2 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / знак переноса строки?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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