myDC.ru

Здравствуйте, гость ( Вход | Регистрация )

 
 
Ответить в данную темуНачать новую тему

> sqlite3, RusHub | Библиотека базы данных sqlite

Теги
Setuper
сообщение 24.3.2010, 1:26
Сообщение #1


RusHub team lead
**************

Группа: Модераторы
Сообщений: 4 030
Регистрация: 20.6.2008
Из: г. Королёв (Моск. обл.)
Пользователь №: 46
Спасибо сказали: 1708 раз




Название: sqlite3
Версия библиотеки: devel-0.7
Хаб: RusHub
Версия БД: 3.6.23
Авторы: Tiago Dionizio, Doug Currie
Описание: Библиотека для подключения базы данных sqlite3.
Использование: Содержимое архива sqlite3.rar распаковываем в папку libs. Подключается библиотека так: require"luasql.sqlite3"
У некоторых папка luasql уже может быть создана в папке libs и содержать библиотеку mysql.dll, - кладём туда же библиотеку sqlite3.dll
Некоторые пользователи не умеют или не хотят ставить базу данных MySQL, поэтому на помощь в данном случае может прийти SQLite big_smile.gif


Библиотека win32: Прикрепленный файл  sqlite3.rar ( 237.54 килобайт ) Кол-во скачиваний: 59

Библиотека win64: Прикрепленный файл  sqlite3_win64.rar ( 295.1 килобайт ) Кол-во скачиваний: 24


Пример для проверки: Прикрепленный файл  test.lua ( 508 байт ) Кол-во скачиваний: 34
(раньше в PtokaX нельзя было создать больше одной таблицы, тут всё создаётся)

Для просмотра содержимого базы данных можно использовать http://www.sqliteexpert.com/download.html Sqlite менеджер, поддерживающий кириллицу (ANSI).


Описание функций библиотеки

Описание функций библиотеки:


Методы объекта среды разработки (env):

env:complete(sql)
В случае верного синтаксиса SQL команды возвращает true, иначе возвращает false.


env:open(filename) или env:connect(filename)
Открывает (или создаёт, если не создана) SQLite базу с именем filename и возвращает её хендл, который имеет lua тип userdata (возвращаемый данной функцией объект в дальнейшем используется для вызовов всех методов для данного соединения с базой данных). Пример:

Код
env = luasql.sqlite3()
con = env:open("mybase.db3") -- открытие базы данных
-- некоторые действия с базой данных...
con:close()  -- закрытие базы данных
env:close()


В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке.


env:open_memory()
Открывает временную базу данных (в памяти) и возвращает хендл, который имеет lua тип userdata. В случае ошибки, функция возвращает nil, код ошибки и сообщение об ошибке. (В памяти база данных изменяется, но никогда не сохраняется на диск.)


env:close()
Закрывает текущую среду разработки (env).


env._VERSION
Возвращает строку с информацией о версии SQLite (в формате "x.y[.z]").



Методы объекта соединения (con):
После открытия базы данных при помощи метода env:open() или env:open_memory() возвращается хендл этой базы. Открытые базы данных поддерживают следующие методы:


con:busy_handler([func [, udata]])
Этот вызов позволяет указать lua функцию-обработчик, которая будет вызываться в случае, если файл базы данных был заблокирован другим процессом или потоком. Если func равен nil, то удаляется ранее установленная функция и любой вызов метода exec вернет состояние занятости env.BUSY немедленно при доступе к заблокированной таблице. Если функция-обработчик указана, то она вызовется с двумя аргументами. Первый аргумент - это указанный в методе busy_handler аргумент udata. Второй аргумент – предыдущее количество вызовов обработчика, при доступе к заблокированному ресурсу. Если обработчик вернул nil, false или 0, то метод exec вернет env.BUSY, в противном случае, метод exec будет пытаться открыть в цикле выполнить свой запрос.
По умолчанию обработчика нету.
Sqlite реентерабельна, и в обработчике возможно выполнять запросы. Не совсем понятно, зачем это может пригодиться, но в теории это возможно. Обработчик не должен закрывать файл базы данных. Закрытие базы из обработчика вызовет удаление структур вышестоящего запроса и может привести к аварийному завершению.


con:busy_timeout(t)
Этот вызов позволяет установить время t в миллисекундах, которое нужно подождать в случае если транзакция не была завершена (файл базы данных был заблокирован другим процессом или потоком). Вызов этого метода удалит все функции-обработчики, установленные методом busy_handler. Вызов этого метода с аргументом меньше либо равном 0 отключит все функции-обработчики.


con:close()
Закрывает базу данных. Все sql запросы, использующие con:prepare() завершаются при вызове данного метода. Метод возвращает env.OK в случае успеха, и числовой код ошибки в случае неудачи.


con:create_aggregate(name, nargs, step, final)
Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент step - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции. Аргумент final - это функция, которая будет вызываться один раз в самом конце запроса, эта функция вызывается с один аргументом - context.

Пример использования:

Код
con:exec[[
  CREATE TABLE numbers(num1, num2);
  INSERT INTO numbers VALUES(1, 11);
  INSERT INTO numbers VALUES(2, 22);
  INSERT INTO numbers VALUES(3, 33);
]]
local num_sum = 0
local function oneRow(context,num)
  num_sum = num_sum + num
end
local function afterLast(context)
  context:result_number(num_sum)
  num_sum = 0
end
con:create_aggregate("do_the_sums", 1, oneRow, afterLast)
for sum in con:urows('SELECT do_the_sums(num1) FROM numbers') do
  Core.SendToAll("Sum of col 1: "..sum)
end
for sum in con:urows('SELECT do_the_sums(num2) FROM numbers') do
  Core.SendToAll("Sum of col 2: "..sum)
end


В результате на экране увидим следующее:
Код
Sum of col 1: 6
Sum of col 2: 66



con:create_collation(name, func)
Этот метод создают сортирующую функцию обратного вызова. Функция обратного вызова нужна для установки порядка сортировки, по большей части за счёт сравнения строк. Аргумент name - это строка, содержащая имя sql сортировки. Аргумент func - это непосредственно lua функция сортировки, принимающая 2 строковых аргумента и возвращающая 0, если строковые аргументы равны, -1 - если первый аргумент "меньше" второго, и 1 - если первый аргумент "больше" второго.

Пример использования:

Код
local function collate(s1, s2)
  s1 = s1:lower()
  s2 = s2:lower()
  if s1 == s2 then return 0
  elseif s1 < s2 then return -1
  else return 1 end
end
con:exec[[
  CREATE TABLE test(id INTEGER PRIMARY KEY, content COLLATE CINSENS);
  INSERT INTO test VALUES(NULL, 'hello world');
  INSERT INTO test VALUES(NULL, 'Buenos dias');
  INSERT INTO test VALUES(NULL, 'HELLO WORLD');
]]
con:create_collation("CINSENS", collate)
for row in con:nrows("SELECT * FROM test") do
  Core.SendToAll(row.id..' '..row.content)
end



con:create_function(name, nargs, func)
Этот метод создаёт функцию обратного вызова. Функция вызывается для каждой строки запроса. Аргумент name - это строка, которая содержит имя создаваемой sql функции. Аргумент nargs - это число аргументов у sql функции. Аргумент func - это непосредственно lua функция, которая будет выполняться для каждой строки запроса, эта функция вызывается с аргументом context и аргументами sql функции.

Пример использования:

Код
con:exec"CREATE TABLE test(col1, col2, col3)"
con:exec"INSERT INTO test VALUES(1, 2, 4)"
con:exec"INSERT INTO test VALUES(2, 4, 9)"
con:exec"INSERT INTO test VALUES(3, 6, 16)"
con:create_function("sum_cols", 3, function(context, a, b, c)
  context:result_number(a + b + c)
end))
for col1, col2, col3, sum in con:urows("SELECT *, sum_cols(col1, col2, col3) FROM test") do
  Core.SendToAll(("%d + %d + %d = %d"):format(col1, col2, col3, sum))
end



con:errcode() или con:error_code()
Возвращает числовой код (или расширенный код) для недавнего неудавшегося вызова метода базы данных.


con:errmsg() или con:error_message()
Возвращает сообщение с ошибкой для недавнего неудавшегося вызова метода базы данных.


con:exec(sql [, func [, udata]]) или con:execute(sql [, func [, udata]]) или con:query(sql [, func [, udata]])
Составляет и выполняет sql запрос, указанный в первом аргументе этого метода. Запросы просто выполняются друг за другом не сохраняясь. Функция возвращает env.OK в случае успеха и числовой код ошибки в случае неудачи.

Если один или несколько утверждений являются запросами, и если во втором параметре данного метода указана функция func, то эта функция выполнится для каждой строки результатов запроса. Эта функция будет вызываться с 4 аргументами: udata (третий аргумент метода exec), числом колонок в строке(cols), таблицей (values), содержащей все данные всех колонок, и другой таблицей (names), содержащей имена всех колонок. Эта функция должна возвратить 0. Если она вернёт не 0, то запрос будет считаться прерванным. Все последующие запросы не будут выполняться, а метод exec вернёт код env.ABORT.

Пример использования:

Код
local sql = [[
  CREATE TABLE numbers(num1, num2, str);
  INSERT INTO numbers VALUES(1, 11, 'ABC');
  INSERT INTO numbers VALUES(2, 22, 'DEF');
  INSERT INTO numbers VALUES(3, 33, 'UVW');
  INSERT INTO numbers VALUES(4, 44, 'XYZ');
  SELECT * FROM numbers;
]]
function showrow(udata, cols, values, names)
  assert(udata == "test_udata")
  Core.SendToAll("exec:")
  for i = 1, cols do
    Core.SendToAll(names[i]..' '..values[i])
  end
  return 0
end
con:exec(sql, showrow, "test_udata")



con:interrupt()
Этот метод прерывает выполнение операции базы данных. Метод ничего не возвращает.


con:isopen() или con:isconnect()
Этот метод возвращает true, если база открыта, иначе возвращает false.


con:last_insert_rowid()
Этот метод возвращает идентификатор строки последнего INSERT запроса. Если INSERT запрос никогда не выполнялся, то метод возвращает 0. Каждая строка в SQLite таблице имеет уникальный 64-битный целочисленный ключ 'rowid'. Этот идентификатор всегда доступен по имени ROWID, OID, или _ROWID_. Если таблица имеет поле с типом INTEGER PRIMARY KEY, то эта колонка является псевонимом для 'rowid'.
Если INSERT выполняется внутри триггера, то идентификатор rowid вносимой строки будет возвращаться так долго, как долго будет работать тригер. Как только триггер завершит свою работу вернётся то значение, которое было до работы триггера.


con:nrows(sql)
Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей.

Пример использования:

Код
con:exec[[
  CREATE TABLE numbers(num1, num2);
  INSERT INTO numbers VALUES(1, 11);
  INSERT INTO numbers VALUES(2, 22);
  INSERT INTO numbers VALUES(3, 33);
]]
for a in con:nrows("SELECT * FROM numbers") do
  for i,v in pairs(a) do
    Core.SendToAll(i..": "..v)
  end
end


Результаты работы:

Код
num2: 11
num1: 1
num2: 22
num1: 2
num2: 33
num1: 3



con:prepare(sql)
Данный метод компилирует sql утверждение во внутренне представление и возвращает cur объект (курсор) типа userdata для дальнейших операций.


con:progress_handler(n, func, udata)
Этот метод устанавливает функцию обратного вызова func, которая выполняется периодически в течение длинных вызовов метода con:exec() или cur:step(). Вызов функции происходит каждые n операций, где n передаётся в качестве первого аргумента в указанную функцию. udata передаётся в качестве второго аргумента. Если действий в методе con:exec() или cur:step() меньше n, то функция обратного вызова не будет выполняться. Только одна функция обратного вызова может быть зарегистрирована для каждой открытой базы данных. Повторный вызов данного метода перезапишет прежде установленную функцию. Для того, чтобы удалить функцию обратного вызова, достаточно в методе вторым аргументом указать nil.
Если функция обратного вызова возвращает значение, отличное от 0, то текущий запрос незамедлительно прерывается и база данных откатывается назад, а метод con:exec() или cur:step() вернёт число env.INTERRUPT. Данный метод может быть использован для отмены длительных запросов.


con:rows(sql)
Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей.

Пример использования:

Код
con:exec[[
  CREATE TABLE numbers(num1, num2);
  INSERT INTO numbers VALUES(1, 11);
  INSERT INTO numbers VALUES(2, 22);
  INSERT INTO numbers VALUES(3, 33);
]]
for a in con:rows("SELECT * FROM numbers") do
  for i,v in pairs(a) do
    Core.SendToAll(i..": "..v)
  end
end


Результаты работы:

Код
1: 1
2: 11
1: 2
2: 22
1: 3
2: 33



con:total_changes()
Этот метод возвращает общее число строк, которое было модифицировано при помощи INSERT, UPDATE или DELETE, за всё время, в течение которого база была открытой. Сюда также включаются операции в триггерах. Изменения записываются как только выполняется любой из вызовов cur:reset() или cur:finalize().


con:trace(func, udata)
Этот метод устанавливает функцию трассировки. func - это lua функция, которую вызывает SQLite до разбора sql утверждения. В эту функцию передаются 2 аргумента. Первый - это аргумент udata, второй - это строка с sql утверждением.


con:urows(sql)
Метод создаёт итератор, который возвращает последующие строки, выбирая их из запроса sql. Каждый вызов итератора возвращает значения всех полей данной строки.

Пример использования:

Код
con:exec[[
  CREATE TABLE numbers(num1, num2);
  INSERT INTO numbers VALUES(1, 11);
  INSERT INTO numbers VALUES(2, 22);
  INSERT INTO numbers VALUES(3, 33);
]]
for a, b in con:urows("SELECT * FROM numbers") do
  Core.SendToAll(a..": "..b)
end


Результаты работы:

Код
1 11
2 22
3 33



con:commit()
Метод выполнения (завершения) текущей транзакции. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда транзакция не может быть завершина или база данных не поддерживает транзакции.


con:rollback()
Метод отката на предыдущую транзакцию. Возвращает true в случае успеха, nil и сообщение ошибки - в случае, когда операция не может быть выполнена или база данных не поддерживает транзакции.


con:setautocommit(boolean)
Метод включения/отключения автоматических транзакций. Эта функция не может работать в базах, на которых не осуществляются транзакции. В базах данных, на которых нет понятия режима автоматических транзакций, этот механизм осуществляется драйвером. Метод возвращает true в случае успеха, и вызывает ошибку - в случае невыполнимости или неосуществимости.



Методы объекта курсор (cur):
После создания подзапроса при помощи метода con:prepare(), к этому подзапросу можно применять следующие методы:


cur:bind(n [, value])
Связывает данные value с переменной n в запросе. Если тип данных value является строкой или числом, то эти данные связываются как text или double соответственно. Если типом данных переменной value является тип boolean или эта переменная равна nil или вовсе отсутствует missing, то предыдущая связь удаляется. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи.


cur:bind_blob(n, blob)
Связывает строку blob (которая может быть бинарной строкой) с параметром n. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи.


cur:bind_names(nametable)
Связывает параметры запроса с данными таблицы nametable. Если есть параметры запроса вида ":AAA" или "$AAA", то ищутся соответствующие поля таблицы, если параметры в запросе не именованные, то ищутся числовые поля таблицы nametable. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи.


cur:bind_parameter_count()
Возвращает максимальный индекс подзапроса. Если параметры подзапроса имеют вид ":AAA" или вид "?", то назначается последовательно увеличивающееся число, начинающиеся с 1, так что возвращаемая величина является количеством параметров. Тем не менее если одно и тоже имя используется в подзапросе несколько раз, то все повторные имена не считаются, то есть возвращается величина, являющаяся числом уникальных параметров в подзапросе.
Если какой-либо параметр подзапроса имеет вид "?NNN" (где NNN - целое число), то могут быть промежутки в нумерации и возвращаемая величина будет равна индексу параметра подзапроса с самой большой индексной величиной.


cur:bind_parameter_name(n)
Возвращает имя n-го параметра подзапроса stmt. Параметры ":AAA", "@AAA", "$VVV" будут иметь имена ":AAA", "@AAA", "$VVV", соответственно. Другими словами, символы ":", "$" и "@" включаются в имя. Параметры "?" и "?NNN" не имеют имени. Первый связанный параметр имеет индекс 1. Если величина n за допустимыми рамками, или если n-ый параметр не имеет имени, то возвращается nil. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи.


cur:bind_values(value1, value2, ..., valueN)
Связывает указанные данные с параметрами подзапроса. Данный метод возвращает env.OK в случае успеха или численный код ошибки в случае неудачи.


cur:columns() или cur:numcols()
Возвращает количество колонок в результатах запроса, или 0, если подзапрос не возвращает ничего.


cur:finalize()
Эта функция завершает подзапрос. Если поздапрос выполнился успешно или не выполнился, то функция возвращает env.OK, в случае неудачи возвращает численный код ошибки.


cur:get_name(n) или cur:getcolname(n)
Возвращает имя n-ого столбца в результатах подзапроа (номер самого левого столбца - 0).


cur:get_named_types() или cur:getcolntypes()
Возвращает таблицу с именами и типами всех столбцов подзапроса.


cur:get_named_values() или cur:getcolnvalues()
Возвращает таблицу с именами и данными текущей строки результатов подзапроса.


cur:get_names() или cur:getcolnames()
Возвращает массив с именами всех столбцов в результатах подзапроса.


cur:get_type(n) или cur:getcoltype(n)
Возвращает тип n-ого столбца подзапроса (номер самого левого столбца - 0).


cur:get_types() или cur:getcoltypes()
Возвращает массив с типами всех столбцов подзапроса.


cur:get_unames() или cur:getcolunames()
Возвращает имена всех столбцов подзапроса.


cur:get_utypes() или cur:getcolutypes()
Возвращает типы всех столбцов подзапроса.


cur:get_uvalues() или cur:getcoluvalues()
Возвращает данные всех столбцов текущей сроки подзапроса.


cur:get_value(n) или cur:getcolvalue(n)
Возвращает данные n-ого столбца подзапроса (номер самого левого столбца - 0).


cur:get_values() или cur:getcolvalues()
Возвращает массив данных всех столбцов подзапроса.


cur:isopen() или cur:isconnect()
Возвращает true, если запрос ещё открыт (не заверщён при помощи метода finalize), иначе возвращает false.


cur:close()
Закрывает текущий курсор (cur).


cur:nrows()
Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются поля таблицы, а значениями - значения этих полей.


cur:reset()
Этот метод восстанавливает подзапрос, для того чтобы он был выполнен. Переменные, которые были связаны при помощи методов cur:bind*() сохраняют свои значения.


cur:rows()
Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает таблицу, ключами которой являются номера полей таблицы, а значениями - значения этих полей.


cur:step()
Этот метод должен быть вызван для того чтобы оценить следующую итерацию подзапроса. Она возвращает одо из следующих значений:

env.BUSY: база данных была занята. Если подзапрос подтверждён (COMMIT), то вы можете повторить запрос, в противном случае можно откатиться на предыдущую транзакцию.

env.DONE: подзапрос успешно завершил работу (finalize). Метод cur:step() не должен вызываться заново, без вызова метода cur:reset(), который сбросит всё на начальное состояние.

env.ROW: возвращается всякий раз, когда новая строка с данными готова для обработки вызывающим оператором. Данные могут быть доступны использованием функций доступа к строкам. cur:step(), может вызываться снова, чтобы извлекать следующую строку с данными.

env.ERROR: ошибка во время выполнения (например, нарушение ограничений). Метод cur:step() не должен вызываться снова. Более детальную информацию можно посмотреть, вызвав метод con:errmsg(). Более специфический код ошибки может быть получен при вызове метода cur:reset().

env.MISUSE: вызвана неподходящая функция. Такое возможно если предыдущий подзапрос завершил работу (finalize), или предыдущий вызов метода cur:step() вернул env.ERROR или env.DONE.


cur:urows()
Возвращает итератор, который возвращает последующие строки, выбирая их из подзапроса. Каждый вызов итератора возвращает значения всех полей данной строки.



Методы объекта context функций обратного вызова:
Объекта context доступен как параметр в функциях обратного вызова методов con:create_aggregate() и con:create_function(). Этот объект обладает следующими методами:


ctx:aggregate_count()
Метод возвращает число вызовов функции обратного вызова.


ctx:get_aggregate_data()
Возвращает данные определенного пользователем поля.


ctx:set_aggregate_data(udata)
Устанавливает данные для определённого пользователем поля.


ctx:result(res)
Устанавливает результат функции обратного вызова в res. Тип результата зависит от типа res и является числом, или строкой или nil. Все другие величины поднимают сообщение ошибки.


ctx:result_null()
Устанавливает результат функции обратного вызова в nil. Метод ничего не возвращает.


ctx:result_number(number) или ctx:result_double(number)
Устанавливает результат функции обратного вызова как число number. Метод ничего не возвращает.


ctx:result_int(number)
Устанавливает результат функции обратного вызова как целое число number. Метод ничего не возвращает.


ctx:result_text(str)
Устанавливает результат функции обратного вызова как строку str. Метод ничего не возвращает.


ctx:result_blob(blob)
Устанавливает результат функции обратного вызова как бинарную строку blob. Метод ничего не возвращает.


ctx:result_error(err)
Устанавливает результат функции обратного вызова как ошибку err. Метод ничего не возвращает.


ctx:user_data()
Возвращает userdata параметр поступивший при вызове, чтобы устанавливать функцию возврата (см. описания методов con:create_aggregate() и con:create_function()).


В заключении приведу числовые коды ошибок:
Код
env.OK: 0
env.ERROR: 1
env.INTERNAL: 2
env.PERM: 3
env.ABORT: 4
env.BUSY: 5
env.LOCKED: 6
env.NOMEM: 7
env.READONLY: 8
env.INTERRUPT: 9
env.IOERR: 10
env.CORRUPT: 11
env.NOTFOUND: 12
env.FULL: 13
env.CANTOPEN: 14
env.PROTOCOL: 15
env.EMPTY: 16
env.SCHEMA: 17
env.TOOBIG: 18
env.CONSTRAINT: 19
env.MISMATCH: 20
env.MISUSE: 21
env.NOLFS: 22
env.FORMAT: 24
env.RANGE: 25
env.NOTADB: 26
env.ROW: 100
env.DONE: 101


Спасибо сказали:
Go to the top of the page
+Quote Post
Alexey
сообщение 22.9.2012, 17:52
Сообщение #2


7 квадратиков
*******

Группа: Модераторы
Сообщений: 793
Регистрация: 21.1.2009
Пользователь №: 1 895
Спасибо сказали: 301 раз




Цитата
[2012-09-22 18:50:44] error loading module 'luasql.sqlite3' from file 'L:\Progs\shub\libs\luasql\sqlite3.dll':
Не найден указанный модуль.
Go to the top of the page
+Quote Post

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

Collapse

> Похожие темы

  Тема Ответов Автор Просмотров Последнее сообщение
No New Posts Topic has attachmentssqlite3
win32 | База данных
3 Setuper 11 455 2.6.2014, 15:19 Посл. сообщение: Alexey
No New Posts ВАЖНО: Topic has attachmentsМануал По Работе С Sqlite3
13 Setuper 41 559 6.3.2009, 23:40 Посл. сообщение: Setuper
No New Posts От: Мануал По Работе С Sqlite3
От темы с ID: 70
9 Nickolya 13 984 10.10.2008, 20:48 Посл. сообщение: Setuper

 



RSS Сейчас: 23.12.2024, 4:53