package utils import ( "database/sql" _ "github.com/mattn/go-sqlite3" "log" "os" "time" ) const ( DbDriver = "sqlite3" TableCreate = ` create table IF NOT EXISTS telegram ( [tele_id] INTEGER PRIMARY KEY AUTOINCREMENT, [tele_recv_time] TIMESTAMP NOT NULL DEFAULT (datetime('now', 'localtime')), [tele_processed] int(1) NOT NULL DEFAULT 0, [tele_text] TEXT NOT NULL ) ` TableInsert = "insert into telegram (tele_text) values (?)" ) var ( dbFile string initTable bool initialized bool isWriting bool ) func getDb() *sql.DB { log.Println("init database ", initTable) if initTable && !initialized { log.Println("remove database file", dbFile) os.Remove(dbFile) } db, err := sql.Open(DbDriver, dbFile) if err != nil { log.Fatal("error in open database ", err) } return db } func InitDb(file string, init bool) error { dbFile = file initTable = init var dbErr error db := getDb() defer db.Close() _, dbErr = db.Exec(TableCreate) if dbErr != nil { log.Fatal("error in create telegram table", dbErr) } log.Println("database ", db, " initialized") initialized = true return nil } func InsertTelegram(teleString string) { count := 0 for isWriting && count < 5 { log.Println("waiting for write ") time.Sleep(3 * time.Second) count++ } if count >= 5 { log.Fatalln("database locked") } isWriting = true db := getDb() defer db.Close() stmt, err := db.Prepare(TableInsert) if err != nil { log.Fatal(err) } defer stmt.Close() result, err := stmt.Exec(teleString) id, _ := result.LastInsertId() if err != nil { isWriting = false log.Fatalln("error in write telegram") } log.Println("telegram insert ", id) isWriting = false }