Skip to content

Commit e3259a2

Browse files
authored
Merge pull request #16 from larsnovikov/datetime_fields
Datetime fields
2 parents a9f691a + dbb3fe4 commit e3259a2

File tree

13 files changed

+142
-27
lines changed

13 files changed

+142
-27
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ Don't forget to set `binlog_do_db=<master_db_name>` and restart MySQL service.
2929

3030
- Use `create-model <table>` to create json config for your table.
3131
- Create table on slave.
32-
- Use `build-table <table>` to copy table data from master and set start position of log for table listener.
32+
- Use `build-slave <table>` to copy table data from master and set start position of log for table listener.
3333

3434
### Custom handlers for field value
3535

@@ -55,8 +55,8 @@ Don't forget to set `binlog_do_db=<master_db_name>` and restart MySQL service.
5555
- `set-position <table> <binlog_name> <binlog_position>` set start position of log for table listener
5656
- `load` start loader for replication testing (for default tables user and post)
5757
- `create-model <table>` create model json-file by master table structure
58-
- `build-table <table>` create master table dump, restore this dump in slave, set start position of log for table listener
59-
- `destroy-table <table>` truncate table, set empty position of log for table listener
58+
- `build-slave <table>` create master table dump, restore this dump in slave, set start position of log for table listener
59+
- `destroy-slave <table>` truncate table, set empty position of log for table listener
6060

6161
### Modes
6262

examples/post.json

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,38 @@
1414
{
1515
"name": "id",
1616
"key": true,
17-
"mode": "int"
17+
"mode": "int",
18+
"beforeSave": {
19+
"handler": "",
20+
"params": null
21+
}
1822
},
1923
{
2024
"name": "title",
2125
"key": false,
22-
"mode": "string"
26+
"mode": "string",
27+
"beforeSave": {
28+
"handler": "",
29+
"params": null
30+
}
2331
},
2432
{
2533
"name": "text",
2634
"key": false,
27-
"mode": "string"
35+
"mode": "string",
36+
"beforeSave": {
37+
"handler": "",
38+
"params": null
39+
}
2840
},
2941
{
3042
"name": "created",
3143
"key": false,
32-
"mode": "timestamp"
44+
"mode": "timestamp",
45+
"beforeSave": {
46+
"handler": "",
47+
"params": null
48+
}
3349
}
3450
]
3551
}

examples/user.json

Lines changed: 55 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
"status",
88
"active",
99
"balance",
10+
"time",
11+
"date",
12+
"datetime",
1013
"created"
1114
]
1215
},
@@ -16,12 +19,20 @@
1619
{
1720
"name": "id",
1821
"key": true,
19-
"mode": "int"
22+
"mode": "int",
23+
"beforeSave": {
24+
"handler": "",
25+
"params": null
26+
}
2027
},
2128
{
2229
"name": "name",
2330
"key": false,
24-
"mode": "string"
31+
"mode": "string",
32+
"beforeSave": {
33+
"handler": "",
34+
"params": null
35+
}
2536
},
2637
{
2738
"name": "status",
@@ -37,17 +48,56 @@
3748
{
3849
"name": "active",
3950
"key": false,
40-
"mode": "bool"
51+
"mode": "bool",
52+
"beforeSave": {
53+
"handler": "",
54+
"params": null
55+
}
4156
},
4257
{
4358
"name": "balance",
4459
"key": false,
45-
"mode": "float"
60+
"mode": "float",
61+
"beforeSave": {
62+
"handler": "",
63+
"params": null
64+
}
65+
},
66+
{
67+
"name": "time",
68+
"key": false,
69+
"mode": "time",
70+
"beforeSave": {
71+
"handler": "",
72+
"params": null
73+
}
74+
},
75+
{
76+
"name": "date",
77+
"key": false,
78+
"mode": "date",
79+
"beforeSave": {
80+
"handler": "",
81+
"params": null
82+
}
83+
},
84+
{
85+
"name": "datetime",
86+
"key": false,
87+
"mode": "datetime",
88+
"beforeSave": {
89+
"handler": "",
90+
"params": null
91+
}
4692
},
4793
{
4894
"name": "created",
4995
"key": false,
50-
"mode": "timestamp"
96+
"mode": "timestamp",
97+
"beforeSave": {
98+
"handler": "",
99+
"params": null
100+
}
51101
}
52102
]
53103
}

sql/structure.sql

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ CREATE TABLE test.user
88
status VARCHAR(255),
99
active bool,
1010
balance float,
11+
time time,
12+
date date,
13+
datetime datetime,
1114
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
1215
) engine=InnoDB;
1316

@@ -27,6 +30,9 @@ CREATE TABLE test.user
2730
status VARCHAR(255),
2831
active bool,
2932
balance float,
33+
time time,
34+
date date,
35+
datetime datetime,
3036
created TIMESTAMP NOT NULL
3137
) engine=InnoDB;
3238

@@ -50,6 +56,9 @@ CREATE TABLE public."user"
5056
status VARCHAR(255),
5157
active bool,
5258
balance float,
59+
time time,
60+
date date,
61+
datetime VARCHAR(255),
5362
created TIMESTAMP DEFAULT NULL
5463
);
5564

@@ -64,11 +73,28 @@ CREATE TABLE public.post
6473
/*For ClickHouse Slave*/
6574
CREATE DATABASE test;
6675

67-
CREATE TABLE test.user (id Int32, name FixedString(40), status FixedString(255), active UInt8, balance Float32, created DateTime) ENGINE = MergeTree()
76+
CREATE TABLE test.user
77+
(
78+
id Int32,
79+
name FixedString(40),
80+
status FixedString(255),
81+
active UInt8,
82+
balance Float32,
83+
time FixedString(255),
84+
date FixedString(255),
85+
datetime DateTime,
86+
created DateTime
87+
) ENGINE = MergeTree()
6888
PARTITION BY id
6989
ORDER BY id;
7090

71-
CREATE TABLE test.post (id Int32, title FixedString(40), text FixedString(255), created DateTime) ENGINE = MergeTree()
91+
CREATE TABLE test.post
92+
(
93+
id Int32,
94+
title FixedString(40),
95+
text FixedString(255),
96+
created DateTime
97+
) ENGINE = MergeTree()
7298
PARTITION BY id
7399
ORDER BY id;
74100

@@ -81,6 +107,9 @@ CREATE TABLE "user"
81107
status VARCHAR,
82108
active bool,
83109
balance FLOAT,
110+
time TIME,
111+
date DATE,
112+
datetime DATETIME,
84113
created TIMESTAMP NOT NULL
85114
);
86115

src/constants/errors.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ const (
1212
ErrorModelFileExists = "Model file \"%s\" already exists"
1313
ErrorParserPosition = "Catch error: \"%s\""
1414
ErrorGetMinPosition = "Can't get min position. Error: \"%s\""
15+
ErrorEmptyPosition = "Can't get position. Use \"destroy-slave %s\" and \"build-slave %s\""
1516
ErrorUndefinedSlave = "Can't get slave. Error: \"%s\""
1617
ErrorCobraStarter = "Catch cobra error: \"%s\""
1718
ErrorCachePluginError = "Catch plugin error: \"%s\""
@@ -20,5 +21,5 @@ const (
2021
ErrorBuildModelConfig = "Can't build model config. Error: \"%s\""
2122
ErrorDumpRead = "Can't read dump. Error: \"%s\""
2223
ErrorParseLine = "Can't parse line \"%s\". Error: \"%s\""
23-
ErrorTableBuilt = "Table \"%s\" already built. Use \"destroy-table %s\" before build"
24+
ErrorSlaveBuilt = "Slave table \"%s\" already built. Use \"destroy-slave %s\" before build"
2425
)

src/helpers/config.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,10 @@ func MakeCredentials() {
8383
os.Getenv("REPLICATOR_DBNAME"),
8484
}
8585

86-
for _, tableName := range strings.Split(os.Getenv("ALLOWED_TABLES"), ",") {
87-
tables = append(tables, strings.TrimSpace(tableName))
86+
if os.Getenv("ALLOWED_TABLES") != "" {
87+
for _, tableName := range strings.Split(os.Getenv("ALLOWED_TABLES"), ",") {
88+
tables = append(tables, strings.TrimSpace(tableName))
89+
}
8890
}
8991

9092
channelSize, _ = strconv.Atoi(os.Getenv("CHANNEL_SIZE"))

src/parser/binlog.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ func (h *binlogHandler) OnRow(e *canal.RowsEvent) error {
101101
slave.GetSlaveByName(e.Table.Name).Delete(&header, positionSet)
102102
SaveLocks[e.Table.Name] = false
103103
} else {
104-
log.Infof(constants.MessageIgnoreDelete, &header.Timestamp, e.Table.Name, &header.LogPos)
104+
log.Infof(constants.MessageIgnoreDelete, header.Timestamp, e.Table.Name, header.LogPos)
105105
return nil
106106
}
107107
}
@@ -123,15 +123,15 @@ func (h *binlogHandler) OnRow(e *canal.RowsEvent) error {
123123
slave.GetSlaveByName(e.Table.Name).Update(&header, positionSet)
124124
SaveLocks[e.Table.Name] = false
125125
} else {
126-
log.Infof(constants.MessageIgnoreUpdate, &header.Timestamp, e.Table.Name, &header.LogPos)
126+
log.Infof(constants.MessageIgnoreUpdate, header.Timestamp, e.Table.Name, header.LogPos)
127127
return nil
128128
}
129129
} else {
130130
if SaveLocks[e.Table.Name] == false || canSave(getCalculatedPos(), e.Table.Name) {
131131
slave.GetSlaveByName(e.Table.Name).Insert(&header, positionSet)
132132
SaveLocks[e.Table.Name] = false
133133
} else {
134-
log.Infof(constants.MessageIgnoreInsert, &header.Timestamp, e.Table.Name, &header.LogPos)
134+
log.Infof(constants.MessageIgnoreInsert, header.Timestamp, e.Table.Name, header.LogPos)
135135
return nil
136136
}
137137
}

src/parser/parser.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,12 @@ func prepareType(fieldName string, fieldType string, value interface{}, params m
118118
case "timestamp":
119119
t, _ := time.Parse("2006-01-02 15:04:05", value.(string))
120120
params[fieldName] = t
121+
case "time":
122+
params[fieldName] = value.(string)
123+
case "date":
124+
params[fieldName] = value.(string)
125+
case "datetime":
126+
t, _ := time.Parse("2006-01-02 15:04:05", value.(string))
127+
params[fieldName] = t
121128
}
122129
}

src/parser/position.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ func GetSavedPos(table string) mysql.Position {
2929
hash := helpers.MakeHash(dbName, table)
3030
pos, name := helpers.MakeTablePosKey(hash)
3131

32-
tablePosition, err := strconv.ParseUint(system.GetValue(pos), 10, 32)
32+
position := system.GetValue(pos)
33+
if position == "" {
34+
log.Fatalf(constants.ErrorEmptyPosition, table, table)
35+
}
36+
tablePosition, err := strconv.ParseUint(position, 10, 32)
3337
if err != nil {
3438
log.Fatalf(constants.ErrorGetMinPosition, err)
3539
}

src/tools/system/build-table.go renamed to src/tools/system/build-slave.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ const (
2626
)
2727

2828
var CmdBuildTable = &cobra.Command{
29-
Use: "build-table",
29+
Use: "build-slave",
3030
Short: "Build slave table from master. Format: [table]",
3131
Long: "Build slave table from master. Format: [table]",
3232
Args: cobra.ExactArgs(1),
@@ -60,7 +60,7 @@ func canHandle() bool {
6060
return true
6161
}
6262

63-
log.Fatalf(constants.ErrorTableBuilt, helpers2.Table, helpers2.Table)
63+
log.Fatalf(constants.ErrorSlaveBuilt, helpers2.Table, helpers2.Table)
6464
return false
6565
}
6666

0 commit comments

Comments
 (0)