2017-09-13 15:09:13 +00:00
/ *
*
2022-02-21 03:32:53 +00:00
* Gosora Topic Store
* Copyright Azareal 2017 - 2020
2017-09-13 15:09:13 +00:00
*
* /
2017-11-10 03:33:11 +00:00
package common
2017-06-13 07:12:58 +00:00
2017-09-15 22:20:01 +00:00
import (
2022-02-21 03:53:13 +00:00
"database/sql"
"errors"
"strconv"
"strings"
2017-09-15 22:20:01 +00:00
2022-02-21 03:53:13 +00:00
qgen "git.tuxpa.in/a/gosora/query_gen"
2017-09-15 22:20:01 +00:00
)
2017-06-13 07:12:58 +00:00
2017-09-10 16:57:22 +00:00
// TODO: Add the watchdog goroutine
2017-09-15 22:20:01 +00:00
// TODO: Add some sort of update method
2017-09-18 17:03:52 +00:00
// ? - Should we add stick, lock, unstick, and unlock methods? These might be better on the Topics not the TopicStore
2017-11-11 04:06:16 +00:00
var Topics TopicStore
Added Quick Topic.
Added Attachments.
Added Attachment Media Embeds.
Renamed a load of *Store and *Cache methods to reduce the amount of unneccesary typing.
Added petabytes as a unit and cleaned up a few of the friendly units.
Refactored the username change logic to make it easier to maintain.
Refactored the avatar change logic to make it easier to maintain.
Shadow now uses CSS Variables for most of it's colours. We have plans to transpile this to support older browsers later on!
Snuck some CSS Variables into Tempra Conflux.
Added the GroupCache interface to MemoryGroupStore.
Added the Length method to MemoryGroupStore.
Added support for a site short name.
Added the UploadFiles permission.
Renamed more functions.
Fixed the background for the left gutter on the postbit for Tempra Simple and Shadow.
Added support for if statements operating on int8, int16, int32, int32, int64, uint, uint8, uint16, uint32, uint64, float32, and float64 for the template compiler.
Added support for if statements operating on slices and maps for the template compiler.
Fixed a security exploit in reply editing.
Fixed a bug in the URL detector in the parser where it couldn't find URLs with non-standard ports.
Fixed buttons having blue outlines on focus on Shadow.
Refactored the topic creation logic to make it easier to maintain.
Made a few responsive fixes, but there's still more to do in the following commits!
2017-10-05 10:20:28 +00:00
var ErrNoTitle = errors . New ( "This message is missing a title" )
2018-03-17 08:16:43 +00:00
var ErrLongTitle = errors . New ( "The title is too long" )
Added Quick Topic.
Added Attachments.
Added Attachment Media Embeds.
Renamed a load of *Store and *Cache methods to reduce the amount of unneccesary typing.
Added petabytes as a unit and cleaned up a few of the friendly units.
Refactored the username change logic to make it easier to maintain.
Refactored the avatar change logic to make it easier to maintain.
Shadow now uses CSS Variables for most of it's colours. We have plans to transpile this to support older browsers later on!
Snuck some CSS Variables into Tempra Conflux.
Added the GroupCache interface to MemoryGroupStore.
Added the Length method to MemoryGroupStore.
Added support for a site short name.
Added the UploadFiles permission.
Renamed more functions.
Fixed the background for the left gutter on the postbit for Tempra Simple and Shadow.
Added support for if statements operating on int8, int16, int32, int32, int64, uint, uint8, uint16, uint32, uint64, float32, and float64 for the template compiler.
Added support for if statements operating on slices and maps for the template compiler.
Fixed a security exploit in reply editing.
Fixed a bug in the URL detector in the parser where it couldn't find URLs with non-standard ports.
Fixed buttons having blue outlines on focus on Shadow.
Refactored the topic creation logic to make it easier to maintain.
Made a few responsive fixes, but there's still more to do in the following commits!
2017-10-05 10:20:28 +00:00
var ErrNoBody = errors . New ( "This message is missing a body" )
2017-06-13 07:12:58 +00:00
type TopicStore interface {
2022-02-21 03:32:53 +00:00
DirtyGet ( id int ) * Topic
Get ( id int ) ( * Topic , error )
BypassGet ( id int ) ( * Topic , error )
BulkGetMap ( ids [ ] int ) ( list map [ int ] * Topic , err error )
Exists ( id int ) bool
Create ( fid int , name , content string , uid int , ip string ) ( tid int , err error )
AddLastTopic ( t * Topic , fid int ) error // unimplemented
Reload ( id int ) error // Too much SQL logic to move into TopicCache
// TODO: Implement these two methods
//Replies(tid int) ([]*Reply, error)
//RepliesRange(tid, lower, higher int) ([]*Reply, error)
Count ( ) int
CountUser ( uid int ) int
CountMegaUser ( uid int ) int
CountBigUser ( uid int ) int
ClearIPs ( ) error
LockMany ( tids [ ] int ) error
SetCache ( cache TopicCache )
GetCache ( ) TopicCache
2017-06-13 07:12:58 +00:00
}
2017-11-23 05:37:08 +00:00
type DefaultTopicStore struct {
2022-02-21 03:32:53 +00:00
cache TopicCache
2017-11-23 05:37:08 +00:00
2022-02-21 03:32:53 +00:00
get * sql . Stmt
exists * sql . Stmt
count * sql . Stmt
countUser * sql . Stmt
countWordUser * sql . Stmt
create * sql . Stmt
2021-04-27 10:20:26 +00:00
2022-02-21 03:32:53 +00:00
clearIPs * sql . Stmt
lockTen * sql . Stmt
2017-06-13 07:12:58 +00:00
}
2017-11-23 05:37:08 +00:00
// NewDefaultTopicStore gives you a new instance of DefaultTopicStore
func NewDefaultTopicStore ( cache TopicCache ) ( * DefaultTopicStore , error ) {
2022-02-21 03:32:53 +00:00
acc := qgen . NewAcc ( )
if cache == nil {
cache = NewNullTopicCache ( )
}
t := "topics"
return & DefaultTopicStore {
cache : cache ,
get : acc . Select ( t ) . Columns ( "title,content,createdBy,createdAt,lastReplyBy,lastReplyAt,lastReplyID,is_closed,sticky,parentID,ip,views,postCount,likeCount,attachCount,poll,data" ) . Where ( "tid=?" ) . Stmt ( ) ,
exists : acc . Exists ( t , "tid" ) . Stmt ( ) ,
count : acc . Count ( t ) . Stmt ( ) ,
countUser : acc . Count ( t ) . Where ( "createdBy=?" ) . Stmt ( ) ,
countWordUser : acc . Count ( t ) . Where ( "createdBy=? AND words>=?" ) . Stmt ( ) ,
create : acc . Insert ( t ) . Columns ( "parentID,title,content,parsed_content,createdAt,lastReplyAt,lastReplyBy,ip,words,createdBy" ) . Fields ( "?,?,?,?,UTC_TIMESTAMP(),UTC_TIMESTAMP(),?,?,?,?" ) . Prepare ( ) ,
clearIPs : acc . Update ( t ) . Set ( "ip=''" ) . Where ( "ip!=''" ) . Stmt ( ) ,
lockTen : acc . Update ( t ) . Set ( "is_closed=1" ) . Where ( "tid IN(" + inqbuild2 ( 10 ) + ")" ) . Stmt ( ) ,
} , acc . FirstError ( )
2017-06-13 07:12:58 +00:00
}
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) DirtyGet ( id int ) * Topic {
2022-02-21 03:32:53 +00:00
t , e := s . cache . Get ( id )
if e == nil {
return t
}
t , e = s . BypassGet ( id )
if e == nil {
_ = s . cache . Set ( t )
return t
}
return BlankTopic ( )
2017-11-11 04:06:16 +00:00
}
2017-11-23 05:37:08 +00:00
// TODO: Log weird cache errors?
2021-04-27 10:20:26 +00:00
func ( s * DefaultTopicStore ) Get ( id int ) ( t * Topic , e error ) {
2022-02-21 03:32:53 +00:00
t , e = s . cache . Get ( id )
if e == nil {
return t , nil
}
t , e = s . BypassGet ( id )
if e == nil {
_ = s . cache . Set ( t )
}
return t , e
2017-06-13 07:12:58 +00:00
}
2017-09-18 17:03:52 +00:00
// BypassGet will always bypass the cache and pull the topic directly from the database
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) BypassGet ( id int ) ( * Topic , error ) {
2022-02-21 03:32:53 +00:00
t := & Topic { ID : id }
e := s . get . QueryRow ( id ) . Scan ( & t . Title , & t . Content , & t . CreatedBy , & t . CreatedAt , & t . LastReplyBy , & t . LastReplyAt , & t . LastReplyID , & t . IsClosed , & t . Sticky , & t . ParentID , & t . IP , & t . ViewCount , & t . PostCount , & t . LikeCount , & t . AttachCount , & t . Poll , & t . Data )
if e == nil {
t . Link = BuildTopicURL ( NameToSlug ( t . Title ) , id )
}
return t , e
2017-06-13 07:12:58 +00:00
}
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
/ * func ( s * DefaultTopicStore ) GetByUser ( uid int ) ( list map [ int ] * Topic , err error ) {
2022-02-21 03:32:53 +00:00
t := & Topic { ID : id }
err := s . get . QueryRow ( id ) . Scan ( & t . Title , & t . Content , & t . CreatedBy , & t . CreatedAt , & t . LastReplyBy , & t . LastReplyAt , & t . LastReplyID , & t . IsClosed , & t . Sticky , & t . ParentID , & t . IP , & t . ViewCount , & t . PostCount , & t . LikeCount , & t . AttachCount , & t . Poll , & t . Data )
if err == nil {
t . Link = BuildTopicURL ( NameToSlug ( t . Title ) , id )
}
return t , err
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
} * /
2019-02-23 06:29:19 +00:00
// TODO: Avoid duplicating much of this logic from user_store.go
2021-04-27 10:20:26 +00:00
func ( s * DefaultTopicStore ) BulkGetMap ( ids [ ] int ) ( list map [ int ] * Topic , e error ) {
2022-02-21 03:32:53 +00:00
idCount := len ( ids )
list = make ( map [ int ] * Topic )
if idCount == 0 {
return list , nil
}
var stillHere [ ] int
sliceList := s . cache . BulkGet ( ids )
if len ( sliceList ) > 0 {
for i , sliceItem := range sliceList {
if sliceItem != nil {
list [ sliceItem . ID ] = sliceItem
} else {
stillHere = append ( stillHere , ids [ i ] )
}
}
ids = stillHere
}
// If every user is in the cache, then return immediately
if len ( ids ) == 0 {
return list , nil
} else if len ( ids ) == 1 {
t , e := s . Get ( ids [ 0 ] )
if e != nil {
return list , e
}
list [ t . ID ] = t
return list , nil
}
idList , q := inqbuild ( ids )
rows , e := qgen . NewAcc ( ) . Select ( "topics" ) . Columns ( "tid,title,content,createdBy,createdAt,lastReplyBy,lastReplyAt,lastReplyID,is_closed,sticky,parentID,ip,views,postCount,likeCount,attachCount,poll,data" ) . Where ( "tid IN(" + q + ")" ) . Query ( idList ... )
if e != nil {
return list , e
}
defer rows . Close ( )
for rows . Next ( ) {
t := & Topic { }
e := rows . Scan ( & t . ID , & t . Title , & t . Content , & t . CreatedBy , & t . CreatedAt , & t . LastReplyBy , & t . LastReplyAt , & t . LastReplyID , & t . IsClosed , & t . Sticky , & t . ParentID , & t . IP , & t . ViewCount , & t . PostCount , & t . LikeCount , & t . AttachCount , & t . Poll , & t . Data )
if e != nil {
return list , e
}
t . Link = BuildTopicURL ( NameToSlug ( t . Title ) , t . ID )
_ = s . cache . Set ( t )
list [ t . ID ] = t
}
if e = rows . Err ( ) ; e != nil {
return list , e
}
// Did we miss any topics?
if idCount > len ( list ) {
var sidList string
for i , id := range ids {
if _ , ok := list [ id ] ; ! ok {
if i == 0 {
sidList += strconv . Itoa ( id )
} else {
sidList += "," + strconv . Itoa ( id )
}
}
}
if sidList != "" {
e = errors . New ( "Unable to find topics with the following IDs: " + sidList )
}
}
return list , e
2019-02-23 06:29:19 +00:00
}
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) Reload ( id int ) error {
2022-02-21 03:32:53 +00:00
t , e := s . BypassGet ( id )
if e == nil {
_ = s . cache . Set ( t )
} else {
_ = s . cache . Remove ( id )
}
TopicListThaw . Thaw ( )
return e
2017-06-13 07:12:58 +00:00
}
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) Exists ( id int ) bool {
2022-02-21 03:32:53 +00:00
return s . exists . QueryRow ( id ) . Scan ( & id ) == nil
2017-09-15 22:20:01 +00:00
}
2021-04-27 10:20:26 +00:00
func ( s * DefaultTopicStore ) ClearIPs ( ) error {
2022-02-21 03:32:53 +00:00
_ , e := s . clearIPs . Exec ( )
return e
2021-04-27 10:20:26 +00:00
}
func ( s * DefaultTopicStore ) LockMany ( tids [ ] int ) ( e error ) {
2022-02-21 03:32:53 +00:00
tc , i := Topics . GetCache ( ) , 0
singles := func ( ) error {
for ; i < len ( tids ) ; i ++ {
_ , e := topicStmts . lock . Exec ( tids [ i ] )
if e != nil {
return e
}
}
return nil
}
if len ( tids ) < 10 {
if e = singles ( ) ; e != nil {
return e
}
if tc != nil {
_ = tc . RemoveMany ( tids )
}
TopicListThaw . Thaw ( )
return nil
}
for ; ( i + 10 ) < len ( tids ) ; i += 10 {
_ , e := s . lockTen . Exec ( tids [ i ] , tids [ i + 1 ] , tids [ i + 2 ] , tids [ i + 3 ] , tids [ i + 4 ] , tids [ i + 5 ] , tids [ i + 6 ] , tids [ i + 7 ] , tids [ i + 8 ] , tids [ i + 9 ] )
if e != nil {
return e
}
}
if e = singles ( ) ; e != nil {
return e
}
if tc != nil {
_ = tc . RemoveMany ( tids )
}
TopicListThaw . Thaw ( )
return nil
2021-04-27 10:20:26 +00:00
}
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
func ( s * DefaultTopicStore ) Create ( fid int , name , content string , uid int , ip string ) ( tid int , err error ) {
2022-02-21 03:32:53 +00:00
if name == "" {
return 0 , ErrNoTitle
}
// ? This number might be a little screwy with Unicode, but it's the only consistent thing we have, as Unicode characters can be any number of bytes in theory?
if len ( name ) > Config . MaxTopicTitleLength {
return 0 , ErrLongTitle
}
parsedContent := strings . TrimSpace ( ParseMessage ( content , fid , "forums" , nil , nil ) )
if parsedContent == "" {
return 0 , ErrNoBody
}
// TODO: Move this statement into the topic store
if Config . DisablePostIP {
ip = ""
}
res , err := s . create . Exec ( fid , name , content , parsedContent , uid , ip , WordCount ( content ) , uid )
if err != nil {
return 0 , err
}
lastID , err := res . LastInsertId ( )
if err != nil {
return 0 , err
}
tid = int ( lastID )
//TopicListThaw.Thaw() // redundant
return tid , Forums . AddTopic ( tid , uid , fid )
2017-06-13 07:12:58 +00:00
}
2017-09-15 22:20:01 +00:00
// ? - What is this? Do we need it? Should it be in the main store interface?
2019-10-30 03:52:04 +00:00
func ( s * DefaultTopicStore ) AddLastTopic ( t * Topic , fid int ) error {
2022-02-21 03:32:53 +00:00
// Coming Soon...
return nil
2017-06-13 07:12:58 +00:00
}
2019-06-01 12:31:48 +00:00
// Count returns the total number of topics on these forums
func ( s * DefaultTopicStore ) Count ( ) ( count int ) {
2022-02-21 03:32:53 +00:00
return Countf ( s . count )
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
}
func ( s * DefaultTopicStore ) CountUser ( uid int ) ( count int ) {
2022-02-21 03:32:53 +00:00
return Countf ( s . countUser , uid )
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
}
func ( s * DefaultTopicStore ) CountMegaUser ( uid int ) ( count int ) {
2022-02-21 03:32:53 +00:00
return Countf ( s . countWordUser , uid , SettingBox . Load ( ) . ( SettingMap ) [ "megapost_min_words" ] . ( int ) )
Cascade delete attachments properly.
Cascade delete replied to topic events for replies properly.
Cascade delete likes on topic posts properly.
Cascade delete replies and their children properly.
Recalculate user stats properly when items are deleted.
Users can now unlike topic opening posts.
Add a recalculator to fix abnormalities across upgrades.
Try fixing a last_ip daily update bug.
Add Existable interface.
Add Delete method to LikeStore.
Add Each, Exists, Create, CountUser, CountMegaUser and CountBigUser methods to ReplyStore.
Add CountUser, CountMegaUser, CountBigUser methods to TopicStore.
Add Each method to UserStore.
Add Add, Delete and DeleteResource methods to SubscriptionStore.
Add Delete, DeleteByParams, DeleteByParamsExtra and AidsByParamsExtra methods to ActivityStream.
Add Exists method to ProfileReplyStore.
Add DropColumn, RenameColumn and ChangeColumn to the database adapters.
Shorten ipaddress column names to ip.
- topics table.
- replies table
- users_replies table.
- polls_votes table.
Add extra column to activity_stream table.
Fix an issue upgrading sites to MariaDB 10.3 from older versions of Gosora. Please report any other issues you find.
You need to run the updater / patcher for this commit.
2020-01-31 07:22:08 +00:00
}
func ( s * DefaultTopicStore ) CountBigUser ( uid int ) ( count int ) {
2022-02-21 03:32:53 +00:00
return Countf ( s . countWordUser , uid , SettingBox . Load ( ) . ( SettingMap ) [ "bigpost_min_words" ] . ( int ) )
2017-09-15 22:20:01 +00:00
}
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) SetCache ( cache TopicCache ) {
2022-02-21 03:32:53 +00:00
s . cache = cache
2017-06-13 07:12:58 +00:00
}
2017-11-23 05:37:08 +00:00
// TODO: We're temporarily doing this so that you can do tcache != nil in getTopicUser. Refactor it.
2019-06-04 05:48:12 +00:00
func ( s * DefaultTopicStore ) GetCache ( ) TopicCache {
2022-02-21 03:32:53 +00:00
_ , ok := s . cache . ( * NullTopicCache )
if ok {
return nil
}
return s . cache
2020-01-02 21:52:41 +00:00
}