Compare commits

..

No commits in common. "master" and "v1.0.0" have entirely different histories.

5 changed files with 302 additions and 453 deletions

View File

@ -8,7 +8,6 @@ import (
"git.bit5.ru/backend/meta" "git.bit5.ru/backend/meta"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
) )
type DataCollection struct { type DataCollection struct {
@ -42,10 +41,7 @@ func (coll *DataCollection) Save(ctx context.Context) error {
fields := coll.GetDbFields() fields := coll.GetDbFields()
countFields := len(fields) countFields := len(fields)
if countFields == 0 { if countFields == 0 {
err := errors.New("Fields list is empty") return errors.New("Fields list is empty")
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
countRows := len(coll.Items) countRows := len(coll.Items)
@ -64,21 +60,10 @@ func (coll *DataCollection) Save(ctx context.Context) error {
// NOTE: performance fix: if none of rows have mask we can save all data by one sql query // NOTE: performance fix: if none of rows have mask we can save all data by one sql query
if allDataWithoutMask { if allDataWithoutMask {
if err := coll.saveWithoutMask(ctx); err != nil { return coll.saveWithoutMask(ctx)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
return nil
} }
if err := coll.saveByMask(ctx); err != nil { return coll.saveByMask(ctx)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
}
return nil
} }
func (coll *DataCollection) saveByMask(ctx context.Context) error { func (coll *DataCollection) saveByMask(ctx context.Context) error {
@ -92,8 +77,7 @@ func (coll *DataCollection) saveByMask(ctx context.Context) error {
tableName := coll.GetTableName() tableName := coll.GetTableName()
span.SetAttributes( span.SetAttributes(
attribute.String("table", tableName), attribute.String("db.sql.table", tableName),
attribute.Int("field_amount", countFields),
) )
for _, item := range coll.Items { for _, item := range coll.Items {
@ -126,10 +110,7 @@ func (coll *DataCollection) saveByMask(ctx context.Context) error {
log_len = 200 log_len = 200
} }
resultErr := errors.Errorf("%s (%s)", err.Error(), sqlSmt[0:log_len]) return errors.Errorf("%s (%s)", err.Error(), sqlSmt[0:log_len])
span.RecordError(resultErr)
span.SetStatus(codes.Error, resultErr.Error())
return resultErr
} }
} }
return nil return nil
@ -147,7 +128,7 @@ func (coll *DataCollection) saveWithoutMask(ctx context.Context) error {
countRows := len(coll.Items) countRows := len(coll.Items)
span.SetAttributes( span.SetAttributes(
attribute.String("table", tableName), attribute.String("db.sql.table", tableName),
attribute.Int("field_amount", countFields), attribute.Int("field_amount", countFields),
attribute.Int("item_amount", countRows), attribute.Int("item_amount", countRows),
) )
@ -162,10 +143,7 @@ func (coll *DataCollection) saveWithoutMask(ctx context.Context) error {
if ownerValue == uint32(0) { if ownerValue == uint32(0) {
rows[start+coll.ownerFieldIndex] = coll.OwnerId rows[start+coll.ownerFieldIndex] = coll.OwnerId
} else if ownerValue != coll.OwnerId { } else if ownerValue != coll.OwnerId {
err := errors.Errorf("Wrong owner_id in %s value %d (!= %d)", tableName, ownerValue, coll.OwnerId) return errors.Errorf("Wrong owner_id in %s value %d (!= %d)", tableName, ownerValue, coll.OwnerId)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
offset++ offset++
} }
@ -173,10 +151,7 @@ func (coll *DataCollection) saveWithoutMask(ctx context.Context) error {
sqlSmt := createInsertSQLForFields(ctx, tableName, fields, countRows) sqlSmt := createInsertSQLForFields(ctx, tableName, fields, countRows)
_, err := coll.Db.UpdateBySQL(sqlSmt, rows...).Exec() _, err := coll.Db.UpdateBySQL(sqlSmt, rows...).Exec()
if err != nil { if err != nil {
resultErr := errors.Errorf("error: %s, sql: %s", err.Error(), sqlSmt) return errors.Errorf("error: %s, sql: %s", err.Error(), sqlSmt)
span.RecordError(resultErr)
span.SetStatus(codes.Error, resultErr.Error())
return resultErr
} }
return nil return nil
} }

3
go.mod
View File

@ -3,11 +3,10 @@ module git.bit5.ru/backend/dbmeta
go 1.13 go 1.13
require ( require (
git.bit5.ru/backend/db v1.2.6 git.bit5.ru/backend/db v1.2.3
git.bit5.ru/backend/errors v1.0.0 git.bit5.ru/backend/errors v1.0.0
git.bit5.ru/backend/meta v1.0.0 git.bit5.ru/backend/meta v1.0.0
github.com/go-logr/stdr v1.2.2 github.com/go-logr/stdr v1.2.2
github.com/stretchr/testify v1.8.1 github.com/stretchr/testify v1.8.1
go.opentelemetry.io/otel v1.11.1 go.opentelemetry.io/otel v1.11.1
go.opentelemetry.io/otel/trace v1.11.1
) )

8
go.sum
View File

@ -1,7 +1,7 @@
git.bit5.ru/backend/db v1.2.6 h1:ANfRTQ+C4BaMKbG+7onjET7qCcsFwq71dbolt0Po7Y4= git.bit5.ru/backend/db v1.2.3 h1:FYGUbu7nYMny9CoTU6oLrJuQdn+xG42cAHkWI6JLGgE=
git.bit5.ru/backend/db v1.2.6/go.mod h1:+1VkFgSf3zkGlHmG3gw5HyWBoucZDQ+bixQ6rpO6AqU= git.bit5.ru/backend/db v1.2.3/go.mod h1:2PB9QennBZaH8u5i3IvnuVaWnAK5Ck5kCrJ9+5ZnQp8=
git.bit5.ru/backend/dbr v1.3.1 h1:O3fy+aztnNVzto/nMcydd9BVahAJTXPE8VuGY3dC1NY= git.bit5.ru/backend/dbr v1.2.0 h1:SQndOC9KW/jPGRSFSPYRqmMd+EHEyZHWDO9B+imEEzU=
git.bit5.ru/backend/dbr v1.3.1/go.mod h1:oVVFv6hIzFkO4Wy0KcS4CYqkBjW1kFHYNLcmKmDlPow= git.bit5.ru/backend/dbr v1.2.0/go.mod h1:3iCyHEkyj2M+lx3fSlv3lC1r5cLZZz+6QLVCml7ZAy8=
git.bit5.ru/backend/errors v1.0.0 h1:WWJ0sly44q1HQjN01X75ZAGKZwwY5Ml+XVDXMjCkToA= git.bit5.ru/backend/errors v1.0.0 h1:WWJ0sly44q1HQjN01X75ZAGKZwwY5Ml+XVDXMjCkToA=
git.bit5.ru/backend/errors v1.0.0/go.mod h1:75faRwsnpM0Se00/Bh7fysWQXV8oMjNJFQ6f7+r9k3Y= git.bit5.ru/backend/errors v1.0.0/go.mod h1:75faRwsnpM0Se00/Bh7fysWQXV8oMjNJFQ6f7+r9k3Y=
git.bit5.ru/backend/meta v1.0.0 h1:1mZgEoOSA/P+IrnKkoiULpFUFX3JxyxGU6OXVn7j2kY= git.bit5.ru/backend/meta v1.0.0 h1:1mZgEoOSA/P+IrnKkoiULpFUFX3JxyxGU6OXVn7j2kY=

118
save.go
View File

@ -12,12 +12,10 @@ import (
"go.opentelemetry.io/otel" "go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/codes"
semconv "go.opentelemetry.io/otel/semconv/v1.12.0" semconv "go.opentelemetry.io/otel/semconv/v1.12.0"
"go.opentelemetry.io/otel/trace"
) )
const tracerName = "git.bit5.ru/backend/dbmeta" const tracerName = "game/dbmeta"
var tracer = otel.Tracer(tracerName) var tracer = otel.Tracer(tracerName)
@ -50,8 +48,6 @@ func SaveRow(ctx context.Context, db *db.DBC, dataItem meta.IMetaStruct) error {
info, err := makeDataRowInfo(dataItem) info, err := makeDataRowInfo(dataItem)
if err != nil { if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
@ -80,46 +76,25 @@ func SaveRow(ctx context.Context, db *db.DBC, dataItem meta.IMetaStruct) error {
} }
if len(fields) == 0 { if len(fields) == 0 {
err := errors.New("Fields list is empty") return errors.New("Fields list is empty")
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
tableName := info.tableName tableName := info.tableName
sqlSmt := createInsertSQLForFields(ctx, tableName, fields, 1 /*one_row*/) sqlSmt := createInsertSQLForFields(ctx, tableName, fields, 1 /*one_row*/)
span.SetAttributes( span.SetAttributes(
semconv.DBSystemKey.String("mysql"),
semconv.DBSQLTableKey.String(tableName), semconv.DBSQLTableKey.String(tableName),
semconv.DBStatementKey.String(sqlSmt), semconv.DBStatementKey.String(sqlSmt),
semconv.DBOperationKey.String("INSERT"),
) )
updateBuilder := db.UpdateBySQL(sqlSmt, params...) updateBuilder := db.UpdateBySQL(sqlSmt, params...)
res, err := updateBuilder.ExecContext(ctx) res, err := updateBuilder.Exec()
if err != nil { if err != nil {
if len(sqlSmt) > 200 { if len(sqlSmt) > 200 {
sqlSmt = sqlSmt[0:200] sqlSmt = sqlSmt[0:200]
} }
return errors.Errorf("%s (%s)", err.Error(), sqlSmt)
span.SetAttributes(
attribute.Int("sql_param_amount", len(params)),
)
// Convert SQL request parameters to slice of strings.
paramStrs := convertInterfacesToStrings(ctx, params)
if len(paramStrs) > 0 {
span.SetAttributes(
attribute.StringSlice("sql_params", paramStrs),
)
}
resultErr := errors.Errorf("Can not execute SaveRow. Got error from updateBuilder.ExecContext. %s (%s)", err.Error(), sqlSmt)
span.RecordError(resultErr)
span.SetStatus(codes.Error, resultErr.Error())
return resultErr
} }
insertId, _ := res.LastInsertId() insertId, _ := res.LastInsertId()
@ -130,20 +105,6 @@ func SaveRow(ctx context.Context, db *db.DBC, dataItem meta.IMetaStruct) error {
return nil return nil
} }
func convertInterfacesToStrings(ctx context.Context, items []interface{}) []string {
itemAmount := len(items)
if itemAmount == 0 {
return nil
}
strs := make([]string, itemAmount)
for i, item := range items {
strs[i] = fmt.Sprint(item)
}
return strs
}
func SaveMetaRootStruct( func SaveMetaRootStruct(
ctx context.Context, ctx context.Context,
db *db.DBC, db *db.DBC,
@ -153,11 +114,7 @@ func SaveMetaRootStruct(
deltaSave bool, deltaSave bool,
) error { ) error {
spanAttrs := trace.WithAttributes( ctx, span := tracer.Start(ctx, "SaveMetaRootStruct")
attribute.Int64("owner.id", int64(ownerId)),
)
ctx, span := tracer.Start(ctx, "SaveMetaRootStruct", spanAttrs)
defer span.End() defer span.End()
dataItem := reflect.ValueOf(data) dataItem := reflect.ValueOf(data)
@ -207,15 +164,11 @@ func SaveMetaRootStruct(
switch tfield.Kind() { switch tfield.Kind() {
case reflect.Slice: case reflect.Slice:
if err := SaveMetaCollection(ctx, db, dataItem.Field(i), ownerId, removedIds, deltaSave); err != nil { if err := SaveMetaCollection(ctx, db, dataItem.Field(i), ownerId, removedIds, deltaSave); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return errors.WithMessagef(err, "Can not execute SaveMetaRootStruct. Got error from SaveMetaCollection. ownerId: %d.", ownerId) return errors.WithMessagef(err, "Can not execute SaveMetaRootStruct. Got error from SaveMetaCollection. ownerId: %d.", ownerId)
} }
break break
case reflect.Struct: case reflect.Struct:
if err := saveStruct(ctx, db, dataItem.Field(i), ownerId); err != nil { if err := saveStruct(ctx, db, dataItem.Field(i), ownerId); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return errors.WithMessagef(err, "Can not execute SaveMetaRootStruct. Got error from saveStruct. ownerId: %d.", ownerId) return errors.WithMessagef(err, "Can not execute SaveMetaRootStruct. Got error from saveStruct. ownerId: %d.", ownerId)
} }
break break
@ -232,12 +185,7 @@ func SaveMetaRootStruct(
return nil return nil
} }
func saveStruct( func saveStruct(ctx context.Context, db *db.DBC, dataItem reflect.Value, ownerId uint32) error {
ctx context.Context,
db *db.DBC,
dataItem reflect.Value,
ownerId uint32,
) error {
ctx, span := tracer.Start(ctx, "saveStruct") ctx, span := tracer.Start(ctx, "saveStruct")
defer span.End() defer span.End()
@ -253,20 +201,14 @@ func saveStruct(
row, _ = dataItem.Addr().Interface().(meta.IMetaStruct) row, _ = dataItem.Addr().Interface().(meta.IMetaStruct)
} }
if row == nil { if row == nil {
err := errors.Errorf("Couldn't convert to IMetaStruct: %s", mType.Name()) return errors.Errorf("Couldn't convert to IMetaStruct: %s", mType.Name())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
props := *row.CLASS_PROPS() props := *row.CLASS_PROPS()
if ownerField, ok := props["owner"]; ok { if ownerField, ok := props["owner"]; ok {
field := dataItem.FieldByName(strings.Title(ownerField)) field := dataItem.FieldByName(strings.Title(ownerField))
if !field.IsValid() { if !field.IsValid() {
err := errors.Errorf("Owner field \"%s\" is not found in struct \"%s\"", ownerField, mType.Name()) return errors.Errorf("Owner field \"%s\" is not found in struct \"%s\"", ownerField, mType.Name())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
// enforcing ownerId // enforcing ownerId
@ -276,34 +218,17 @@ func saveStruct(
} }
if err := SaveRow(ctx, db, row); err != nil { return SaveRow(ctx, db, row)
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return errors.WithMessagef(err, "Can not execute saveStruct. Got error from SaveRow. ownerId: %d.", ownerId)
} }
return nil func SaveMetaCollection(ctx context.Context, db *db.DBC, slice reflect.Value, ownerId uint32, removedIds meta.IRemovedIds, deltaSave bool) error {
}
func SaveMetaCollection(
ctx context.Context,
db *db.DBC,
slice reflect.Value,
ownerId uint32,
removedIds meta.IRemovedIds,
deltaSave bool,
) error {
ctx, span := tracer.Start(ctx, "SaveMetaCollection") ctx, span := tracer.Start(ctx, "SaveMetaCollection")
defer span.End() defer span.End()
if slice.Type().Kind() != reflect.Slice { if slice.Type().Kind() != reflect.Slice {
err := errors.Errorf("It isn't slice: %s", slice.Type().Kind()) return errors.Errorf("It isn't slice: %s", slice.Type().Kind())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
sliceItem := reflect.New(slice.Type().Elem().Elem()) sliceItem := reflect.New(slice.Type().Elem().Elem())
if sliceItem.Type().Kind() != reflect.Ptr { if sliceItem.Type().Kind() != reflect.Ptr {
sliceItem = sliceItem.Addr() sliceItem = sliceItem.Addr()
@ -315,42 +240,29 @@ func SaveMetaCollection(
} }
if row == nil { if row == nil {
err := errors.Errorf("Couldn't convert to IMetaStruct: %s", sliceItem.Kind()) return errors.Errorf("Couldn't convert to IMetaStruct: %s", sliceItem.Kind())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
item, _ := sliceItem.Interface().(meta.IMetaDataItem) item, _ := sliceItem.Interface().(meta.IMetaDataItem)
if item == nil { if item == nil {
err := errors.Errorf("Couldn't convert to IMetaDataItem: %s", slice.Type()) return errors.Errorf("Couldn't convert to IMetaDataItem: %s", slice.Type())
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err
} }
if !deltaSave { if !deltaSave {
cond := fmt.Sprintf("`%s`=%d ", item.GetOwnerFieldName(), ownerId) cond := fmt.Sprintf("`%s`=%d ", item.GetOwnerFieldName(), ownerId)
_, err := db.DeleteFrom(item.GetDbTableName()).Where(cond).Exec() _, err := db.DeleteFrom(item.GetDbTableName()).Where(cond).Exec()
if err != nil { if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
} }
collection, err := NewDataCollection(db, ownerId, "", item) collection, err := NewDataCollection(db, ownerId, "", item)
if err != nil { if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
for ind := 0; ind < slice.Len(); ind++ { for ind := 0; ind < slice.Len(); ind++ {
ind_item, err := convertToIdataItem(slice.Index(ind)) ind_item, err := convertToIdataItem(slice.Index(ind))
if err != nil { if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
// NOTE: we don't check here for error on purpose, here it's considered to be OK // NOTE: we don't check here for error on purpose, here it's considered to be OK
@ -358,8 +270,6 @@ func SaveMetaCollection(
} }
if err := collection.Save(ctx); err != nil { if err := collection.Save(ctx); err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
@ -369,8 +279,6 @@ func SaveMetaCollection(
if removedIds.HasList(classId) { if removedIds.HasList(classId) {
err := deleteByIds(db, ownerId, item, removedIds.GetList(classId)) err := deleteByIds(db, ownerId, item, removedIds.GetList(classId))
if err != nil { if err != nil {
span.RecordError(err)
span.SetStatus(codes.Error, err.Error())
return err return err
} }
} }

View File

@ -10,8 +10,8 @@ import (
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"git.bit5.ru/backend/db"
"git.bit5.ru/backend/dbmeta" "git.bit5.ru/backend/dbmeta"
"git.bit5.ru/backend/db"
"git.bit5.ru/backend/meta" "git.bit5.ru/backend/meta"
"github.com/go-logr/stdr" "github.com/go-logr/stdr"
@ -19,40 +19,38 @@ import (
var logger = stdr.New(log.New(os.Stdout, "", log.Lshortfile)) var logger = stdr.New(log.New(os.Stdout, "", log.Lshortfile))
//TODO create the tables below before tests
//CREATE TABLE `player` (
// `id` int unsigned NOT NULL,
// `client_version` char(16) NOT NULL DEFAULT '',
// `reg_time` int unsigned NOT NULL DEFAULT '0',
// `name` varchar(255) NOT NULL DEFAULT '',
// `utc_delta` tinyint(1) NOT NULL DEFAULT '0',
// PRIMARY KEY (`id`)
//) ENGINE=InnoDB DEFAULT
//
// CREATE TABLE `item` (
// `player_id` int unsigned NOT NULL DEFAULT '0',
// `id` int unsigned NOT NULL DEFAULT '0',
// `proto_id` int unsigned NOT NULL DEFAULT '0',
// `amount` bigint NOT NULL DEFAULT '0',
// PRIMARY KEY (`player_id`,`id`),
// KEY `proto_id` (`proto_id`)
//) ENGINE=InnoDB DEFAULT
func getDBC() *db.DBC { func getDBC() *db.DBC {
s := db.Settings{Host: "127.0.0.1", Port: "3306", User: "root", Pass: "test", Name: "tests", Prefix: "tests"} s := db.Settings{Host: "127.0.0.1", Port: "3306", User: "root", Pass: "test", Name: "tests_shard_1", Prefix: "tests"}
dbc := db.GetDBC(db.OpenPool(s), logger) dbc := db.GetDBC(db.OpenPool(s), logger)
return dbc return dbc
} }
func setupStorage(db *db.DBC) { func cleanStorage(db *db.DBC) {
var tables []string
var sqls []string db.SelectBySQL("SHOW TABLES").LoadValues(&tables)
sqls = append(sqls, "DROP TABLE IF EXISTS player") for _, t := range tables {
sqls = append(sqls, `CREATE TABLE player ( _, err := db.DeleteFrom(t).Exec()
id int unsigned NOT NULL,
client_version char(16) NOT NULL DEFAULT '',
reg_time int unsigned NOT NULL DEFAULT '0',
name varchar(255) NOT NULL DEFAULT '',
utc_delta tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (id)
) ENGINE=InnoDB
`)
sqls = append(sqls, "DROP TABLE IF EXISTS item")
sqls = append(sqls, `CREATE TABLE item (
player_id int unsigned NOT NULL DEFAULT '0',
id int unsigned NOT NULL DEFAULT '0',
proto_id int unsigned NOT NULL DEFAULT '0',
amount bigint NOT NULL DEFAULT '0',
PRIMARY KEY (player_id,id),
KEY proto_id (proto_id)
) ENGINE=InnoDB
`)
for _, sql := range sqls {
_, err := db.DB().Exec(sql)
if err != nil { if err != nil {
panic(sql) panic(err)
} }
} }
} }
@ -61,7 +59,7 @@ func TestSaveRow(t *testing.T) {
ctx := context.TODO() ctx := context.TODO()
conn := getDBC() conn := getDBC()
setupStorage(conn) cleanStorage(conn)
//DataPlayer index //DataPlayer index
//id 0 //id 0
@ -86,7 +84,7 @@ func TestSaveItemCollectionWithMask(t *testing.T) {
ctx := context.TODO() ctx := context.TODO()
conn := getDBC() conn := getDBC()
setupStorage(conn) cleanStorage(conn)
ownerId := uint32(1) ownerId := uint32(1)
@ -130,7 +128,7 @@ func TestSaveItemCollectionWithoutMask(t *testing.T) {
ctx := context.TODO() ctx := context.TODO()
conn := getDBC() conn := getDBC()
setupStorage(conn) cleanStorage(conn)
ownerId := uint32(1) ownerId := uint32(1)
@ -179,17 +177,19 @@ func TestRemoveIds(t *testing.T) {
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
type DataPlayer struct { type DataPlayer struct {
Id uint32 `json:"id" db:"id"` Id uint32 `json:"id" db:"id"`
Client_version string `json:"client_version" db:"client_version"` Client_version string `json:"client_version" db:"client_version"`
Reg_time uint32 `json:"reg_time" db:"reg_time"` Reg_time uint32 `json:"reg_time" db:"reg_time"`
Name string `json:"name" db:"name"` Name string `json:"name" db:"name"`
Utc_delta int32 `json:"utc_delta" db:"utc_delta"` Utc_delta int32 `json:"utc_delta" db:"utc_delta"`
fieldsMask meta.FieldsMask fieldsMask meta.FieldsMask
} }
var _DataPlayer_class_props map[string]string = map[string]string{"POD": "", "bitfields": "", "pkey": "id", "table": "player", "owner": "id", "id": "id", "cloneable": ""} var _DataPlayer_class_props map[string]string = map[string]string{"POD": "","bitfields": "","pkey": "id","table": "player","owner": "id","id": "id","cloneable": "",}
var _DataPlayer_class_fields []string = []string{"id","client_version","reg_time","name","utc_delta"} var _DataPlayer_class_fields []string = []string{"id","client_version","reg_time","name","utc_delta"}
var _DataPlayer_fields_props meta.ClassFieldsProps = map[string]map[string]string{"Id": map[string]string{"optional": "1"}, "Client_version": map[string]string{"strmax": "16", "optional": "1"}, "Reg_time": map[string]string{"default": "", "optional": "1"}, "Name": map[string]string{"default": "\"\"", "optional": "1"}, "Utc_delta": map[string]string{"default": "", "optional": "1"}} var _DataPlayer_fields_props meta.ClassFieldsProps = map[string]map[string]string{"Id" : map[string]string{"optional": "1",},"Client_version" : map[string]string{"strmax": "16","optional": "1",},"Reg_time" : map[string]string{"default": "","optional": "1",},"Name" : map[string]string{"default": "\"\"","optional": "1",},"Utc_delta" : map[string]string{"default": "","optional": "1",}}
func DataPlayer_CLASS_ID() uint32 { func DataPlayer_CLASS_ID() uint32 {
return 74407040 return 74407040
@ -281,9 +281,7 @@ func (self *DataPlayer) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(0)) { if !use_mask || (use_mask && self.HasValue(0)) {
if err := reader.ReadU32(&self.Id, "id"); err != nil { if err := reader.ReadU32(&self.Id, "id"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -292,9 +290,7 @@ func (self *DataPlayer) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(1)) { if !use_mask || (use_mask && self.HasValue(1)) {
if err := reader.ReadString(&self.Client_version, "client_version"); err != nil { if err := reader.ReadString(&self.Client_version, "client_version"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -303,9 +299,7 @@ func (self *DataPlayer) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(2)) { if !use_mask || (use_mask && self.HasValue(2)) {
if err := reader.ReadU32(&self.Reg_time, "reg_time"); err != nil { if err := reader.ReadU32(&self.Reg_time, "reg_time"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -314,9 +308,7 @@ func (self *DataPlayer) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(3)) { if !use_mask || (use_mask && self.HasValue(3)) {
if err := reader.ReadString(&self.Name, "name"); err != nil { if err := reader.ReadString(&self.Name, "name"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -325,9 +317,7 @@ func (self *DataPlayer) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(4)) { if !use_mask || (use_mask && self.HasValue(4)) {
if err := reader.ReadI32(&self.Utc_delta, "utc_delta"); err != nil { if err := reader.ReadI32(&self.Utc_delta, "utc_delta"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
return nil return nil
} }
@ -338,25 +328,15 @@ func (self *DataPlayer) Write(writer meta.Writer) error {
func (self *DataPlayer) WriteFields(writer meta.Writer) error { func (self *DataPlayer) WriteFields(writer meta.Writer) error {
if err := writer.WriteU32(self.Id, "id"); err != nil { if err := writer.WriteU32(self.Id, "id"); err != nil { return err }
return err
}
if err := writer.WriteString(self.Client_version, "client_version"); err != nil { if err := writer.WriteString(self.Client_version, "client_version"); err != nil { return err }
return err
}
if err := writer.WriteU32(self.Reg_time, "reg_time"); err != nil { if err := writer.WriteU32(self.Reg_time, "reg_time"); err != nil { return err }
return err
}
if err := writer.WriteString(self.Name, "name"); err != nil { if err := writer.WriteString(self.Name, "name"); err != nil { return err }
return err
}
if err := writer.WriteI32(self.Utc_delta, "utc_delta"); err != nil { if err := writer.WriteI32(self.Utc_delta, "utc_delta"); err != nil { return err }
return err
}
return nil return nil
} }
@ -375,16 +355,18 @@ func (self *DataPlayer) GetMask() meta.FieldsMask {
} }
type DataItem struct { type DataItem struct {
Id uint32 `json:"id" db:"id"` Id uint32 `json:"id" db:"id"`
Player_id uint32 `json:"player_id" db:"player_id"` Player_id uint32 `json:"player_id" db:"player_id"`
Proto_id uint32 `json:"proto_id" db:"proto_id"` Proto_id uint32 `json:"proto_id" db:"proto_id"`
Amount int64 `json:"amount" db:"amount"` Amount int64 `json:"amount" db:"amount"`
fieldsMask meta.FieldsMask fieldsMask meta.FieldsMask
} }
var _DataItem_class_props map[string]string = map[string]string{"POD": "", "table": "item", "id": "id", "owner": "player_id", "bitfields": ""} var _DataItem_class_props map[string]string = map[string]string{"POD": "","table": "item","id": "id","owner": "player_id","bitfields": "",}
var _DataItem_class_fields []string = []string{"id", "player_id", "proto_id", "amount"} var _DataItem_class_fields []string = []string{"id","player_id","proto_id","amount",}
var _DataItem_fields_props meta.ClassFieldsProps = map[string]map[string]string{"Id": map[string]string{"optional": "1"}, "Player_id": map[string]string{"optional": "1"}, "Proto_id": map[string]string{"obscured": "", "optional": "1"}, "Amount": map[string]string{"obscured": "", "optional": "1"}} var _DataItem_fields_props meta.ClassFieldsProps = map[string]map[string]string{"Id" : map[string]string{"optional": "1",},"Player_id" : map[string]string{"optional": "1",},"Proto_id" : map[string]string{"obscured": "","optional": "1",},"Amount" : map[string]string{"obscured": "","optional": "1",},}
func DataItem_CLASS_ID() uint32 { func DataItem_CLASS_ID() uint32 {
return 263721017 return 263721017
@ -475,9 +457,7 @@ func (self *DataItem) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(0)) { if !use_mask || (use_mask && self.HasValue(0)) {
if err := reader.ReadU32(&self.Id, "id"); err != nil { if err := reader.ReadU32(&self.Id, "id"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -486,9 +466,7 @@ func (self *DataItem) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(1)) { if !use_mask || (use_mask && self.HasValue(1)) {
if err := reader.ReadU32(&self.Player_id, "player_id"); err != nil { if err := reader.ReadU32(&self.Player_id, "player_id"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -497,9 +475,7 @@ func (self *DataItem) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(2)) { if !use_mask || (use_mask && self.HasValue(2)) {
if err := reader.ReadU32(&self.Proto_id, "proto_id"); err != nil { if err := reader.ReadU32(&self.Proto_id, "proto_id"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
if _cont_size <= 0 { if _cont_size <= 0 {
return nil return nil
@ -508,9 +484,7 @@ func (self *DataItem) ReadFields(reader meta.Reader) error {
_cont_size-- _cont_size--
} }
if !use_mask || (use_mask && self.HasValue(3)) { if !use_mask || (use_mask && self.HasValue(3)) {
if err := reader.ReadI64(&self.Amount, "amount"); err != nil { if err := reader.ReadI64(&self.Amount, "amount"); err != nil { return /*optional*/nil }
return /*optional*/ nil
}
} }
return nil return nil
} }
@ -521,21 +495,13 @@ func (self *DataItem) Write(writer meta.Writer) error {
func (self *DataItem) WriteFields(writer meta.Writer) error { func (self *DataItem) WriteFields(writer meta.Writer) error {
if err := writer.WriteU32(self.Id, "id"); err != nil { if err := writer.WriteU32(self.Id, "id"); err != nil { return err }
return err
}
if err := writer.WriteU32(self.Player_id, "player_id"); err != nil { if err := writer.WriteU32(self.Player_id, "player_id"); err != nil { return err }
return err
}
if err := writer.WriteU32(self.Proto_id, "proto_id"); err != nil { if err := writer.WriteU32(self.Proto_id, "proto_id"); err != nil { return err }
return err
}
if err := writer.WriteI64(self.Amount, "amount"); err != nil { if err := writer.WriteI64(self.Amount, "amount"); err != nil { return err }
return err
}
return nil return nil
} }
@ -601,3 +567,4 @@ func (self *DataItem) Export(data []interface{}) {
data[2] = self.Proto_id data[2] = self.Proto_id
data[3] = self.Amount data[3] = self.Amount
} }