Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 23.03.2011
Сообщений: 4

Ошибка составления команды для внесения в базу данных. Не понимаю где.

16.06.2011, 11:46. Показов 1446. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу програму для сбора статистики c Астериска. Собирается в базу Postgresql.

к примеру:

Программа выполняет команду - "astersik -rx 'core show calls'" через popen забираю результат выполнения команды к примеру:
10 active calls
14256 processed calls
меняются только цифры.
Затем при помощи PCRE редактирую отбрасывая всё ненужное, сначала для "active calls", затем туже процедуру повторяю для "processed calls". Далее я должен внести полученные результаты - "10" и "14256" в базу данных. Для чего мне нужно написать комманду записи в базу данных в типе "сhar". Значения "10" и "14256" у меня тип "string" я перевожу значения из типа string в тип char (тремя способами). При помощи команды strcat создаю необходимую для внесения в базу команду. Затем компилю: g++ -I/usr/include/pgsql/server/ check_load2.cpp -L/usr/lib -lpq -lpcrecpp и выполняю программу.
Результат вывожу на экран:
Активных звонков: 10
Отработанных звонков: 14256
Офк: 1
Кмма: INSERT INTO my_table (active_calls, calls_processed, ofk) VALUES ('10', '14256', '1')

А ДАННЫЕ НЕ ВНОСЯТСЯ!!!
И это именно в составлении комманды дело потому что я отдельно создаю переменную типа
char cmma[150] = {"INSERT INTO my_table (active_calls, calls_processed, ofk) VALUES ('10', '14256', '1')"}; и она нормально вносит данные в таблицу.

Сама программа:
C++
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
128
129
130
131
132
133
134
135
136
137
138
#include <iostream>
#include <cstdio>
#include <stdlib.h>
#include <cstring>
#include "libpq-fe.h"
#include <termios.h>
#include <unistd.h>
#include <pcrecpp.h>
#include <string>
#include <sstream>
 
using namespace std;
 
static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    std::cin.get();
    exit(1);
}
 
char ofk[2] = "1";
 
int main(int argc, char *argv[])
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    int        nFields, nTuples, tutu;
    int MAX_BUFFER = 256;
 
    string data, active_calls, processed_calls;
    FILE *stream;
    char buffer[MAX_BUFFER];
    int valit = 1;
 
    /* Подключаемся к базе */
    conninfo = "host=123.123.123.123 port=5432 dbname = noname user =user password='12345'";
    /* Make a connection to the database */
    conn = PQconnectdb(conninfo);
    /* Check to see that the backend connection was successfully made */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }
 
    /* Зацикливаю программу для сбора статистики каждые 5 минут */
    while (valit == 1)
    {
      /* Спим 5 минут*/
      sleep(300);
      /* Обнуляем данные предыдущего прохода */
      data = active_calls = processed_calls = "\0";
 
      /* Записываем результат выполнения команды в переменную "data" */
      stream = popen("asterisk -rx \"core show calls\"", "r");
      while (fgets(buffer, MAX_BUFFER, stream) != NULL )
      data.append(buffer);
      pclose(stream);
 
      /* Вылавливаем в строке текущее количество активных звонков. */
      active_calls = data;
      pcrecpp::RE(" active calls\\n\\d{1,7} calls processed\\n").Replace("\0", &active_calls);
 
      /* Переводим количество звонков в тип Char */
// вариант 1
      int TempNumOne=active_calls.size();
      char chr_active_clls[100];
      for (int a=0;a<=TempNumOne;a++)
                    {
                    chr_active_clls[a]=active_calls[a];
                    }
      cout<< active_calls.size() << "\n";
 
// вариант 2
//    active_calls.append("");
//    char *chr_active_clls = (char*)active_calls.c_str();
 
// вариант 3
//    char *chr_active_clls = new char[active_calls.size()+1];
//    chr_active_clls[active_calls.size()]=0;
//    memcpy(chr_active_clls, active_calls.c_str(),active_calls.size());
 
      /* Вылавливаем в строке текущее количество обработанных звонков. */
      processed_calls = data;
      pcrecpp::RE("\\d{1,3} active calls\\n").Replace("", &processed_calls);
      pcrecpp::RE(" calls processed\\n").Replace("\0", &processed_calls);
 
      /* Переводим количество обработанных звонков в тип Char */
//аналогично тому что выше
// вариант 1
      int TempNumOne2=processed_calls.size();
      char chr_clls_prcssd[100];
      for (int a=0;a<=TempNumOne2;a++)
                    {
                    chr_clls_prcssd[a]=processed_calls[a];
                    }
      cout << processed_calls.size() << "\n";
 
// вариант 2
//    processed_calls.append("");
//    char *chr_clls_prcssd = (char*)processed_calls.c_str();
 
// вариант 3
//    char *chr_clls_prcssd = new char[processed_calls.size()+1];
//    chr_clls_prcssd[processed_calls.size()]=0;
//    memcpy(chr_clls_prcssd, processed_calls.c_str(),processed_calls.size());
 
      /* Вносим значения в базу данных */
      /* перед внесением проверяем наличие подключения */
      if (PQstatus(conn) != CONNECTION_OK)
      {
          fprintf(stderr, "Connection to database failed: %s",
                  PQerrorMessage(conn));
          exit_nicely(conn);
      }
 
      /* Создаём команду и вносим данные в таблицу */
      char cmma[150] = {"INSERT INTO voip_statistics (active_calls, calls_processed, ofk) VALUES ('"};
      char cmmb[] = {"', '"};
      char cmmc[] = {"')"};
      strcat(cmma,chr_active_clls);
      strcat(cmma,cmmb);
      strcat(cmma,chr_clls_prcssd);
      strcat(cmma,cmmb);
      strcat(cmma,ofk);
      strcat(cmma,cmmc);
      res = PQexec(conn, cmma);
      PQclear(res);
 
      cout << "Активных звонков: " << chr_active_clls << "\n" <<"Отработанных звонков: "
      << chr_clls_prcssd <<"\n" << "Офк: "<< ofk <<"\n" << "Команда: " << cmma << "\n";
    }
 
return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2011, 11:46
Ответы с готовыми решениями:

Где ошибка? (Запись данных из массива в базу данных mysql)
Массив, генерирующий данные: $data = array(); for($i = 0; $i &lt; 100; $i++){ $data = array( 'name' ...

Вывести на экран количество слов где первая и последняя буквы одинаковы (не понимаю где ошибка)
задан текст нужно вывести на экран количество слов где первая и последняя буквы одинаковы #include &lt;iostream&gt; #include...

Софт для внесения данных
Задача: создать софт для внесения данных (в базу) через форму и по разным критериям производить анализ. Есть машины (на фирме), которые...

4
Эксперт С++
 Аватар для schdub
3073 / 1411 / 425
Регистрация: 19.01.2009
Сообщений: 3,894
16.06.2011, 18:03
Ну а закоммитить транзакцию?
C
1
2
3
4
5
6
// ...
     res = PQexec(conn, cmma);
     /* commit the transaction */
     res = PQexec(conn, "COMMIT");
     PQclear(res);
// ...
Добавлено через 32 минуты
Еще пример
C
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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
  * testlibpq3.c Test the C version of Libpq, the PostgreSQL frontend
  * library. tests the binary cursor interface
  *
  *
  *
  * populate a database by doing the following:
  *
  * CREATE TABLE test1 (i int4, d real, p polygon);
  *
  * INSERT INTO test1 values (1, 3.567, polygon '(3.0, 4.0, 1.0, 2.0)');
  *
  * INSERT INTO test1 values (2, 89.05, polygon '(4.0, 3.0, 2.0, 1.0)');
  *
  * the expected output is:
  *
  * tuple 0: got i = (4 bytes) 1, d = (4 bytes) 3.567000, p = (4
  * bytes) 2 points   boundbox = (hi=3.000000/4.000000, lo =
  * 1.000000,2.000000) tuple 1: got i = (4 bytes) 2, d = (4 bytes)
  * 89.050003, p = (4 bytes) 2 points   boundbox =
  * (hi=4.000000/3.000000, lo = 2.000000,1.000000)
  *
  *
  */
 #include <stdio.h>
 #include "libpq-fe.h"
 #include "utils/geo_decls.h"    /* for the POLYGON type */
 
 void
 exit_nicely(PGconn *conn)
 {
     PQfinish(conn);
     exit(1);
 }
 
 main()
 {
     char       *pghost,
                *pgport,
                *pgoptions,
                *pgtty;
     char       *dbName;
     int         nFields;
     int         i,
                 j;
     int         i_fnum,
                 d_fnum,
                 p_fnum;
     PGconn     *conn;
     PGresult   *res;
 
     /*
      * begin, by setting the parameters for a backend connection if the
      * parameters are null, then the system will try to use reasonable
      * defaults by looking up environment variables or, failing that,
      * using hardwired constants
      */
     pghost = NULL;              /* host name of the backend server */
     pgport = NULL;              /* port of the backend server */
     pgoptions = NULL;           /* special options to start up the backend
                                  * server */
     pgtty = NULL;               /* debugging tty for the backend server */
 
     dbName = getenv("USER");    /* change this to the name of your test
                                  * database */
 
     /* make a connection to the database */
     conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);
 
     /*
      * check to see that the backend connection was successfully made
      */
     if (PQstatus(conn) == CONNECTION_BAD)
     {
         fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
         fprintf(stderr, "%s", PQerrorMessage(conn));
         exit_nicely(conn);
     }
 
     /* start a transaction block */
     res = PQexec(conn, "BEGIN");
     if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
     {
         fprintf(stderr, "BEGIN command failed\n");
         PQclear(res);
         exit_nicely(conn);
     }
 
     /*
      * should PQclear PGresult whenever it is no longer needed to avoid
      * memory leaks
      */
     PQclear(res);
 
     /*
      * fetch rows from the pg_database, the system catalog of
      * databases
      */
     res = PQexec(conn, "DECLARE mycursor BINARY CURSOR FOR SELECT * FROM test1");
     if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)
     {
         fprintf(stderr, "DECLARE CURSOR command failed\n");
         PQclear(res);
         exit_nicely(conn);
     }
     PQclear(res);
 
     res = PQexec(conn, "FETCH ALL in mycursor");
     if (!res || PQresultStatus(res) != PGRES_TUPLES_OK)
     {
         fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");
         PQclear(res);
         exit_nicely(conn);
     }
 
     i_fnum = PQfnumber(res, "i");
     d_fnum = PQfnumber(res, "d");
     p_fnum = PQfnumber(res, "p");
 
     for (i = 0; i < 3; i++)
     {
         printf("type[%d] = %d, size[%d] = %d\n",
                i, PQftype(res, i),
                i, PQfsize(res, i));
     }
     for (i = 0; i < PQntuples(res); i++)
     {
         int        *ival;
         float      *dval;
         int         plen;
         POLYGON    *pval;
 
         /* we hard-wire this to the 3 fields we know about */
         ival = (int *) PQgetvalue(res, i, i_fnum);
         dval = (float *) PQgetvalue(res, i, d_fnum);
         plen = PQgetlength(res, i, p_fnum);
 
         /*
          * plen doesn't include the length field so need to
          * increment by VARHDSZ
          */
         pval = (POLYGON *) malloc(plen + VARHDRSZ);
         pval->size = plen;
         memmove((char *) &pval->npts, PQgetvalue(res, i, p_fnum), plen);
         printf("tuple %d: got\n", i);
         printf(" i = (%d bytes) %d,\n",
                PQgetlength(res, i, i_fnum), *ival);
         printf(" d = (%d bytes) %f,\n",
                PQgetlength(res, i, d_fnum), *dval);
         printf(" p = (%d bytes) %d points \tboundbox = (hi=%f/%f, lo = %f,%f)\n",
                PQgetlength(res, i, d_fnum),
                pval->npts,
                pval->boundbox.xh,
                pval->boundbox.yh,
                pval->boundbox.xl,
                pval->boundbox.yl);
     }
     PQclear(res);
 
     /* close the cursor */
     res = PQexec(conn, "CLOSE mycursor");
     PQclear(res);
 
     /* commit the transaction */
     res = PQexec(conn, "COMMIT");
     PQclear(res);
 
     /* close the connection to the database and cleanup */
     PQfinish(conn);
 
     return 0;
 }
Утянуто отсюда
0
0 / 0 / 0
Регистрация: 23.03.2011
Сообщений: 4
16.06.2011, 21:08  [ТС]
res = PQexec(conn, "COMMIT");
К сожалению не помогло...

Если не собирать запрос из нескольких переменных, а записать руками в одну переменную, всё работает и без "COMMIT".
0
0 / 0 / 0
Регистрация: 23.03.2011
Сообщений: 4
21.06.2011, 15:19  [ТС]
Разобрался... Попробовал изменить тип данных с integer на varchar в базе и записать.... и вот что я увидел... "9". Цифра "9"- это мои звонки, а остальное это ANSI цветовые коды.

Теперь прошу помочь с тем, как мне при помощи PCRE удалить эти коды... есть пример на BASH который у меня работает (нашел в сети)... sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" записать это на С++ самостоятельно пока не получается... может кто-то знает хорошо PCRE и поможет записать правильно эту команду...

Добавлено через 1 час 14 минут
Всё, спасибо, всё получается, избавиться от этого безобразия мне помогает ключик \xhh - где hh (hex) символа из таблицы unicode.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
22.06.2011, 09:26
C++
1
data = active_calls = processed_calls = "\0";
это зачем ?

C++
1
data = active_calls = processed_calls = "";
C++
1
char cmma[150]
не маловато места ?

C++
1
2
3
4
5
6
      strcat(cmma,chr_active_clls);
      strcat(cmma,cmmb);
      strcat(cmma,chr_clls_prcssd);
      strcat(cmma,cmmb);
      strcat(cmma,ofk);
      strcat(cmma,cmmc);
где
C++
1
char chr_active_clls[100];
C++
1
char chr_clls_prcssd[100];
C++
1
stream = popen("asterisk -rx \"core show calls\"", "r");
надо проверять на NULL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.06.2011, 09:26
Помогаю со студенческими работами здесь

не понимаю,где ошибка
Дана форма, в которой мы имеем 15 radio кнопок. Кнопки - оценки за экзамены. Надо найти средний балл. Рассматриваем,например,оценки за...

Не понимаю, где ошибка
Доброго времени суток! Решаю задачу с тимуса, вот условие: http://acm.timus.ru/problem.aspx?space=1&amp;num=1118 Не понимаю, где...

Не понимаю где ошибка
Я написала код, но при выводе р2(именно р) выходит мусор заместь зимы, помогите пожалуйста разобраться) Вот код : #include...

Не понимаю, где ошибка
Необходимо сделать сортировку &quot;пузырьком&quot; и что-то не получается..

не понимаю, где ошибка?
5 cent=\sqrt{25 cent}=\sqrt{\frac{1}{4}dollars}=\frac{1}{2}dollars=50 cent Писал про рубли-копейки, но в редакторе формул русский текст...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 30.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 27.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 27.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru