Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / SQL%ROWCOUNT в sqlite / 7 сообщений из 7, страница 1 из 1
24.10.2008, 14:49
    #35614698
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL%ROWCOUNT в sqlite
hi

Есть аналог орклевого SQL%ROWCOUNT в sqlite ?
мне нужно узнать сколько записей проапдейтилось
и если 0, то сделать вставку типа MERGE
--
~PPA() {} //
...
Рейтинг: 0 / 0
24.10.2008, 18:17
    #35615356
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL%ROWCOUNT в sqlite
Эти костыли в SQLite не нужны.
Заливай все сразу одной командой:
Код: plaintext
1.
insert or replace into target_table
   select * from source_table
Для каждой заливаемой записи если первичный ключ уже существует, запись будет обновлена, если не существует - добавлена.
...
Рейтинг: 0 / 0
24.10.2008, 18:27
    #35615374
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL%ROWCOUNT в sqlite
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
24.10.2008, 19:00
    #35615449
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL%ROWCOUNT в sqlite
PPAхочется исключить лишний поиск
"select max(id) from fly_ratio where dic_nick=? and dic_hub=? and dic_ip=?"А почему ты считаешь что этот поиск лишний? Как иначе получить последний ID для группы?
...
Рейтинг: 0 / 0
25.10.2008, 03:20
    #35615740
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SQL%ROWCOUNT в sqlite
White Owl,

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

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

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


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