powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQL%ROWCOUNT в sqlite
7 сообщений из 7, страница 1 из 1
SQL%ROWCOUNT в sqlite
    #35614698
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hi

Есть аналог орклевого SQL%ROWCOUNT в sqlite ?
мне нужно узнать сколько записей проапдейтилось
и если 0, то сделать вставку типа MERGE
--
~PPA() {} //
...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35615356
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эти костыли в SQLite не нужны.
Заливай все сразу одной командой:
Код: plaintext
1.
insert or replace into target_table
   select * from source_table
Для каждой заливаемой записи если первичный ключ уже существует, запись будет обновлена, если не существует - добавлена.
...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35615374
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭти костыли в SQLite не нужны.
Заливай все сразу одной командой:
Код: plaintext
1.
insert or replace into target_table
   select * from source_table
Для каждой заливаемой записи если первичный ключ уже существует, запись будет обновлена, если не существует - добавлена.

insert or replace мне не подходит (или подходит?)

нужно забрать предыдущее значение:
если значения нет, то воткнуть запись с 0-ми

update fly_ratio set upload = upload + ?, download = download + ? where id=?

полный код выглядит сейчас так:
хочется исключить лишний поиск
"select max(id) from fly_ratio where dic_nick=? and dic_hub=? and dic_ip=?"

Код: 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.
void CFlylinkDBManager::ratio(const string& p_hub,const string& p_nick, 
							  __int64 p_size, const string& p_ip, bool p_is_download)
{
 try {
    Lock l(m_cs);
	__int64 l_hub_id;
	const string l_key = getCFlyRatioKey(p_nick,p_hub,l_hub_id);
	CFlyRatioItem& l_new_item = m_ratio_cache[l_key]; 
	l_new_item.m_ip = p_ip;
     if(p_is_download)
	 {
		l_new_item.m_download += p_size;
  	    m_global_ratio.m_download += p_size;
 	 }
	 else
	 {
		l_new_item.m_upload   += p_size; 
  	    m_global_ratio.m_upload   += p_size;
	 }
    const __int64 l_nick =  getDIC_ID(p_nick,e_DIC_NICK);
    const __int64 l_ip   =  getDIC_ID(p_ip,e_DIC_IP);
	sqlite3_command* l_sql =  0 ;
	if(!m_select_ratio.get())
        m_select_ratio = auto_ptr<sqlite3_command>(new sqlite3_command(m_flySQLiteDB,
          "select max(id) from fly_ratio where dic_nick=? and dic_hub=? and dic_ip=?"));
	l_sql = m_select_ratio.get();
    l_sql->bind( 1 , l_nick);
    l_sql->bind( 2 , l_hub_id);
    l_sql->bind( 3 , l_ip);
	__int64 l_id_ratio = l_sql->executeint64();
	if(l_id_ratio)
	{
	  if(p_size)
	  {
	  sqlite3_transaction l_trans(m_flySQLiteDB);
	  if(!m_update_ratio.get())
         m_update_ratio = auto_ptr<sqlite3_command>(new sqlite3_command(m_flySQLiteDB,
        "update fly_ratio set upload = upload + ?, download = download + ? where id=?"));
	     l_sql = m_update_ratio.get();
	     if(p_is_download)
		 {
		   l_sql->bind( 1 ,  0 );
		   l_sql->bind( 2 , p_size);
		 }
		 else
		 {
           l_sql->bind( 2 ,  0 );
           l_sql->bind( 1 , p_size);
		 }
         l_sql->bind( 3 , l_id_ratio);
 	     l_sql->executenonquery();
         l_trans.commit();
	  }
	}
	else
	{
      sqlite3_transaction l_trans(m_flySQLiteDB);
	  if(!m_insert_ratio.get())
         m_insert_ratio = auto_ptr<sqlite3_command>(new sqlite3_command(m_flySQLiteDB,
        "insert into fly_ratio (dic_ip,dic_nick,dic_hub,upload,download) values(?,?,?,?,?)"));
	     l_sql = m_insert_ratio.get();
         l_sql->bind( 1 , l_ip);
         l_sql->bind( 2 , l_nick);
         l_sql->bind( 3 , l_hub_id);
	     if(p_is_download)
		 {
			 l_sql->bind( 4 ,  0 );
			 l_sql->bind( 5 , p_size);
		 }
	     else
		 {
			 l_sql->bind( 4 , p_size);
			 l_sql->bind( 5 ,  0 );
		 }
 	      l_sql->executenonquery();
         l_trans.commit();
	}
	}
 	catch(const database_error& e)
	{
		LogManager::getInstance()->message("SQLite - ratio: " + e.getError());
	}
}

...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35615449
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAхочется исключить лишний поиск
"select max(id) from fly_ratio where dic_nick=? and dic_hub=? and dic_ip=?"А почему ты считаешь что этот поиск лишний? Как иначе получить последний ID для группы?
...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35615740
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

я вынужден два раза выполнять поиск записи
один раз при селекте
второй раз на апдейте.

эффективнее сразу сделать update
а если на апдейте обновилась строчка (т.е. она нашлась) то не делать инсерта.
...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35616430
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAЕсть аналог орклевого SQL%ROWCOUNT в sqlite ?
sqlite3_changes
...
Рейтинг: 0 / 0
SQL%ROWCOUNT в sqlite
    #35616583
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,

Спасибо.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQL%ROWCOUNT в sqlite
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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