Перейти к содержимому
Asummonster

MyDataBase - библиотека для работы с базой данных на локальном компьютере/на удалённом сервере.

Рекомендуемые сообщения

Всем привет!В этой теме я хочу рассказать о своей программе для управления неким подобием базы данных.
Структура хранения файлов такова: 
Папка с логинами и паролями
Папка с папками под именем логина, в которой может быть 256 пользователей, у которых может быть 256 баз данных, в которых может быть 256 "колонок" с определёнными данными в них.
Библиотека требует библиотеку OpenNet.
Пройдёмся по методам.
1 метод - аутентификация. - auth(login, password)
Сейчас доступен только 1 аккаунт - test, с паролем test
Зачем он создан? Потому, что чёртов модем не хочет отправлять более 11 пакетов.
Как оно работает?
В таблицу на сервере, в значение с вашим ip добавляются логин и пароль. 
2 метод - создание базы данных (А с ней и пользователя, если он не найден!НЕ ПУТАТЬ С ЛОГИНОМ!) -createDataBase (DataBaseUser, DataBaseName)
3 метод - создание "колонки" в базе данных - createCollum(DataBaseUser, DataBaseName, CollumName)
4 метод - запись данных в "колонку" - writeData(DataBaseUser, DataBaseName, CollumName, data)
5 метод - чтение данных из "колонки" - readData(DataBaseUser, DataBaseName, CollumName)
6 метод -получает пользователей - getUsers() возвращает сериализированную таблицу, стринг, или нилл
7 метод - получает базы данных пользователя - getUserDatabases(DataBaseUsers)возвращает сериализированную таблицу, стринг, или нилл
И 8 метод получает колонки пользователя базы данных в базе данных. - getCollums(DataBaseUser, DataBaseName)возвращает сериализированную таблицу, стринг, или нилл.
Код: в открытой бете, можно проверить на сервере.
Код библы:

 

on=require("opennet")
myIP=on.getIP()
serverIP="myDataBase"
function send(...)
	return {on.sendrec(serverIP, ...)}
end
db={}
function db.auth(login, password)
	return table.unpack(send("auth", login, password))
end
function db.createDataBase(databaseUser, databaseName)
	data=send("createDataBase", databaseUser, databaseName)
	return table.unpack(data)
end
function db.createCollum(databaseUser, databaseName, collumName)
	return table.unpack(send("createCollum", databaseUser, databaseName, collumName))
end
function db.writeData(databaseUser, databaseName, collumName, data)
	return table.unpack(send("writeData", databaseUser, databaseName, collumName, data))
end
function db.readData(databaseUser, databaseName, collumName)
	return table.unpack(send("readData", databaseUser, databaseName, collumName))
end
function db.getUsers()
	return table.unpack(send("getUsers"))
end
function db.getUserDatabases(databaseUser)
	return table.unpack(send("getUserDatabases", databaseUser))
end
function db.getCollums(databaseUser, databaseName)
	return table.unpack(send("getCollons", databaseUser, databaseName))
end
return db

 


Приложение для работы с базой:

 

db=require("mydb")
event=require("event")
gpu=require("component").gpu
serlib=require("serialization")
ser=serlib.serialize
unser=serlib.unserialize
function getDataBaseData()
    gpu.setForeground(0xffffff)
    print("Введите имя пользователя БД")
    dbu=io.read()
    gpu.setForeground(0xffffff)
    print("Введите имя БД")
    dbn=io.read() 
    db.dbn, db.dbu = dbn, dbu
    gpu.setForeground(0xffffff)
end
read=io.read
function io.read(...)
    gpu.setForeground(0xff0000)
    return read(...)
end
function doAuth()
    gpu.setForeground(0xffffff)
    print("Введите логин")
    login=tostring(io.read())
    gpu.setForeground(0xffffff)
    print("Введите пароль")
    pass=tostring(io.read())
    result, description = db.auth(login, pass)
    if result==true then
        print(description)
    elseif result==false then 
        error(description)
    end
end
function printUsage()
    gpu.setForeground(0x00ff00)
    print("==============================================================")
    print("---------------------------AdminDB----------------------------")
    print("==============================================================")
    print("D - Создать БД                      W - Изменить данные")
    print("C - Добавить колонку                U - Список пользователей")
    print("B - Список БД                       V - Список колонок")
    print("R - Прочитать данные из колонки     N - Создать новый аккаунт)")
    print("==============================================================")
    print("--------------------------------------------------------------")
    print("==============================================================")
end
doAuth()
printUsage()
while true do
_,_,_,k=event.pull("key_down")
k=require("keyboard").keys[k]
if k=="d" then
    getDataBaseData()
    gpu.setForeground(0xffffff)
    print(db.createDataBase(db.dbu, db.dbn))
elseif k=="c" then
    getDataBaseData()
    gpu.setForeground(0xffffff)
    print("Введите имя колонки")
    cn=io.read()
    gpu.setForeground(0xffffff)
    print(db.createCollum(db.dbu, db.dbn, cn))
elseif k=="b" then
    gpu.setForeground(0xffffff)
    print("Введите имя пользователя базы данных:")
    dbu=io.read()
    gpu.setForeground(0xffffff)
    _, tablebases=db.getUserDatabases(dbu)
    if unser(tablebases) then
tablebases=unser(tablebases)
    for i=1, #tablebases do 
        print(tablebases[i])
    end
    else 
        print(tablebases)
    end
elseif k=="w" then
    gpu.setForeground(0xffffff)
   print("Введите имя колонки")
  cn=io.read()
    gpu.setForeground(0xffffff)
  print("Введите текст")
  text=io.read()
  getDataBaseData()
    gpu.setForeground(0xffffff)
  print(db.writeData(db.dbu, db.dbn, cn, text))
 
elseif k=="u" then
    gpu.setForeground(0xffffff)
    local _, users=db.getUsers()
if unser(users) then
users=unser(users)
for i=1, #users do
print(users[i])
end
else print(users)
end
elseif k=="v" then
    getDataBaseData()
    _, collons=db.getCollums(db.dbu, db.dbn)
    if unser(collons) then
collons=unser(collons)
      for i=1, #collons do
print(collons[i])
      end
    else 
print(db.getCollums(db.dbu, db.dbn))
end
elseif k=="r" then
gpu.setForeground(0xffffff)
print("Введите колонку:")
cn=io.read()
getDataBaseData()
_, data = db.readData(db.dbu, db.dbn, cn)
print(data)
end
printUsage()
end

 


Надеюсь, это кому-нибудь понадобится!

Изменено пользователем Asummonster

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

: Column
| но не Collum!
Поставь функции в [inline] теги, поправь форматирование.
 



А по поводу либы — надо будет затестить как-нибудь. Но мне проще хранить данные в памяти программы или на харде :P

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

: Column

| но не Collum!

Поставь функции в [inline] теги, поправь форматирование.

 


А по поводу либы — надо будет затестить как-нибудь. Но мне проще хранить данные в памяти программы или на харде :P

Зайду с компа - поправлю. А то писать хоть что-то на виндус планшете - и врагу не пожелаешь

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оно там все в таблах висит? Если ПК ребутнится, вся база слетит к чертям?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Оно там все в таблах висит? Если ПК ребутнится, вся база слетит к чертям?

Нет. Это всё лежит в раиде в Лабаратории:) Я же не совсем дурак;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
function db.getCollums(databaseUser, databaseName) return table.unpack(send("getCollons", databaseUser, databaseName))

 

Так все же  getCollums или getCollons или все таки getColumns ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На сервере функция collons, но в библе её вызывать как collums 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Твоя мини - база натолкнула на идею, написать полноценную базу данных с sql языком, типами.

Завтра займусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Моя мини-база на сервере почти в 400 строк;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хотя лучше реализуй ты, я полностью поглощен OpenCloud.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я не знаю sql, если Лёха поможет - с радостью.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Нет. Это всё лежит в раиде в Лабаратории :) Я же не совсем дурак ;)

Ааааа, ну тогда бомба. Хорошо!

 

Твоя мини - база натолкнула на идею, написать полноценную базу данных с sql языком, типами.

Завтра займусь.

SQL, это вы конечно погорячились. Для этого придется реализовать реляционную базу, продумать ее структуру, ключевые поля и зависимости, а самое главное, разработать язык структурированных  запросов к базе, и все это как-то сделать на детской вайфайке и скриптовом языке.Как делать выборки из базы, и самое главное, как обеспечить работу с данными и их хранение и отсылку пользователю (а она может быть огромной), я даже не представляю пока. Это начать и сдохнуть, называется. :facepalm: 

 

Например, там будет даже две вшивых таблицы типа:

 

таблица юзеров:

id    name         age

1   Монстрик  11

2   Neo             25

3   AlexCC        10

 

подчиненная таблица с ресами:

id  itemName       idItem  metа    count

1   кобла                   1           0       30

2   алмазик             265        0        1

1   земля                   3           0      256

1   изумруды          367        1       12

1   квантоваяСП   4356      13       1

 

Здесь в таблицах видно, что предметы Нео, это только один алмазик. Все остальное принадлежит Монстрику. У Алекса пока пусто.

 

 

А теперь выдайте мне по сети по запросу(а его еще сделать надо, этот язык запросов ;)  :D ) показать предметы Монстрика  в базе и их общее количество.  Или покажи список игроков и их все предметы в хранилище, у которых возраст не меньше 12, и имеется хотя бы один алмаз, а земля = 0. Ну???? И? Слабо? ;)

 

 Так что вернитесь на Землю с Марса. И не забывайте, что нужно соблюдать целостность базы, проверять типы полей, как-то удалять аккуратно из базы пользователей и соответственно не оставлять мусор в подчиненных таблицах, ведь если мы удалим Нео, то надо из второй таблицы почистить и все строки с предметами его с ИД=2. И эти же таблы как-то должны храниться не только в ОЗУ, а и на диске, так ведь?

 

А параллельные запросы к базе, ддос и прочее прочее. Она же у вас крякнется на второй миллисекунде работы.

 

Просто так ляпнуть, а ну-ка ща завтра напишу SQL на "опенкомпуктере", это смешно. А потом через 5 мин. сказать, да не, это фигня, пока более важным делом занят - опенДжанк=)

 

 

 

П.С. Нео, вот тебе полноценный запрос на языке SQL к "полноценной" базе детский. Реализуешь?

SELECT dt, product_id, amount, price
FROM m_outcome
WHERE amount=20 AND price>=10;

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Написать SQL возможно на любой машине, обладающей полнотой по Тьюрингу. Луа такой полнотой обладает. Ограничение - только способности программиста.

Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Хотя лучше реализуй ты, я полностью поглащен OpenCloud.

А как же DataCloud?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А как же DataCloud?

Идите свои темы создавайте. А то сейчас мою тему превратите в тему с OpenCloud'ом

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

П.С. Нео, вот тебе полноценный запрос на языке SQL к "полноценной" базе детский. Реализуешь?

SELECT dt, product_id, amount, price
FROM m_outcome
WHERE amount=20 AND price>=10;

А в чем проблема реализовать?

Тут видна очевидная структура.

SQL проще сделать чем тот же html, где есть вложенные блоки, кучу параметров и тд.

 

Предупреждение от модератора

Цитирование огромного объёма текста!

Изменено пользователем Fingercomp
Цитирование огромного куска текста

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

 

А в чем проблема реализовать? Тут видна очевидная структура. SQL проще сделать чем тот же html, где есть вложенные блоки, кучу параметров и тд.

Удачи с выборкой из 2-4 таблиц одновременно :) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...