add function sf_binlog_writer_get_last_version
parent
024c148700
commit
88a0f0a267
|
|
@ -30,6 +30,17 @@
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
#define SF_BINLOG_PARSE_INT_SILENCE2(var, caption, index, echr1, echr2, min_val) \
|
||||||
|
do { \
|
||||||
|
var = strtol(cols[index].str, &endptr, 10); \
|
||||||
|
if (!(*endptr == echr1 || *endptr == echr2) || (var < min_val)) { \
|
||||||
|
sprintf(error_info, "invalid %s: %.*s", \
|
||||||
|
caption, cols[index].len, cols[index].str); \
|
||||||
|
return EINVAL; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
|
||||||
typedef int (*pack_record_func)(char *buff, void *record);
|
typedef int (*pack_record_func)(char *buff, void *record);
|
||||||
typedef int (*unpack_record_func)(const string_t *line,
|
typedef int (*unpack_record_func)(const string_t *line,
|
||||||
void *record, char *error_info);
|
void *record, char *error_info);
|
||||||
|
|
|
||||||
|
|
@ -269,7 +269,14 @@ static inline int deal_binlog_one_record(SFBinlogWriterBuffer *wb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return check_write_to_file(wb->writer, wb->bf.buff, wb->bf.length);
|
if ((result=check_write_to_file(wb->writer, wb->bf.buff,
|
||||||
|
wb->bf.length)) == 0)
|
||||||
|
{
|
||||||
|
if (wb->writer->flags & SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION) {
|
||||||
|
wb->writer->last_versions.pending = wb->version.last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (wb->writer->file.size + SF_BINLOG_BUFFER_LENGTH(wb->writer->
|
if (wb->writer->file.size + SF_BINLOG_BUFFER_LENGTH(wb->writer->
|
||||||
|
|
@ -286,9 +293,13 @@ static inline int deal_binlog_one_record(SFBinlogWriterBuffer *wb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wb->writer->flags & SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION) {
|
||||||
|
wb->writer->last_versions.pending = wb->version.last;
|
||||||
|
}
|
||||||
memcpy(wb->writer->binlog_buffer.end,
|
memcpy(wb->writer->binlog_buffer.end,
|
||||||
wb->bf.buff, wb->bf.length);
|
wb->bf.buff, wb->bf.length);
|
||||||
wb->writer->binlog_buffer.end += wb->bf.length;
|
wb->writer->binlog_buffer.end += wb->bf.length;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -411,6 +422,9 @@ static inline int flush_writer_files(SFBinlogWriterThread *thread)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (writer->flags & SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION) {
|
||||||
|
writer->last_versions.done = writer->last_versions.pending;
|
||||||
|
}
|
||||||
writer->flush.in_queue = false;
|
writer->flush.in_queue = false;
|
||||||
writer = writer->flush.next;
|
writer = writer->flush.next;
|
||||||
}
|
}
|
||||||
|
|
@ -594,6 +608,9 @@ int sf_binlog_writer_init_normal(SFBinlogWriterInfo *writer,
|
||||||
|
|
||||||
writer->total_count = 0;
|
writer->total_count = 0;
|
||||||
writer->flush.in_queue = false;
|
writer->flush.in_queue = false;
|
||||||
|
writer->last_versions.pending = 0;
|
||||||
|
writer->last_versions.done = 0;
|
||||||
|
writer->flags = 0;
|
||||||
if ((result=sf_binlog_buffer_init(&writer->binlog_buffer,
|
if ((result=sf_binlog_buffer_init(&writer->binlog_buffer,
|
||||||
buffer_size)) != 0)
|
buffer_size)) != 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@
|
||||||
#define SF_BINLOG_THREAD_TYPE_ORDER_BY_NONE 0
|
#define SF_BINLOG_THREAD_TYPE_ORDER_BY_NONE 0
|
||||||
#define SF_BINLOG_THREAD_TYPE_ORDER_BY_VERSION 1
|
#define SF_BINLOG_THREAD_TYPE_ORDER_BY_VERSION 1
|
||||||
|
|
||||||
|
#define SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION 1
|
||||||
|
|
||||||
#define SF_BINLOG_BUFFER_TYPE_WRITE_TO_FILE 0 //default type, must be 0
|
#define SF_BINLOG_BUFFER_TYPE_WRITE_TO_FILE 0 //default type, must be 0
|
||||||
#define SF_BINLOG_BUFFER_TYPE_SET_NEXT_VERSION 1
|
#define SF_BINLOG_BUFFER_TYPE_SET_NEXT_VERSION 1
|
||||||
#define SF_BINLOG_BUFFER_TYPE_CHANGE_ORDER_TYPE 2
|
#define SF_BINLOG_BUFFER_TYPE_CHANGE_ORDER_TYPE 2
|
||||||
|
|
@ -103,6 +105,13 @@ typedef struct sf_binlog_writer_info {
|
||||||
} version_ctx;
|
} version_ctx;
|
||||||
SFBinlogBuffer binlog_buffer;
|
SFBinlogBuffer binlog_buffer;
|
||||||
SFBinlogWriterThread *thread;
|
SFBinlogWriterThread *thread;
|
||||||
|
|
||||||
|
short flags;
|
||||||
|
struct {
|
||||||
|
int64_t pending;
|
||||||
|
volatile int64_t done;
|
||||||
|
} last_versions;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
bool in_queue;
|
bool in_queue;
|
||||||
struct sf_binlog_writer_info *next;
|
struct sf_binlog_writer_info *next;
|
||||||
|
|
@ -160,6 +169,25 @@ int sf_binlog_writer_change_order_by(SFBinlogWriterInfo *writer,
|
||||||
int sf_binlog_writer_change_next_version(SFBinlogWriterInfo *writer,
|
int sf_binlog_writer_change_next_version(SFBinlogWriterInfo *writer,
|
||||||
const int64_t next_version);
|
const int64_t next_version);
|
||||||
|
|
||||||
|
static inline void sf_binlog_writer_set_flags(
|
||||||
|
SFBinlogWriterInfo *writer, const short flags)
|
||||||
|
{
|
||||||
|
writer->flags = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int64_t sf_binlog_writer_get_last_version(
|
||||||
|
SFBinlogWriterInfo *writer)
|
||||||
|
{
|
||||||
|
if (writer->flags & SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION) {
|
||||||
|
return writer->last_versions.done;
|
||||||
|
} else {
|
||||||
|
logError("file: "__FILE__", line: %d, "
|
||||||
|
"should set writer flags to %d!", __LINE__,
|
||||||
|
SF_BINLOG_WRITER_FLAGS_WANT_DONE_VERSION);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void sf_binlog_writer_finish(SFBinlogWriterInfo *writer);
|
void sf_binlog_writer_finish(SFBinlogWriterInfo *writer);
|
||||||
|
|
||||||
int sf_binlog_get_current_write_index(SFBinlogWriterInfo *writer);
|
int sf_binlog_get_current_write_index(SFBinlogWriterInfo *writer);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue