package main import ( "log" ) func initDB() { log.Println("Setting up database...") tx, err := db.Begin() if err != nil { log.Fatal(err) } defer tx.Rollback() _, err = tx.Exec("set foreign_key_checks = 0") if err != nil { log.Fatal(err) } var name string rows, err := db.Query("show tables") if err != nil { log.Fatal(err) } for rows.Next() { err = rows.Scan(&name) if err != nil { log.Fatal(err) } _, err = tx.Exec("drop table " + name) if err != nil { log.Fatal(err) } } err = rows.Err() if err != nil { log.Fatal(err) } rows.Close() _, err = tx.Exec("set foreign_key_checks = 1") if err != nil { log.Fatal(err) } err = tx.Commit() if err != nil { log.Fatal(err) } log.Println("Database cleaned up") _, err = db.Exec(`CREATE TABLE code_obj_type ( id SMALLINT(5) UNSIGNED NOT NULL ,intl_id VARCHAR(32) NOT NULL ,name VARCHAR(80) NOT NULL ,PRIMARY KEY (id) ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`) if err != nil { log.Fatal(err) } _, err = db.Exec(`CREATE TABLE obj ( id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,obj_type_id SMALLINT UNSIGNED NOT NULL ,PRIMARY KEY (id) ) ENGINE = InnoDB AUTO_INCREMENT = 0 CHARSET=utf8 COLLATE utf8_unicode_ci;`) if err != nil { log.Fatal(err) } _, err = db.Exec(`CREATE TABLE obj_user ( obj_id BIGINT UNSIGNED NOT NULL ,tg_id BIGINT UNSIGNED NOT NULL ,user_id VARCHAR(32) NOT NULL ,name VARCHAR(80) NOT NULL ,guild_id BIGINT UNSIGNED ,last_msg TIMESTAMP ,busy_until TIMESTAMP ,role ENUM('commander', 'bartender', 'squire', 'none') ,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`) if err != nil { log.Fatal(err) } _, err = db.Exec(`CREATE TABLE obj_guild ( obj_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,tag VARCHAR(32) NOT NULL ,name VARCHAR(80) NOT NULL ,chat_id BIGINT NOT NULL ,deposit_chat_id BIGINT NOT NULL ,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`) if err != nil { log.Fatal(err) } _, err = db.Exec(`CREATE TABLE obj_msg ( obj_id BIGINT UNSIGNED NOT NULL ,msg_id BIGINT NOT NULL ,chat_id BIGINT NOT NULL ,sender_user_id BIGINT NOT NULL ,date TIMESTAMP NOT NULL ,text VARCHAR(4096) NOT NULL ,FOREIGN KEY (obj_id) REFERENCES obj(id) ON DELETE CASCADE ,UNIQUE KEY (msg_id, chat_id, sender_user_id) ) ENGINE = InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci;`) if err != nil { log.Fatal(err) } _, err = db.Exec(`INSERT INTO code_obj_type (id, intl_id, name) VALUES (1, "user", "User") ,(2, "guild", "Guild") ,(3, "msg", "Message");`) if err != nil { log.Fatal(err) } log.Println("Database set up") } func putMsg(m ChatWarsMessage) error { res, err := db.Exec(`INSERT INTO obj (obj_type_id) VALUES (3);`) if err != nil { log.Fatal(err) } objId, err := res.LastInsertId() stmt, err := db.Prepare(`INSERT INTO msg (obj_id, msg_id, chat_id, sender_user_id, date , text) VALUES (?, ?, ?, ?, FROM_UNIXTIME(?), ?);`) if err != nil { return err } defer stmt.Close() _, err = stmt.Exec(objId, m.ID64, m.ChatID64, m.SenderUserID64, m.Date, m.Text) if err != nil { return err } return nil }