luasql (проблема с cursor:fetch)

Страницы: 1
RSS
luasql (проблема с cursor:fetch)
 
Здравствуйте. Решил использовать luasql для работы с mysql. Столкнулся  с проблемой при извелечении данных  ("sel ect x fr om y ...."). При вызове cursor:fetch вылетает ошибка  "Unknown error. Possible external module error." Просто из-под lua все работает. Насколько я понимаю, проблема не новая, тут уже было обсуждение http://forum-archive.quik.ru/forum/lua/105223/105349/ (у меня ни первый вариант, ни второй не работает). Вопрос: можно ли обойти как-то эту ситуацию ?
 
Код
cursor, err = con:execute(sQuery)
Посмотрите сообщение об ошибке err
 
Да нет вроде никаких ошибок . Боле того, cur:numrows() возвращает корректное значение  
 
http://forum-archive.quik.ru/forum/lua/114488/114488/
 
Цитата
Дмитрий Сазонов пишет:
"Unknown error. Possible external module error."
Сообщение "Unknown error. Possible external module error."  говорит о том что луа не смогла поймать и распознать ошибку.
Это значит, что ошибка может быть абсолютно любой.
 
Цитата
Старатель пишет:
http://forum-archive.quik.ru/forum/lua/114488/114488/
Цитата
Старатель пишет:
http://forum-archive.quik.ru/forum/lua/114488/114488/
Спасибо, да помогло. Но теперь возникает непонятная ситуация: есть следующий скрипт. Он стабильно падает, причем если в обработчике обновления свечи "message(tostring(dataSource:T(index)), 1)" заменить ,например, на "message(tostring(dataSource :o (index)), 1)", то он падать перестает. Также? если убрать извлечение из БД в main-e, то тоже все нормально. Уже неделю не могу понять ,в чем проблема. Версия квика 6.15.2.9, mysql - 5.6.  Так же отмечу, если вообще в обработчике OnCandleUpdate делать какие-либо манипуляции с таблицей (lua-table), то падает аналогично. Может есть какие-то ограничение, где осуществлять подписку на обновление свечи?


mysql = require 'luasql.mysql'

SLEEP_PERIOD = 3000
CANDLE_PERIOD = INTERVAL_M5
INSTRUMENTS_CLASS = 'QJSIM'
CANDLE_TF_DELAY = 3

DB_NAME = 'test'
DB_LOGIN = 'root'
DB_PASSWORD = ''

dataSource = {}
isExecuting = false

function main()

local env  = mysql.mysql()
local connection = env:connect(DB_NAME, DB_LOGIN, DB_PASSWORD)

local query = string.format([[SEL ECT id FR OM test_table WHERE name = '%s']], 'hello')
local cursor, error = connection:execute(query)
if cursor ~= nil then
local rows = {[0] = ''}
local row = cursor:fetch (rows, "a")
message(tostring(row.id), 1)
cursor:close()
end


while isExecuting == true do  

sleep(SLEEP_PERIOD)

end

connection:close()
env:close()

end


function OnStop(flag)
isExecuting = false
end


function OnInit(path)
createDataSources(exportedInstruments)
isExecuting = true
end

function createDataSources(instruments)

dataSource = CreateDataSource(INSTRUMENTS_CLASS, 'LKOH', CANDLE_PERIOD)
if dataSource ~= nil then
dataSource:SetUpdateCallback(function(...) OnCandleUpdate(INSTRUMENTS_CLASS, 'LKOH', ...) end)
isExecuting = true
end

end

function OnCandleUpdate(class, security, index)

message(tostring(dataSource:T(index)), 1)

end
 
В общем обновился до 6.17.1.17, и вроде как проблема пропала.
 
Цитата
Старатель написал:
http://forum-archive.quik.ru/forum/lua/114488/114488/
У меня точно такая же проблема, но архивная ветка уже не доступна. Подскажите, пожалуйста, как лечится?  
 
Цитата
romirez написал:
Цитата
Старатель написал:
 http://forum-archive.quik.ru/forum/lua/114488/114488/  
У меня точно такая же проблема, но архивная ветка уже не доступна. Подскажите, пожалуйста, как лечится?  
Эксперименты показали, что проблема в параметре "a"  cur:fetch ({}, "a") когда в выборке более 1 поля. Для "n" ошибку не выдает
 
Никто не знает как сделать чтобы cur:fetch ({}, "a")   работало?
 
Какая версия QUIK?
 
Вервия 8.4.1.6   64-битное все
 
Я год назад, когда собрал версию для х64, тоже столкнулся с этим. Даже issue отправлял https://github.com/keplerproject/luasql/issues/115

Решение - перейти на итератор курсора.
Код
function SQL_Rows(connection, sql_statement)
 local cursor = assert(connection:execute (sql_statement))
 return function ()
  return cursor:fetch()
 end
end

Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
 
Цитата
Nikolay написал:
Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
Не могу пока сказать, я ток в начале пути)
А где ожидать еще подвох?
 
Цитата
Nikolay написал:
Я год назад, когда собрал версию для х64, тоже столкнулся с этим. Даже issue отправлял  https://github.com/keplerproject/luasql/issues/115

Решение - перейти на итератор курсора.
Код
   function   SQL_Rows (connection, sql_statement)
  local  cursor  =  assert(connection:execute (sql_statement))
  return   function  ()
   return  cursor:fetch()
  end 
 end   

Кстати, у Вас библиотека на х64 стабильно работает? Я бросил попытки еще в январе.
я пользовал для 8.4 lsqlite3 lua 5.1 x64.

никаких проблем.
 
Цитата
s_mike@rambler.ru написал:
я пользовал для 8.4 lsqlite3 lua 5.1 x64.
Не хотелось бы базу данных менять, уж больно прикипел я к MySQL))
 
Собирали сами? У меня стабильно падала после некоторого времени.
Надо заново проверить, вдруг починили. Техподдержка Квика так и не ответила, по моему обращению.
 
Нет. Взял вот от сюда LuaForWindows_v5.1.5-52
Самое обидное, что проблема давнишняя, и судя по этой ветке у нее были какие-то решения -утерянные в архиве ((
 
Цитата
Nikolay написал:
Собирали сами? У меня стабильно падала после некоторого времени.
Надо заново проверить, вдруг починили. Техподдержка Квика так и не ответила, по моему обращению.
да, сам собрал.

если надо, пишите почтой, поделюсь.

если вдруг у кого то есть sqlite для 5.3 x64 - буду очень рад.
 
Цитата
s_mike@rambler.ru написал:
если вдруг у кого то есть sqlite для 5.3 x64 - буду очень рад
По-хорошему там под 64 бита надо поправлять, много ворнингов вылезает, что пихают 64-битное в int. Но поглядел поверхностно - вроде пихают только индексы на стеке, ничего ужасного вроде не ожидается, попробуйте, коль не лень. Сам sqlite3 интегрирован в эту же длл, отдельно его добавлять не нужно.
 
Я собирал версию ODBC. Она универсальна. sqlite3 не очень люблю, т.к. блокировки транзакций на уровне базы. Правда она умеет in memory, что приятно.
 
Цитата
Но к сожалению ссылка http://forum-archive.quik.ru/forum/lua/114488/114488/ на архив с ответом больше не доступна.
Не поможете, вспомните.. как мой вопрос решается??
К сожалению, не помню про что это.
 
Цитата
Nikolay написал:
блокировки транзакций на уровне базы
C версии 3.7.0 появился режим журнала WAL, в котором, как утверждается, читатели БД и писатели в БД уже не мешают друг другу.

Цитата
Anton написал:
Сам sqlite3 интегрирован в эту же длл, отдельно его добавлять не нужно.
Если не сложно, можете сделать с отдельной sqlite3.dll, чтоб без проблем обновить можно было.
 
Цитата
Старатель написал:
с отдельной sqlite3.dll
Не очень удачная конфигурация на мой взгляд, но ежли нужно, то вот.
 
Цитата
Anton написал:
Цитата
Старатель написал:
с отдельной sqlite3.dll
Не очень удачная конфигурация на мой взгляд, но ежли нужно, то  вот .
Старатель,

спасибо.
 
Это Антону спасибо!

Цитата
Anton написал:
Не очень удачная конфигурация на мой взгляд
Почему?
Страницы: 1
Читают тему (гостей: 1)
Наверх