Skip to content

Commit 1ed4862

Browse files
author
Jeff Yanta
committed
Address todos relating to copying pointer values in chat store
1 parent f2f99d6 commit 1ed4862

File tree

4 files changed

+112
-22
lines changed

4 files changed

+112
-22
lines changed

pkg/code/data/chat/v2/id.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ func (c ChatId) Validate() error {
4848
return nil
4949
}
5050

51+
// Clone clones a chat ID
52+
func (c ChatId) Clone() ChatId {
53+
var cloned ChatId
54+
copy(cloned[:], c[:])
55+
return cloned
56+
}
57+
5158
// String returns the string representation of a ChatId
5259
func (c ChatId) String() string {
5360
return hex.EncodeToString(c[:])
@@ -102,6 +109,13 @@ func (m MemberId) Validate() error {
102109
return nil
103110
}
104111

112+
// Clone clones a chat member ID
113+
func (m MemberId) Clone() MemberId {
114+
var cloned MemberId
115+
copy(cloned[:], m[:])
116+
return cloned
117+
}
118+
105119
// String returns the string representation of a MemberId
106120
func (m MemberId) String() string {
107121
return uuid.UUID(m).String()
@@ -218,6 +232,13 @@ func (m MessageId) Validate() error {
218232
return nil
219233
}
220234

235+
// Clone clones a chat message ID
236+
func (m MessageId) Clone() MessageId {
237+
var cloned MessageId
238+
copy(cloned[:], m[:])
239+
return cloned
240+
}
241+
221242
// String returns the string representation of a MessageId
222243
func (m MessageId) String() string {
223244
return uuid.UUID(m).String()

pkg/code/data/chat/v2/memory/store.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,11 @@ func (s *store) AdvancePointer(_ context.Context, chatId chat.ChatId, memberId c
202202

203203
switch pointerType {
204204
case chat.PointerTypeDelivered:
205-
item.DeliveryPointer = &pointer // todo: pointer copy safety
205+
cloned := pointer.Clone()
206+
item.DeliveryPointer = &cloned
206207
case chat.PointerTypeRead:
207-
item.ReadPointer = &pointer // todo: pointer copy safety
208+
cloned := pointer.Clone()
209+
item.ReadPointer = &cloned
208210
}
209211

210212
return nil

pkg/code/data/chat/v2/model.go

Lines changed: 57 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
chatpb "github.com/code-payments/code-protobuf-api/generated/go/chat/v2"
1212
)
1313

14-
type ChatType int
14+
type ChatType uint8
1515

1616
const (
1717
ChatTypeUnknown ChatType = iota
@@ -20,15 +20,15 @@ const (
2020
// ChatTypeGroup
2121
)
2222

23-
type ReferenceType int
23+
type ReferenceType uint8
2424

2525
const (
2626
ReferenceTypeUnknown ReferenceType = iota
2727
ReferenceTypeIntent
2828
ReferenceTypeSignature
2929
)
3030

31-
type PointerType int
31+
type PointerType uint8
3232

3333
const (
3434
PointerTypeUnknown PointerType = iota
@@ -37,7 +37,7 @@ const (
3737
PointerTypeRead
3838
)
3939

40-
type Platform int
40+
type Platform uint8
4141

4242
const (
4343
PlatformUnknown Platform = iota
@@ -256,6 +256,18 @@ func (r *MemberRecord) Validate() error {
256256

257257
// Clone clones a member record
258258
func (r *MemberRecord) Clone() MemberRecord {
259+
var deliveryPointerCopy *MessageId
260+
if r.DeliveryPointer != nil {
261+
cloned := r.DeliveryPointer.Clone()
262+
deliveryPointerCopy = &cloned
263+
}
264+
265+
var readPointerCopy *MessageId
266+
if r.ReadPointer != nil {
267+
cloned := r.ReadPointer.Clone()
268+
readPointerCopy = &cloned
269+
}
270+
259271
return MemberRecord{
260272
Id: r.Id,
261273
ChatId: r.ChatId,
@@ -264,8 +276,8 @@ func (r *MemberRecord) Clone() MemberRecord {
264276
Platform: r.Platform,
265277
PlatformId: r.PlatformId,
266278

267-
DeliveryPointer: r.DeliveryPointer, // todo: pointer copy safety
268-
ReadPointer: r.ReadPointer, // todo: pointer copy safety
279+
DeliveryPointer: deliveryPointerCopy,
280+
ReadPointer: readPointerCopy,
269281

270282
IsMuted: r.IsMuted,
271283
IsUnsubscribed: r.IsUnsubscribed,
@@ -283,8 +295,14 @@ func (r *MemberRecord) CopyTo(dst *MemberRecord) {
283295
dst.Platform = r.Platform
284296
dst.PlatformId = r.PlatformId
285297

286-
dst.DeliveryPointer = r.DeliveryPointer // todo: pointer copy safety
287-
dst.ReadPointer = r.ReadPointer // todo: pointer copy safety
298+
if r.DeliveryPointer != nil {
299+
cloned := r.DeliveryPointer.Clone()
300+
dst.DeliveryPointer = &cloned
301+
}
302+
if r.ReadPointer != nil {
303+
cloned := r.ReadPointer.Clone()
304+
dst.ReadPointer = &cloned
305+
}
288306

289307
dst.IsMuted = r.IsMuted
290308
dst.IsUnsubscribed = r.IsUnsubscribed
@@ -350,21 +368,34 @@ func (r *MessageRecord) Validate() error {
350368

351369
// Clone clones a message record
352370
func (r *MessageRecord) Clone() MessageRecord {
371+
var senderCopy *MemberId
372+
if r.Sender != nil {
373+
cloned := r.Sender.Clone()
374+
senderCopy = &cloned
375+
}
376+
377+
dataCopy := make([]byte, len(r.Data))
378+
copy(dataCopy, r.Data)
379+
380+
var referenceTypeCopy *ReferenceType
381+
if r.ReferenceType != nil {
382+
cloned := *r.ReferenceType
383+
referenceTypeCopy = &cloned
384+
}
385+
353386
return MessageRecord{
354387
Id: r.Id,
355388
ChatId: r.ChatId,
356389
MessageId: r.MessageId,
357390

358-
Sender: r.Sender, // todo: pointer copy safety
391+
Sender: senderCopy,
359392

360-
Data: r.Data, // todo: pointer copy safety
393+
Data: dataCopy,
361394

362-
ReferenceType: r.ReferenceType, // todo: pointer copy safety
363-
Reference: r.Reference, // todo: pointer copy safety
395+
ReferenceType: referenceTypeCopy,
396+
Reference: pointer.StringCopy(r.Reference),
364397

365398
IsSilent: r.IsSilent,
366-
367-
// todo: finish implementing me
368399
}
369400
}
370401

@@ -374,16 +405,22 @@ func (r *MessageRecord) CopyTo(dst *MessageRecord) {
374405
dst.ChatId = r.ChatId
375406
dst.MessageId = r.MessageId
376407

377-
dst.Sender = r.Sender // todo: pointer copy safety
408+
if r.Sender != nil {
409+
cloned := r.Sender.Clone()
410+
dst.Sender = &cloned
411+
}
378412

379-
dst.Data = r.Data // todo: pointer copy safety
413+
dataCopy := make([]byte, len(r.Data))
414+
copy(dataCopy, r.Data)
415+
dst.Data = dataCopy
380416

381-
dst.ReferenceType = r.ReferenceType // todo: pointer copy safety
382-
dst.Reference = r.Reference // todo: pointer copy safety
417+
if r.ReferenceType != nil {
418+
cloned := *r.ReferenceType
419+
dst.ReferenceType = &cloned
420+
}
421+
dst.Reference = pointer.StringCopy(r.Reference)
383422

384423
dst.IsSilent = r.IsSilent
385-
386-
// todo: finish implementing me
387424
}
388425

389426
// GetTimestamp gets the timestamp for a message record

pkg/pointer/pointer.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,36 @@ func StringCopy(value *string) *string {
3232
return String(*value)
3333
}
3434

35+
// Uint8 returns a pointer to the provided uint8 value
36+
func Uint8(value uint8) *uint8 {
37+
return &value
38+
}
39+
40+
// Uint8OrDefault returns the pointer if not nil, otherwise the default value
41+
func Uint8OrDefault(value *uint8, defaultValue uint8) *uint8 {
42+
if value != nil {
43+
return value
44+
}
45+
return &defaultValue
46+
}
47+
48+
// Uint8IfValid returns a pointer to the value if it's valid, otherwise nil
49+
func Uint8IfValid(valid bool, value uint8) *uint8 {
50+
if valid {
51+
return &value
52+
}
53+
return nil
54+
}
55+
56+
// Uint8Copy returns a pointer that's a copy of the provided value
57+
func Uint8Copy(value *uint8) *uint8 {
58+
if value == nil {
59+
return nil
60+
}
61+
62+
return Uint8(*value)
63+
}
64+
3565
// Uint64 returns a pointer to the provided uint64 value
3666
func Uint64(value uint64) *uint64 {
3767
return &value

0 commit comments

Comments
 (0)