73 lines
2.1 KiB
Go
73 lines
2.1 KiB
Go
//go:build mysql
|
|
// +build mysql
|
|
|
|
package mysql
|
|
|
|
import (
|
|
"fmt"
|
|
"regexp"
|
|
|
|
t "github.com/tinode/chat/server/store/types"
|
|
)
|
|
|
|
var (
|
|
tenantTopicsTableRE = regexp.MustCompile(`\bim_topics\b`)
|
|
tenantGroupMembersTableRE = regexp.MustCompile(`\bim_group_members\b`)
|
|
tenantSubscriptionsTableRE = regexp.MustCompile(`\bim_subscriptions\b`)
|
|
tenantSystemNotificationsTableRE = regexp.MustCompile(`\bim_system_notifications\b`)
|
|
)
|
|
|
|
func tenantShardSQL(tenantID t.TenantID, query string) string {
|
|
query = tenantTopicsTableRE.ReplaceAllString(query, tenantTopicsTable(tenantID))
|
|
query = tenantGroupMembersTableRE.ReplaceAllString(query, tenantGroupMembersTable(tenantID))
|
|
query = tenantSubscriptionsTableRE.ReplaceAllString(query, tenantSubscriptionsTable(tenantID))
|
|
return tenantSystemNotificationsTableRE.ReplaceAllString(query, tenantSystemNotificationsTable(tenantID))
|
|
}
|
|
|
|
func tenantTablePrefix(tenantID t.TenantID) string {
|
|
return fmt.Sprintf("im_%03d_", tenantID)
|
|
}
|
|
|
|
func tenantFriendshipsTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "friendships"
|
|
}
|
|
|
|
func tenantMessagesTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "messages"
|
|
}
|
|
|
|
func tenantTopicsTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "topics"
|
|
}
|
|
|
|
func tenantGroupMembersTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "group_members"
|
|
}
|
|
|
|
func tenantSubscriptionsTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "subscriptions"
|
|
}
|
|
|
|
func tenantSystemNotificationsTable(tenantID t.TenantID) string {
|
|
return tenantTablePrefix(tenantID) + "system_notifications"
|
|
}
|
|
|
|
func tenantGroupMessagesTable(tenantID t.TenantID, month string) (string, bool) {
|
|
if !validShardMonth(month) {
|
|
return "", false
|
|
}
|
|
return fmt.Sprintf("%sgroup_messages_%s", tenantTablePrefix(tenantID), month), true
|
|
}
|
|
|
|
func validShardMonth(month string) bool {
|
|
if len(month) != 6 {
|
|
return false
|
|
}
|
|
for i := range month {
|
|
if month[i] < '0' || month[i] > '9' {
|
|
return false
|
|
}
|
|
}
|
|
return month[4:] >= "01" && month[4:] <= "12"
|
|
}
|