Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears / 4 сообщений из 4, страница 1 из 1
25.09.2009, 19:15:50
    #36218259
Oleg Zhovtanyuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears
Добрый день.

Битый час бьюсь над проблемой: в "шестеренках" из кода на JavaScript можно положить в БД 8-байтовое целое, а вот достать его обратно... Доки читал, Гугл спрашивал, ответа не нашел.

Есть БД на SQLite, с целочисленными ключами (как известно, если в таблице есть целочисленный ключ, он становится синонимом для встроенного 8-байтного ROWID).

Код: plaintext
1.
2.
3.
4.
5.
CREATE TABLE Users (
  id INTEGER NOT NULL,
  email TEXT( 128 ) NOT NULL
  PRIMARY KEY (id)
)

Есть запись с достаточно большим значением ключа, чтобы занять все 8 байт.

Код: plaintext
1.
INSERT INTO Users (id, email) VALUES ('336583485862969345', 'user@domain.org');

В JavaScript нет 8-байтного целого, но id можно хранить в коде, как строку, и запихать в базу, как строку, SQLite сам сконвертит в число.

А вот код, вынимающий значение id

Код: 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.
<html>
<head>
<script type="text/javascript" src="js/gears_init.js"></script>
</head>
<body>

<script>
var db = google.gears.factory.create('beta.database');
var rs;
try {
	db.open("md");
	var sql = "SELECT * FROM Users WHERE email = ?";
	rs = db.execute(sql, ['user@domain.org']);
	var id = "";
	id = rs.fieldByName("id");
} catch (ex) {
	alert("SQL error: " + ex);
	throw ex;
} finally {
	if (rs != null) {
		rs.close();
	}
	if (db != null) {
		db.close();
	}
}
alert(id);
</script>

</body>
</html>

"ложится" с сообщением

Код: plaintext
1.
Error: Return value is out of range.

Дока по Gears говорит, что ResultSet.fieldByName() возвращает variant.
Но сконвертить его в строку не получается никак ! Падает раньше.

Может, кто уже сталкивался?
...
Рейтинг: 0 / 0
27.09.2009, 00:04:22
    #36219066
Oleg Zhovtanyuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears
Одно решение найдено - привожу для справки.

Можно явно сконвертировать в строку колонку в SQL-запросе с помощью CAST. Для приведенного примера:

Код: plaintext
1.
2.
3.
var sql = "SELECT CAST(id AS TEXT) AS sid, * FROM Users WHERE email = ?";
...
var id = rs.fieldByName("sid");

Такой вариант слегка корявый, т.к. приходится править SQL. Если кто знает, как вынуть BIGINT в виде строки для произвольного SELECT'а, велкам.
...
Рейтинг: 0 / 0
27.09.2009, 13:46:04
    #36219216
crt
crt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears
здесь есть форум по sqlite
http://www.sql.ru/forum/actualtopics.aspx?bid=69
...
Рейтинг: 0 / 0
30.09.2009, 00:43:29
    #36223997
Oleg Zhovtanyuk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears
crtздесь есть форум по sqlite
http://www.sql.ru/forum/actualtopics.aspx?bid=69

Я в курсе. Проблема не в SQLite'е а в JS. Консольный клиент (sqlite3) любые числа вставляет и извлекается без проблем, а вот все, что связано с JS - глючит.

Если кому интересно, вот баг в Мозилловском трекере. Ребята советуют ждать JS2. :)
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Доступ к BIGINT-полям в SQLite из JavaScript/Google Gears / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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