[go] 聊天室服务器端五--数据库

源码地址: https://github.com/JianBiHua/go_line_chat

说了有数据库的,开始喽

Sqlit3Impl.go

package sql

import (
	"GoWorkspace/go_line_chat/src/server/chatlog"
	"database/sql"
	"fmt"

	_ "github.com/mattn/go-sqlite3"
)

// Sqlite3Impl is sqlite3 impl
type Sqlite3Impl struct {
	db *sql.DB
}

// NewSqlite3Impl is static create sqlite3 impl
func NewSqlite3Impl() *Sqlite3Impl {
	var s = new(Sqlite3Impl)
	return s
}

// log is show log when Chat mode is SqlMode
func (s *Sqlite3Impl) log(msg string) {
	chatlog.Append(chatlog.LOGSQL, msg)
}

// Open 打开数据库,并创建表
//
// out:
// error: 打开数据库时的错误。
func (s *Sqlite3Impl) Open(path string) error {
	// 打开数据库
	var err error
	s.db, err = sql.Open("sqlite3", path)
	if err == nil {
		s.log("Sqlite3 Is Open")
	} else {
		s.log(fmt.Sprintf("Open sqlite3 error: %v", err))
	}

	return err
}

// Close 关闭数据库
func (s *Sqlite3Impl) Close() {
	s.log("Sqlite3 Is Closed")

	s.db.Close()
}

// createTable is 创建数据表
// func (s *Sqlite3Impl) createTable() {
// 	var err error
// 	err = createTable(SQLCommandUser)
// 	s.log(fmt.Sprintf("error: %v, %s", err, SQLTableUser))
// 	err = createTable(SQLCommandUserChatGroup)
// 	s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatGroup))
// 	err = createTable(SQLCommandUserChatGroupMember)
// 	s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatGroupMember))
// 	err = createTable(SQLCommandUserChatMsg)
// 	s.log(fmt.Sprintf("error: %v, %s", err, SQLTableChatMsg))
// 	err = createTable(SQLCommandFriends)
// 	s.log(fmt.Sprintf("error: %v, %s", err, SQLTableFriends))
// }
func (s *Sqlite3Impl) createTable(cmd string) error {
	_, err := s.db.Exec(cmd)
	return err
}

// UpdateOrDelete is run sql command
//
// Example:
//
// 	delete:
//	err := UpdateOrDelete(fmt.Spintf("DELETE FROM UserTable1 WHERE id=?", id))
//
//	update:
//	err := UpdateOrDelete(fmt.Spintf("UPDATE UserTable1 SET userName=%s,password=%s WHERE id=%d", "user2", "password2", id)
//
func (s *Sqlite3Impl) UpdateOrDelete(prepare string, param ...interface{}) (int64, error) {
	//插入数据
	stmt, err := s.db.Prepare(prepare)
	if err != nil {
		return -1, err
	}
	defer stmt.Close()

	res, err := stmt.Exec(param)
	if err != nil {
		return -1, err
	}

	id, err := res.RowsAffected()
	if err != nil {
		return -1, err
	}

	return id, err
}

// Insert is
func (s *Sqlite3Impl) Insert(prepare string, param ...interface{}) (int64, error) {
	//插入数据
	stmt, err := s.db.Prepare(prepare)
	if err != nil {
		return -1, err
	}
	defer stmt.Close()

	res, err := stmt.Exec(param)
	if err != nil {
		return -1, err
	}

	id, err := res.LastInsertId()
	if err != nil {
		return -1, err
	}

	return id, err
}

// Get is get data base
//
// Example:
// var cmd = fmt.Sprintf("SELECT id,userName,password FROM UserTable1 WHERE id=%d", user.id)
// err := Get(cmd, func(p ...interface{}){
// 	for key, value := range param {
// 		fmt.Print("", key, value)
// 	}
//}, &userName, &password)
//
func (s *Sqlite3Impl) Get(cmd string, f func(...interface{}), param ...interface{}) error {
	rows, err := s.db.Query(cmd)
	if err != nil {
		s.log(fmt.Sprintf("Get error : %v", err))
		return err
	}

	defer rows.Close()

	for rows.Next() {
		err := rows.Scan(param)
		if err != nil {
			s.log(fmt.Sprintf("Get error : %v", err))
			return err
		}

		f(param)
	}

	return nil
}

这个代码基本都是百度的,拿来封装了下.
这个不是我们的核心,因为这个真没什么东西,就是一个简单的sqlite3的操作

为啥要用sqlite3呢?

  1. 因为这个库简单呀,系统自带,不用安装。
  2. 不用配置
  3. 同样可以学习数据库的知识(sql语句)

核心来了sqlCommon.go

这个才是重点;

  1. 定义了五个数据库。
  2. 定义了功能;注册/创建聊天组/添加删除组员/添加好友/
package sql

// sql names define
const (

	// 数据库名称
	SQLDataBaseName = "LineChat.db"

	// 用户表
	//
	// 用来保存用户的信息,用户名密码等.
	SQLTableUser = "ChatUser"

	// 聊天组表
	//
	// 用来保存用户聊天组的信息。
	SQLTableChatGroup = "ChatGroup"

	// 聊天组表
	//
	// 用来保存用户聊天组组员的信息。
	SQLTableChatGroupMember = "ChatGroupMember"

	// 聊天内容信息表
	//
	// 用来保存各组的聊天信息的表.
	SQLTableChatMsg = "ChatMsg"

	// 好友信息表
	//
	// 用来保存好友信息的表.
	SQLTableFriends = "ChatFriends"
)

// create database and tables sql command
const (
	// create User Table's sql command
	//
	// table member item info:
	// id :
	// userName : 用户名
	// password : 密码
	// sex : 性别
	// name : 显示的名称
	// age : 年龄
	// icon : 头像路径
	// signature : 个性签名
	// joinDate : 创建日期时间
	// lastDate : 最后一次登陆日期时间
	// status : 当前状态, 0: 离线 1: 在线  2: 隐身 3: 免打扰 等等..
	SQLCommandUser = "CREATE TABLE IF NOT EXISTS " + SQLTableUser +
		`(
			"id" INTEGER PRIMARY KEY AUTOINCREMENT,
			"userName" varchar(30) unique,
			"password" varchar(30),
			"sex" int(2) default 0,
			"name" varchar(20) NULL,
			"age" TIMESTAMP default (datetime('now', 'localtime')) ,
			"icon" varchar (200) NULL,
			"signature" varchar (500) NULL,
			"joinDate" TIMESTAMP default (datetime('now', 'localtime')),
			"lastDate" TIMESTAMP default (datetime('now', 'localtime')),
			"status" int(5) default 0
		); 
		` +
		"CREATE INDEX IF NOT EXISTS User ON " + SQLTableUser + "(userName);"

	// create User Chat Group Table's sql command
	//
	// table member item info:
	// id :
	// name : 组名称。
	// signature: 组介绍,个性签名
	// max: 最大个数
	// icon: 图标路径
	// createDate: 创建时间
	// type: 组类型,0: 一对一, 1:群(qq)  2:讨论组(qq),3: 公众号 ...等等
	SQLCommandUserChatGroup = "CREATE TABLE IF NOT EXISTS " + SQLTableChatGroup +
		`(
			"id" INTEGER PRIMARY KEY AUTOINCREMENT,
			"name" varchar(20) default NULL,
			"signature" varchar(500) default NULL,
			"max" int(8) default 100,
			"type" int(8) default 0,
			"icon" varchar(200) default NULL,
			"createDate" TIMESTAMP default (datetime('now', 'localtime'))
		);
	`

	// create User Chat Group member Table's sql command
	//
	// table member item info:
	// id :
	// userName : 用户名。
	// joinDate: 进入组时间。
	SQLCommandUserChatGroupMember = "CREATE TABLE IF NOT EXISTS " + SQLTableChatGroupMember +
		`(
			"id" INTEGER PRIMARY KEY AUTOINCREMENT,
			"groupId"  INTEGER,
			"userName" varchar(30) not null,
			"joinDate" TIMESTAMP default (datetime('now', 'localtime'))
		);
	` +
		"CREATE INDEX IF NOT EXISTS MemberUser ON " + SQLTableChatGroupMember + "(userName);" +
		"CREATE INDEX IF NOT EXISTS MemberGroupId ON " + SQLTableChatGroupMember + "(groupId);"

	// create User Chat Group member Table's sql command
	//
	// table member item info:
	// id :
	// userName : 发送消息的用户。
	// sendDate: 发送的时间。
	// comment: 发送的内容, 可能是文件,或者图片路径或者网页路径等。
	// type: 消息类型: 0: text 1: picture 2: audio 3: video 4: web page,5: 添加好友
	SQLCommandUserChatMsg = "CREATE TABLE IF NOT EXISTS " + SQLTableChatMsg +
		`(
			"id" INTEGER PRIMARY KEY AUTOINCREMENT,
			"userName" varchar(30) not null,
			"sendDate" TIMESTAMP default (datetime('now', 'localtime')),
			"comment" TEXT,
			"type" int default 0
		);
	` +
		"CREATE INDEX IF NOT EXISTS MsgUser ON " + SQLTableChatMsg + "(userName);"

	// create User Friends Table's sql command
	//
	// table friends info:
	// id :
	// userName1: user 1
	// userName2: user 2
	// joniDate: 成为好友的时间。
	SQLCommandFriends = "CREATE TABLE IF NOT EXISTS " + SQLTableFriends +
		`(
			"id" INTEGER PRIMARY KEY AUTOINCREMENT,
			"userName1" varchar(30) not null,
			"userName2" varchar(30) not null,
			"joniDate" TIMESTAMP default (datetime('now', 'localtime'))
		);
	` +
		"CREATE INDEX IF NOT EXISTS FriendsUser ON " + SQLTableFriends + "(userName1, userName2);"
)

猜你喜欢

转载自blog.csdn.net/dkaily1314/article/details/89302688