//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" }