mAX
if (lua_pcall(L, 1, LUA_MULTRET, 0) != 0) { return false; }
int nresults = lua_gettop(L) - top + 2;
// получаем результат
if (!lua_istable(L, -1)) { std::cout << "istable false" << std::endl; return false; }
PrintTable(L);
mAX
вот как-то так
mAX
функция вот такая почти
function()
local res = {}
res.message = "111111111111133"
res.arrr = { 'asdasd', 'cxzczcx', 'zxczxczxc' }
return res
end
mAX
нормально работает пока там массив не появляется..как массив появляется так код падает
mAX
PANIC: unprotected error in call to Lua API (invalid key to 'next')
mAX
вообще массивы там это же вроде тоже таблица? ключи 1 2 3 4 и тд?
mAX
как в js например?
fgntfg
В Lua все таблицы
mAX
res.message = "111111111111133"
res.message2 = "2222222222222"
res.repl = { message = "repl message" }
res.req = { d = 3.777, count = 37, name = "req name", subreq = { q = "sdcxvds" }, subreq2 = { q = "svsdv2232332222222" } }
вот такое прекрасно обрабатывает..но как только массив
res.arrr = { 'asdasd', 'cxzczcx', 'zxczxczxc' }
то падает
обрабатывает его первый элемент корректно (1 - asdasd), затом падает на втором когда выполняет
while(lua_next(L, -2) != 0)
mAX
искал какие-нибудь примеры где полностью пробегали бы любой объект и найти не могу))
mAX
разобрался..там ключ не строка а is_string не работает)
mAX
lua_type(L, -2) == LUA_TSTRING вот таким нужно проверять..
mAX
сейчас корректный код скопирую
mAX
void PrintTable(lua_State *L, int i = 0) {
lua_pushnil(L);
i++;
while(lua_next(L, -2) != 0) {
std::string name = "";
if (lua_type(L, -2) == LUA_TSTRING) { name = lua_tostring(L, -2); }
else if (lua_isnumber(L, -2)) {
std::stringstream ss; ss << lua_tonumber(L, -2); name = ss.str();
}
std::cout << tab(i) << "Name: " << name << std::endl;
if (lua_isstring(L, -1))
std::cout << tab(i) << name << " " << lua_tostring(L, -1) << std::endl;
else if (lua_isnumber(L, -1))
std::cout << tab(i) << name << " " << lua_tonumber(L, -1) << std::endl;
else if (lua_istable(L, -1)) {
std::cout << tab(i) << name << std::endl;
PrintTable(L, i);
} else {
std::cout << tab(i) << "Other type" << std::endl;
}
lua_pop(L, 1);
}
i--;
}
mAX
вот топик https://stackoverflow.com/questions/22052579/how-to-validate-lua-table-keys-from-c
mAX
LUA_API int lua_isstring (lua_State *L, int idx) {
int t = lua_type(L, idx);
return (t == LUA_TSTRING || t == LUA_TNUMBER);
}
ппц блин))
Ivan
Вышла новая версия популярного движка на луа Love2d 11.0 https://love2d.org/wiki/11.0
Ivan
Админ, сделай новость
Ivan
Ничего себе, целый фреймворк на луа для создания 2d игр и приложений
Ivan
Ну у них же нет релиза нового
Ivan
Выйдет, надо написать
Ivan
У них есть поддержка записи микрофона?
Sergey
У дефолда релизы каждые две недели, а у короны и несколько раз в неделю может быть.
Snusmumriken
Я не помер, я жив, только меня сейчас мало ((
Да, новость - тема хорошая, но у нас есть отличная шапка (недавно модифицированная), и в чате по love оно актуальнее.
Snusmumriken
Чего-чего?
Snusmumriken
Катя, зачем нам идеи малого бизнеса с прибылью в 40к в количестве трёх штук на сайте-одностраничнике?
Snusmumriken
Всем тихо, я одмен ))
Snusmumriken
Я в курсе, но сначала же надо выяснить, что за спам и зачем он тут.
Тибетский лис ⋆ ⚝️
Anonymous
Добрый день, случайно вышел на ваш чат
Anonymous
Извините
Dika
о, бот отвечает
Anonymous
Бот?)
Anonymous
Смешно)
Snusmumriken
Карочи, Катя.
а) Чтобы делать нормальный флорариум, нужно закончить университет по специальности "ландшафтный дизайн". Иначе получится херня. Инфа 98%. Два процента на то что у человека есть Особое Чувство Прекрасного, и он, например, настоящий художник.
б) Идеи для бизнеса не связанные с программированием тут не шибко котируются.
halt
Парни, вопрос... как экранировать ковычки в переменной.
Есть скрипт, которые записывает СМСки в базу. Всё бы ничего, но если в тексте встречается одинарная ковычка, то данные не записываются в базу
local from = message:getHeader("from");
local to = message:getHeader("to");
local body = message:getBody();
local time = message:getHeader("Event-Date-Local");
local luasql = require "luasql.postgres"
—
— Настройки подключения к базе PostgreSQL
DBHOST = '127.0.0.1'
DBNAME = 'freeswitch'
DBUSER = 'freeswitch'
DBPASS = 'professional'
DBPORT = 5432
local env = assert (luasql.postgres())
local dbcon = env:connect(DBNAME, DBUSER, DBPASS, DBHOST, DBPORT)
sql = "INSERT INTO sms (date, to_sms, from_sms, body_sms) VALUES ('".. time .."', '".. to .."', '".. from .."', '".. body .."')"
res, serr = dbcon:execute(sql)
dbcon:close()
env:close()
текст присутствует в переменной body
Тибетский лис ⋆ ⚝️
Бот?)
Ну да, а чё нет, при входе ни здрасти, сразу ссылку на хренпоймикуды, очень напоминает поведение бота
Snusmumriken
Парни, вопрос... как экранировать ковычки в переменной.
Есть скрипт, которые записывает СМСки в базу. Всё бы ничего, но если в тексте встречается одинарная ковычка, то данные не записываются в базу
local from = message:getHeader("from");
local to = message:getHeader("to");
local body = message:getBody();
local time = message:getHeader("Event-Date-Local");
local luasql = require "luasql.postgres"
—
— Настройки подключения к базе PostgreSQL
DBHOST = '127.0.0.1'
DBNAME = 'freeswitch'
DBUSER = 'freeswitch'
DBPASS = 'professional'
DBPORT = 5432
local env = assert (luasql.postgres())
local dbcon = env:connect(DBNAME, DBUSER, DBPASS, DBHOST, DBPORT)
sql = "INSERT INTO sms (date, to_sms, from_sms, body_sms) VALUES ('".. time .."', '".. to .."', '".. from .."', '".. body .."')"
res, serr = dbcon:execute(sql)
dbcon:close()
env:close()
текст присутствует в переменной body
print("text with \"quotes\"")
Snusmumriken
На бинарных опционах от Форекс Клуб.
Sergey
Нафиг луа, пойду флорариумы пилить 😉
Тибетский лис ⋆ ⚝️
А чё нет-то пусть расскажут как роботов кодить на площадках
Sergey
Если запилишь свой, расшарь плиз на гитхабе
Sergey
Канеш☺️
Snusmumriken
А, ну тогда это уже экранирование sql.
Вот эти кавычки: `
Snusmumriken
А ещё, с sql стоит проверять входящий текст.
halt
нет, дело в том, что текст неизвестен какой будет. ковычку то я могу в тексте заэкраниповать
halt
ковычка такая '
halt
Их может быть несколько
halt
Текст разный бывает, вот пример - OCTATOK 111.85 p. Antivirus ot Tele2. Podklyuchit': *381*1# (7 dn. bespl.)
halt
Так вот из-за этой одной ковычки и не пишется в базу
Andrei
Я так понял что тут функцию реплейса реквестируют)
halt
Это я знаю. Вот хотел узнать, средствами Lua это нужно делать или все же SQL
Snusmumriken
body = body:gsub("'", "\\'")
halt
Спасибо, попробую
Snusmumriken
И так - со всеми потенциально неправильными символами.
halt
Попробовал. Этот вариант ставит слеш перед ковычкой. - V aprel\' bez avtoshtrafov!
А как вырезать?
halt
Что значит чем?
Ilya
Каким модулем?
halt
luasql.postgres
halt
Парни спасибо. Сработало)
Ilya
Я просто думал, что квотирование аргументов есть на уровне интерфейса БД. Но видимо нет, судя по примерам: http://keplerproject.github.io/luasql/examples.html
Ilya
А, нет, есть:
Ilya
conn:escape(str)
Escape especial characters in the given string according to the connection's character set.
See also: Official documentation of function PQescapeStringConn
Returns: the escaped string.
Snusmumriken
А как ты это планируешь делать автоматически, если запрос - простая строка "select bla_bla from bla_bla_bla where bla = 'bla-bla\'bla\' bla'"?
Ilya
Вот это тебе и надо использовать, чтобы гарантировать, что никто не сделает тебе SQL injection.
Snusmumriken
Ага. Типа body = conn:escape(body).
Ilya
Только не для всего запроса, а для каждого аргумента по отдельности
Snusmumriken
Ещё точнее: для того аргумента, который ДОЛЖЕН быть экранирован.
Ilya
string.format("select bla_bla from bla_bla_bla where bla = %s", conn:escape(value))
Ilya
Для безопасности лучше все экранировать 😉
Snusmumriken
Да, кстати как раз хотел форматирование предложить, потому что обилие конкатенации - это кошмарно по читабельности.
Ilya
Или можно использовать luadbi: https://github.com/mwild1/luadbi - там используется подход с плейсхолдерами и экранирование присходит автоматически.
Ilya
Боянчик в тему: https://xkcd.ru/327/
Anonymous
а если мы пишем вот так вот
table = { "x"}
мы объявляем поле со значением "x" и каким то индексом n ??
и как мне тогда объявить пустое поле с индексом "x"?
Anonymous
явно указывать начальное значение?
типа
table = { "x" = 0,} ?
Snusmumriken
Ммм.
tbl = {"x"} ==>
tbl = {}
tbl[1] = "x"
tbl = {"x" = 10} => Error: '}' expected near '=', потому что строковые ключи так не указываются.
А указываются вот так:
tbl = {x = 10} или
tbl = {["x"] = 10}