powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Open Client 15.0 ESD #10
9 сообщений из 9, страница 1 из 1
Open Client 15.0 ESD #10
    #34950386
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего-то я все же не понимаю.
Пытаюсь использовать Open Client и каждый запуск выдает мне разные результаты.
Вот маленький исходник на Си. Не С++, а простой Си.
Код: 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.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
#include <stdio.h>
#include <cspublic.h>
#include <bkpublic.h>

static CS_INT BLK_VERSION;
static CS_CONTEXT *context;
static CS_LOCALE *locale;

typedef struct {
    CS_INT    value;
    char *name;
} enum_decryption;

static enum_decryption Retcodes[] = {
    {CS_SUCCEED, "CS_SUCCEED"},
    {CS_FAIL, "CS_FAIL"},
    { 0 , (char*)NULL}};

static enum_decryption Severity[] = {
    {CS_SV_INFORM, "CS_SV_INFORM"},
    {CS_SV_CONFIG_FAIL, "CS_SV_CONFIG_FAIL"},
    {CS_SV_RETRY_FAIL, "CS_SV_RETRY_FAIL"},
    {CS_SV_API_FAIL, "CS_SV_API_FAIL"},
    {CS_SV_RESOURCE_FAIL, "CS_SV_RESOURCE_FAIL"},
    {CS_SV_COMM_FAIL, "CS_SV_COMM_FAIL"},
    {CS_SV_INTERNAL_FAIL, "CS_SV_INTERNAL_FAIL"},
    {CS_SV_FATAL, "CS_SV_FATAL"},
    { 0 , (char*)NULL}};

static enum_decryption NetIOTypes[] = {
    {CS_SYNC_IO, "CS_SYNC_IO"},
    {CS_ASYNC_IO, "CS_ASYNC_IO"},
    {CS_DEFER_IO, "CS_DEFER_IO"},
    { 0 , (char*)NULL}};

char *decrypt_enum_value(CS_INT value, enum_decryption *values) {
    enum_decryption *pair = values;
    while(pair->name) {
        if (pair->value == value ) return pair->name;
        ++ pair;
    }
    return "Unkown value";
}


static CS_RETCODE CS_PUBLIC
clientmsg_cb(CS_CONTEXT *context, CS_CONNECTION *connection, CS_CLIENTMSG *errmsg) {
    printf("\nOpen Client Message:\n");
    printf("Message number: LAYER = (%ld) ORIGIN = (%ld) ",
            CS_LAYER(errmsg->msgnumber), CS_ORIGIN(errmsg->msgnumber));
    printf("SEVERITY = (%ld, %s) NUMBER = (%ld)\n",
            CS_SEVERITY(errmsg->msgnumber), decrypt_enum_value(CS_SEVERITY(errmsg->msgnumber), Severity),
            CS_NUMBER(errmsg->msgnumber));
    printf("Message String: %s\n", errmsg->msgstring);
    if (errmsg->osstringlen >  0 ) {
        printf("Operating System Error: %s\n", errmsg->osstring);
    }
    printf("\n");
    return CS_SUCCEED;
}



int main(int argc, char **argv) {
    CS_INT        netio_type;
    CS_RETCODE  retcode;
    CS_INT      cs_ver;
    CS_INT      boolean;


    cs_ver = CS_VERSION_150;
    retcode = cs_ctx_alloc(cs_ver, &context);
    if(retcode != CS_SUCCEED) {
        printf("cs_ctx_alloc(%d) failed\n", cs_ver);
        exit( 1 );
    } else
        printf("cs_ctx_alloc(%d) succeded\n", cs_ver);

    if(cs_diag(context, CS_INIT, CS_UNUSED, CS_UNUSED, NULL) != CS_SUCCEED) {
        printf("Warning: cs_diag(CS_INIT) failed\n");
        exit( 1 );
    } else 
        printf("cs_diag(CS_INIT) succeded\n");

/*    boolean = CS_FALSE;
    if(cs_config(context, CS_SET, CS_EXTERNAL_CONFIG, &boolean, CS_UNUSED, NULL) != CS_SUCCEED) {
        printf("Warning: Can't set CS_EXTERNAL_CONFIG to false\n");
    } else 
        printf("CS_EXTERNAL_CONFIG setted to false\n"); */


    if((retcode = ct_init(context, cs_ver)) != CS_SUCCEED) {
        cs_ctx_drop(context);
        context = NULL;
        printf("ct_init(%d) failed, retcode=%d\n", cs_ver, retcode);
    } else
        printf("ct_init(%d) succeded, retcode=%d\n", cs_ver, retcode);

    
    if((retcode = ct_callback(context, NULL, CS_SET, CS_CLIENTMSG_CB, (CS_VOID *)clientmsg_cb)) != CS_SUCCEED) {
        printf("ct_callback(clientmsg) failed, retcode=%d\n", retcode);
        exit( 1 );
    } else
        printf("ct_callback(clientmsg) succeded, retcode=%d\n", retcode);


    {    char out[ 1024 ];
        CS_INT outlen;
        retcode = ct_config(context, CS_GET, CS_VER_STRING, (CS_VOID*)out, sizeof(out), &outlen);
        printf("retcode = %d %s, outlen = %d, out = %s\n", retcode, decrypt_enum_value(retcode, Retcodes), outlen, out);
    }

    netio_type = CS_SYNC_IO;
    if((retcode = ct_config(context, CS_SET, CS_NETIO, &netio_type, CS_UNUSED, NULL)) != CS_SUCCEED) {
        printf("ct_config(netio) failed, retcode=%d\n", retcode);
        exit( 1 );
    }
    printf("ct_config(netio) succeded, netio_type=%s\n", decrypt_enum_value(netio_type, NetIOTypes));

    if((retcode = ct_config(context, CS_GET, CS_MAX_CONNECT, &netio_type, CS_UNUSED, NULL)) != CS_SUCCEED) {
        printf("ct_config(max_connect) failed, retcode=%d\n", retcode);
        exit( 1 );
    }
    printf("ct_config(max_connect) succeded, netio_type=%d\n", netio_type);


    return  0 ;
}

Что здесь может быть неверно? Сегодня этот код выдает мне на экран:
Код: plaintext
1.
2.
3.
4.
5.
6.
cs_ctx_alloc(15001) succeded
cs_diag(CS_INIT) succeded
ct_init(15001) succeded, retcode=1
ct_callback(clientmsg) succeded, retcode=1
retcode = 1 CS_SUCCEED, outlen = 4199945, out = |2@
ct_config(netio) succeded, netio_type=CS_SYNC_IO
ct_config(max_connect) succeded, netio_type=25

Это я пытаюсь подружить DBD:Sybase с OC15. Пока побеждают глюки.

---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34950442
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня есть следующий код откомпиленный с 15-м клиентом.
Код: plaintext
retcode = ct_config(ctx, CS_GET, CS_VER_STRING, (CS_VOID *)scratch_str, DIR_MAX_LEN, NULL);
отлично работает.
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34950457
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.у меня есть следующий код откомпиленный с 15-м клиентом.
Код: plaintext
retcode = ct_config(ctx, CS_GET, CS_VER_STRING, (CS_VOID *)scratch_str, DIR_MAX_LEN, NULL);
отлично работает.А у меня нет....

Добавляем в блок взятия имени библиотеки пустую переменную:
Код: plaintext
1.
2.
3.
4.
5.
6.
    {   char out[ 1024 ];
		char *p;
        CS_INT outlen;
        retcode = ct_config(context, CS_GET, CS_VER_STRING, (CS_VOID*)out, sizeof(out), &outlen);
        printf("retcode = %d %s, outlen = %ld, out = %s\n", retcode, decrypt_enum_value(retcode, Retcodes), outlen, out);
    }
И в выводе получаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
cs_ctx_alloc(15001) succeed
cs_diag(CS_INIT) succeed
ct_init(15001) succeed, retcode=1
ct_callback(clientmsg) succeed, retcode=1

Open Client Message:
Message number: LAYER = (1) ORIGIN = (1) SEVERITY = (1, CS_SV_API_FAIL) NUMBER = (1)
Message String: ct_config(): user api layer: external error: The information being retrieved will not fit in a buffer of 0 bytes.

retcode = 0 CS_FAIL, outlen = 2293624, out = t2@
ct_config(netio) succeed, netio_type=CS_SYNC_IO
ct_config(max_connect) succeed, netio_type=25
У меня возникает сильное впечатление, что ct_config() делает что-то неприличное со стеком.
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34950461
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.у меня есть следующий код откомпиленный с 15-м клиентом.А попробуй скомпилировать мой пример. Вот как есть. Там никаких внешних заголовков не нужно и вообще вся программа в одном файле.
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34950497
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cs_ctx_alloc(15001) succeded
cs_diag(CS_INIT) succeded
ct_init(15001) succeded, retcode=1
ct_callback(clientmsg) succeded, retcode=1
retcode = 1 CS_SUCCEED, outlen = 97, out = Sybase Client-Library/15.0/P-EBF14167 ESD #7/PC Intel/BUILD1500-093/OPT/Wed Dec 13 20:04:04 2006
ct_config(netio) succeded, netio_type=CS_SYNC_IO
ct_config(max_connect) succeded, netio_type=25
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34953232
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry.cs_ctx_alloc(15001) succeded
cs_diag(CS_INIT) succeded
ct_init(15001) succeded, retcode=1
ct_callback(clientmsg) succeded, retcode=1
retcode = 1 CS_SUCCEED, outlen = 97, out = Sybase Client-Library/15.0/P-EBF14167 ESD #7/PC Intel/BUILD1500-093/OPT/Wed Dec 13 20:04:04 2006
ct_config(netio) succeded, netio_type=CS_SYNC_IO
ct_config(max_connect) succeded, netio_type=25
Угу.... Значит в моем исходнике все правильно. Неправильно может быть в процессе компиляции.
Либо сам OC глючит. У меня ESD#10.... должно быть....
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34953431
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Победил в конце-концов.

Ключевые слова были "что-то странное творится со стеком" и "кажется проблема в компиляции" :)

Дело в том, что я предпочитаю использовать для Windows платформы MinGW. А OpenClient про MinGW ничего не знает в принципе. Странно, но факт. В итоге, все прототипы OC функций объявлялись как cdecl вместо stdcall.

74-ая строка в cs_config.h:
Код: plaintext
#if ((SYB_MSC_VER >=  800 )  || defined(__BORLANDC__))
исправляем ее на:
Код: plaintext
#if ((SYB_MSC_VER >=  800 )  || defined(__BORLANDC__) || defined(__MINGW32_VERSION))
И все проблемы исчезают.
Ну может конечно и не все еще, но вышеприведенный код заработал как положено.

Тоже самое можно/нужно сделать и для OC 12.5 (120-ая строка в cs_config.h), но я с ним сейчас не работаю.
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34953444
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl пишет:

> Дело в том, что я предпочитаю использовать для Windows платформы MinGW.
> А OpenClient про MinGW ничего не знает в принципе. Странно, но факт. В
> итоге, все прототипы OC функций объявлялись как cdecl вместо stdcall.

Напиши, пожалуйста, ЧТО должно быть в тех строках, потому как у
меня например строка эта не 74, а совсем даже 120.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Open Client 15.0 ESD #10
    #34953450
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
White Owl пишет:

> Дело в том, что я предпочитаю использовать для Windows платформы MinGW.
> А OpenClient про MinGW ничего не знает в принципе. Странно, но факт. В
> итоге, все прототипы OC функций объявлялись как cdecl вместо stdcall.

Напиши, пожалуйста, ЧТО должно быть в тех строках, потому как у
меня например строка эта не 74, а совсем даже 120.
Ну вот, полный кусок с определениями как он выглядит сейчас у меня, в OC15 он начинается с 74-ой строки, в OC12.5 он начинается со 120-ой.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
#if ((SYB_MSC_VER >=  800 )  || defined(__BORLANDC__) || defined(__MINGW32_VERSION))

/*
** Defines for Windows NT calling conventions.
*/
#define CS_PUBLIC	__stdcall
#define CS_INTERNAL     CS_PUBLIC
#define CS_VARARGS      __stdcall
#define CS_STATIC       static

#else /* ((SYB_MSC_VER >= 800) || defined(__BORLANDC__) || defined(__MINGW32_VERSION)) */

/*
** Default defines for all other platform/compilers.
*/
#define CS_PUBLIC		
#define CS_INTERNAL 
#define CS_VARARGS
#define CS_STATIC       static

#endif /* ((SYB_MSC_VER >= 800) || defined(__BORLANDC__) || defined(__MINGW32_VERSION)) */
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Open Client 15.0 ESD #10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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