1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.

Автоматическое создание БД при создании сервиса

Тема в разделе "Дополнения для Jimbot", создана пользователем rv3yaa, 5 июн 2012.

  1. TopicStarter Overlay
    rv3yaa

    rv3yaa Пользователь

    Регистрация:
    02.08.11
    Сообщения:
    157
    Симпатии:
    28
    Баллы:
    25
    Пол:
    Мужской
    Здравствуйте Подскажите код в Исходники для Автоматическое создание БД при создании сервиса
  2. cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.445
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    Класс: CreateService
    Код:
    /**
    * JimBot - Java IM Bot
    * Copyright (C) 2006-2009 JimBot project
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    */
     
    package ru.jimbot.util;
     
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import ru.jimbot.Manager;
     
    /**
    * Класс для создания сервисов. на основе шаблонов.
    * @author nek, Warik777
    */
     
    public class CreateService {
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";
    private static Connection connection = null;
    private static Statement statement = null;
    private static Connection con = null;
    private static Statement st = null;
     
    /**
    * @param name Название сервиса
    * @param user - Пользователь базы данных
    * @param pass - Пароль от базы данных
    * @param dbname - Название базы данных
    * @param menu - Кодировка базы данных
    */
    public static void initMySQLService(String name, String user, String pass, String dbname, String menu) {
    Log.info("Create database for service \"" + name + "\" init ...");
    try {
    Class.forName(DRIVER).newInstance();
    try {
    connection = DriverManager.getConnection(DATABASE_URL, "root", MainProps.getStringProperty("db.pass"));
    statement = connection.createStatement();
    // Создаем пользователя
    statement.executeUpdate("CREATE USER '"+dbname+"'@'localhost' IDENTIFIED BY '"+user+"';");
    // Даем базовые привелегии и ограничения
    statement.executeUpdate("GRANT USAGE ON * . * TO '"+user+"'@'localhost' IDENTIFIED BY '"+pass+"' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;");
    // Создаем базу данных для пользователя
    statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `"+dbname+"`;");
    // Даем на созданную базу данных все привелегии
    statement.executeUpdate("GRANT ALL PRIVILEGES ON `"+dbname+"` . * TO '"+user+"'@'localhost';");
    // Перегружаем привелегии
    statement.executeUpdate("FLUSH PRIVILEGES;");
    // Устанавливаем кодировку
    statement.executeUpdate("ALTER DATABASE `"+dbname+"` DEFAULT CHARACTER SET "+menu+" COLLATE "+menu+"_general_ci");
    // Закрываем соединение
    statement.close();
    connection.close();
    // Создаем таблицы
    createTebles(st, con, "templates/db.sql", user, pass, dbname, name);
    // Настраиваем сервис
    setProps(name, user, pass, dbname);
    } catch (SQLException e) {
    e.printStackTrace();
    statement.close();
    connection.close();
    }
    } catch (Exception ex) {
    ex.printStackTrace();
    }
    }
     
    /**
    * Установка настроек базы данных сервиса
    * @param user - Пользователь базы данных
    * @param pass - Пароль от базы данных
    * @param dbname - Название базы данных
    * @param name Имя сервиса
    */
    private static void setProps(String name, String user, String pass, String dbname) {
    try {
    Manager.getInstance().getService(name).getProps().setStringProperty("db.user", user);
    Manager.getInstance().getService(name).getProps().setStringProperty("db.pass", pass);
    Manager.getInstance().getService(name).getProps().setStringProperty("db.dbname", dbname);
    Manager.getInstance().getService(name).getProps().save();
    Log.info("Save property service \""+name+"\"");
    Log.info("DB User: "+user);
    Log.info("DB Pass: "+pass);
    Log.info("DB BaseName: "+dbname);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
     
    /**
    * Создает таблицы базы данных
    * @param st
    * @param con
    * @param file
    * @param user - Пользователь базы данных
    * @param pass - Пароль от базы данных
    * @param dbname - Название базы данных
    * @param Service - Название сервиса
    * @throws IOException
    * @throws SQLException
    */
    private static void createTebles(Statement st, Connection con, String file, String user, String pass, String dbname, String Service) throws
    IOException, SQLException {
    con = DriverManager.getConnection(DATABASE_URL +dbname, user, pass);
    st = con.createStatement();
    BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file),"UTF-8"));
    while (buffer.ready()) {
    // Делаем запрос
    st.executeUpdate(buffer.readLine());
    }
    Log.info("Creating a database for the service \"" + Service + "\" completed!");
    st.close();
    con.close();
    return;
    }
     
    }
  3. cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.445
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    Заменить стандартное создание сервисов в MainPage на вот это:
    Код:
    /**
    * Страница создания нового сервиса.
    * @param con
    * @throws IOException
    */
    public void srvs_create(HttpConnection con) throws IOException {
    String uid = con.get("uid");
    if(!checkSession(uid)) {
    SrvUtil.error(con,"Ошибка авторизации!");
    return;
    }
    con.print(SrvUtil.HTML_HEAD + "<TITLE>JimBot "+MainProps.VERSION+" </TITLE></HEAD>" + SrvUtil.BODY +
    "<H2>Панель управления ботом</H2>" +
    "<H3>Создание нового сервиса</H3>");
    con.print("<FORM METHOD=POST ACTION=\"" + con.getURI() +
    "\"><INPUT TYPE=hidden NAME=\"page\" VALUE=\"srvs_create_in\">" +
    "<INPUT TYPE=hidden NAME=\"uid\" VALUE=\"" + uid + "\">" +
    "<table border=\"0\"><tbody>"+
    "<tr><td>Имя сервиса:</td><td><INPUT TYPE=text NAME=\"ns\" size=\"40\"></td></tr>"+
    "<tr><td>Тип сервиса: chat </td><td><input type=radio name=\"type\" value=\"chat\"> " +
    "<tr><td>------</td><td></td></tr>"+
    "<tr><td>Создать БД?</td><td><input type=\"checkbox\" name=\"autoDB\"></td></tr>"+
    "<tr><td>Пользователь:</td><td><INPUT TYPE=text NAME=\"user\" size=\"40\"></td></tr>"+
    "<tr><td>Имя ДБ:</td><td><INPUT TYPE=text NAME=\"dbname\" size=\"40\"></td></tr>"+
    "<tr><td>Пароль:</td><td><INPUT TYPE=password NAME=\"pass\" size=\"40\"></td></tr>"+
    
    "<tr><td>Выберите кодировку БД: </td><td>"+
    "<select name=\"menu\">"+
    "<option value=\"armscii8\">armscii8</option>"+
    "<option value=\"ascii\">ascii</option>"+
    "<option value=\"big5\">big5</option>"+
    "<option value=\"cp1250\">cp1250</option>"+
    "<option value=\"cp1251\">cp1251</option>"+
    "<option value=\"cp1256\">cp1256</option>"+
    "<option value=\"cp1257\">cp1257</option>"+
    "<option value=\"cp850\">cp850</option>"+
    "<option value=\"cp852\">cp852</option>"+
    "<option value=\"cp866\">cp866</option>"+
    "<option value=\"geostd8\">geostd8</option>"+
    "<option value=\"greek\">greek</option>"+
    "<option value=\"hebrew\">hebrew</option>"+
    "<option value=\"keybcs2\">keybcs2</option>"+
    "<option value=\"koi8r\">koi8r</option>"+
    "<option value=\"koi8u\">koi8u</option>"+
    "<option value=\"latin1\">latin1</option>"+
    "<option value=\"latin2\">latin2</option>"+
    "<option value=\"latin7\">latin7</option>"+
    "<option value=\"macce\">macce</option>"+
    "<option value=\"macroman\">macroman</option>"+
    "<option value=\"ucs2\">ucs2</option>"+
    "<option selected=\"selected\" value=\"utf8\">utf8</option>"+
    "</select></td></tr>"+
    
    "</tbody></table>"+
    "<P><INPUT TYPE=submit VALUE=\"Сохранить\">");
    con.print("<P><INPUT TYPE=button VALUE=\"Назад\" onClick=location.href=\"" + con.getURI() + "?uid=" + uid + "&page=main_page\"></FORM>");
    con.print("</FONT></BODY></HTML>");
    }
    
    /**
    * Обработка формы создания нового сервиса
    * @param con
    * @throws IOException
    */
    public void srvs_create_in(HttpConnection con) throws IOException {
    String uid = con.get("uid");
    if(!checkSession(uid)) {
    SrvUtil.error(con,"Ошибка авторизации!");
    return;
    }
    String ns = con.get("ns");
    String type = con.get("type");
    //--------------------------------
    String user = con.get("user");
    String pass = con.get("pass");
    String dbname = con.get("dbname");
    String menu = SrvUtil.getStringVal(con, "menu");
    //--------------------------------
    if(ns.equals("")){
    printMsg(con,"srvs_create","Пустое имя сервиса!");
    return;
    }
    if(type==null){
    printMsg(con,"srvs_create","Необходимо выбрать тип сервиса!");
    return;
    }
    //--------------------------------
    if(SrvUtil.getBoolVal(con, "autoDB")){
    if(user.equals("")){
    printMsg(con,"srvs_create","Пустое имя пользователя!");
    return;
    }
    if(pass.equals("")){
    printMsg(con,"srvs_create","Пустой пароль!");
    return;
    }
    if(dbname.equals("")){
    printMsg(con,"srvs_create","Пустое имя базы данных!");
    return;
    }
    }
    //--------------------------------
    if(Manager.getInstance().getServiceNames().contains(ns)){
    printMsg(con,"srvs_create","Сервис с таким именем уже существует!");
    return;
    }
    MainProps.AddDirectory(ns);
    Manager.getInstance().addService(ns, type);
    Manager.getInstance().getService(ns).getProps().AddXmlConfig(ns);
    MainProps.addService(ns, type);
    MainProps.save();
    if(SrvUtil.getBoolVal(con, "autoDB")) CreateService.initMySQLService(ns,user,pass,dbname, menu);
    printOkMsg(con,"main_page");
    }
    в MainProps
    Код:
    setStringProperty("db.pass","");
    
    new UserPreference(UserPreference.CATEGORY_TYPE,"db_create", "Настройки авто создании базы",""),
    new UserPreference(UserPreference.PASS_TYPE,"db.pass","Пароль root`a",getStringProperty("db.pass"))
    Создать в корне бота папку с названием "templates" и файл с названием "db" и с расширением файла "sql"
    И еще, один запрос в одну строку нужно чтобы было, а иначе работать не будет!
    пример заполения таблиц
    источник
    http://forum.jimbot.ru/index.php?/topic/4413-создание-сервиса/
    rv3yaa нравится это.
  4. cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.445
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    автоматическоГО созданиЯ
  5. TopicStarter Overlay
    rv3yaa

    rv3yaa Пользователь

    Регистрация:
    02.08.11
    Сообщения:
    157
    Симпатии:
    28
    Баллы:
    25
    Пол:
    Мужской
    cerber Благодарю:)
  6. cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.445
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    класс CreateService от пользователя nek
    Код:
    /**
    
    * JimBot - Java IM Bot
    * Copyright (C) 2006-2009 JimBot project
    * This program is free software; you can redistribute it and/or
    * modify it under the terms of the GNU General Public License
    * as published by the Free Software Foundation; either version 2
    * of the License, or (at your option) any later version.
    *
    * This program is distributed in the hope that it will be useful,
    * but WITHOUT ANY WARRANTY; without even the implied warranty of
    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    * GNU General Public License for more details.
    *
    * You should have received a copy of the GNU General Public License
    * along with this program; if not, write to the Free Software
    * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    */
    
    
    
    package ru.jimbot.util;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Random;
    import ru.jimbot.Manager;
    
    
    
    /**
    * Класс для создания сервисов. на основе шаблонов.
    * @author nek
    */
    
    public class CreateService {
            private static final String DRIVER = "com.mysql.jdbc.Driver";
            private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";
            private static Connection connection = null;
            private static Statement statement = null;
            private static Connection con = null;
            private static Statement st = null;
           
    public static void initMySQLService(String name) {
                    try {
                        Class.forName(DRIVER).newInstance();
                        try {
                            String usr = generate();
                            connection = DriverManager.getConnection(DATABASE_URL, "root", MainProps.getStringProperty("db.pass"));
                            statement = connection.createStatement();
                            // Создаем пользователя
                            statement.executeUpdate("CREATE USER '"+usr+"'@'localhost' IDENTIFIED BY '"+usr+"';");
                            // Даем базовые привелегии и ограничения
                            statement.executeUpdate("GRANT USAGE ON * . * TO '"+usr+"'@'localhost' IDENTIFIED BY '"+usr+"' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;");
                            // Создаем базу данных для пользователя
                            statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `"+usr+"`;");
                            // Даем на созданную базу данных все привелегии
                            statement.executeUpdate("GRANT ALL PRIVILEGES ON `"+usr+"` . * TO '"+usr+"'@'localhost';");
                            // Перегружаем привелегии
                            statement.executeUpdate("FLUSH PRIVILEGES;");
                            // Закрываем соединение
                            statement.close();
                            connection.close();
                            // Создаем таблицы
                            createTebles(st, con, "templates/db.sql", usr);
                            // Настраиваем сервис
                            setProps(usr, name);
                        } catch (SQLException e) {
                            e.printStackTrace();
                            statement.close();
                            connection.close();
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
            }
    /**
    
             * Установка настроек базы данных сервиса
             * @param usr Данные автоизации MySQL
             * @param name Имя сервиса
             */
    
            private static void setProps(String usr, String name) {
                    try {
    
                            Manager.getInstance().getService(name).getProps().setStringProperty("db.user", usr);
                    Manager.getInstance().getService(name).getProps().setStringProperty("db.pass", usr);
                    Manager.getInstance().getService(name).getProps().setStringProperty("db.dbname", usr);
                    Manager.getInstance().getService(name).getProps().save();
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    
           
    
            /**
             * Создает таблицы базы данных
             * @param st
             * @param con
             * @param file
             * @param usr
             * @throws IOException
             * @throws SQLException
             */
    
            private static void createTebles(Statement st, Connection con, String file, String usr) throws
                    IOException, SQLException {
                    con = DriverManager.getConnection(DATABASE_URL+usr, usr, usr);
            st = con.createStatement();
                    BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
            while (buffer.ready()) {
                    // Делаем запрос
                    st.executeUpdate(buffer.readLine());
            }
            st.close();
            con.close();
            return;
            }
    
            /**
             * Генерирует случайную последовательность букв
             * @return
             */
            private static String generate(){
            String s = "1234567890AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
            Random r = new Random();
            String v="";
            for(int i=0;i<10;i++){
                v += s.charAt(r.nextInt(s.length()));
            }
            return v;
        }
    }
    alex_xpert нравится это.
  7. cerber

    cerber Местный инквизитор Команда форума

    Регистрация:
    25.02.11
    Сообщения:
    8.445
    Симпатии:
    2.783
    Баллы:
    575
    Пол:
    Мужской
    Адрес:
    АДА
    и тот же самый класс,от пользователя Zloff
    Код:
    
    package ru.jimbot.util;
    
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import java.sql.Statement;
    import java.util.Random;
    import ru.jimbot.Manager;
    
    
    
    /**
    * Класс для создания сервисов. на основе шаблонов.
    * @author nek
    */
    
    public class CreateService {
            private static final String DRIVER = "com.mysql.jdbc.Driver";
            private static final String DATABASE_URL = "jdbc:mysql://localhost:3306/";
            private static Connection connection = null;
            private static Statement statement = null;
            private static Connection con = null;
            private static Statement st = null;
           
    public static void initMySQLService(String name) {
        System.out.println("Создание базы данных для сервиса: " + name + "\" в процессе ...");
                    try {
                        Class.forName(DRIVER).newInstance();
                        try {
                            String usr = generate();
                            connection = DriverManager.getConnection(DATABASE_URL, "root", MainProps.getStringProperty("db.pass"));
                            statement = connection.createStatement();
                            // Создаем пользователя
                            statement.executeUpdate("CREATE USER '"+name+"'@'localhost' IDENTIFIED BY '"+usr+"';");
                            // Даем базовые привелегии и ограничения
                            statement.executeUpdate("GRANT USAGE ON * . * TO '"+name+"'@'localhost' IDENTIFIED BY '"+usr+"' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;");
                            // Создаем базу данных для пользователя
                            statement.executeUpdate("CREATE DATABASE IF NOT EXISTS `"+name+"`;");
                            // Даем на созданную базу данных все привелегии
                            statement.executeUpdate("GRANT ALL PRIVILEGES ON `"+name+"` . * TO '"+name+"'@'localhost';");
                            // Перегружаем привелегии
                            statement.executeUpdate("FLUSH PRIVILEGES;");
                            // Закрываем соединение
                            statement.close();
                            connection.close();
                            // Создаем таблицы
                            createTebles(st, con, "sql/db.sql", usr, name);
                            // Настраиваем сервис
                            setProps(usr, name);
                        } catch (SQLException e) {
                            e.printStackTrace();
                            statement.close();
                            connection.close();
                        }
                    } catch (Exception ex) {
                        ex.printStackTrace();
                    }
            }
    /**
    
             * Установка настроек базы данных сервиса
             * @param usr Данные автоизации MySQL
             * @param name Имя сервиса
             */
    
            private static void setProps(String usr, String name) {
                    try {
    
                            Manager.getInstance().getService(name).getProps().setStringProperty("db.user", name);
                    Manager.getInstance().getService(name).getProps().setStringProperty("db.pass", usr);
                    Manager.getInstance().getService(name).getProps().setStringProperty("db.dbname", name);
                    Manager.getInstance().getService(name).getProps().save();
                    } catch (Exception e) {
                            e.printStackTrace();
                    }
            }
    
           
    
            /**
             * Создает таблицы базы данных
             * @param st
             * @param con
             * @param file
             * @param usr
             * @throws IOException
             * @throws SQLException
             */
    
            private static void createTebles(Statement st, Connection con, String file, String usr, String Service) throws
                    IOException, SQLException {
                    con = DriverManager.getConnection(DATABASE_URL+Service, Service, usr);
            st = con.createStatement();
                    BufferedReader buffer = new BufferedReader(new InputStreamReader(new FileInputStream(file),"Windows-1251"));
            while (buffer.ready()) {
                    // Делаем запрос
                    st.executeUpdate(buffer.readLine());
            }
            System.out.println("База данный для сервиса: " + Service + " создана автоматически");
            st.close();
            con.close();
            return;
            }
    
            /**
             * Генерирует случайную последовательность букв
             * @return
             */
            private static String generate(){
            String s = "1234567890AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz";
            Random r = new Random();
            String v="";
            for(int i=0;i<10;i++){
                v += s.charAt(r.nextInt(s.length()));
            }
            return v;
        }
    }
    коментарий
    Код:
    вот тут база и пользователь создаеться с именем сервиса.
    alex_xpert нравится это.

Поделиться этой страницей