@@ -1,4 +1,5 @@ | |||||
mod yitgen; | mod yitgen; | ||||
use yitgen::gen::YitIdHelper; | use yitgen::gen::YitIdHelper; | ||||
use yitgen::contract::*; | use yitgen::contract::*; | ||||
@@ -8,6 +9,11 @@ pub extern "C" fn SetIdGenerator(options: IdGeneratorOptions) { | |||||
YitIdHelper::SetIdGenerator(options); | YitIdHelper::SetIdGenerator(options); | ||||
} | } | ||||
#[no_mangle] | |||||
pub extern "C" fn SetWorkerId(workerId: u32) { | |||||
YitIdHelper::SetWorkerId(workerId); | |||||
} | |||||
#[no_mangle] | #[no_mangle] | ||||
pub extern "C" fn NextId() -> i64 { | pub extern "C" fn NextId() -> i64 { | ||||
YitIdHelper::NextId() | YitIdHelper::NextId() | ||||
@@ -16,7 +16,7 @@ pub struct IdGeneratorOptions { | |||||
pub SeqBitLength: u8, | pub SeqBitLength: u8, | ||||
/// 最大序列数(含),(由 SeqBitLength 计算的最大值) | /// 最大序列数(含),(由 SeqBitLength 计算的最大值) | ||||
pub MaxSeqNumber: u32, | pub MaxSeqNumber: u32, | ||||
/// 最小序列数(含),默认5,不小于1,不大于 MaxSeqNumber | |||||
/// 最小序列数(含),默认5,不小于5,不大于 MaxSeqNumber | |||||
pub MinSeqNumber: u32, | pub MinSeqNumber: u32, | ||||
/// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | /// 最大漂移次数(含),默认2000,推荐范围 500-20000(与计算能力有关) | ||||
pub TopOverCostCount: u32, | pub TopOverCostCount: u32, | ||||
@@ -89,10 +89,10 @@ impl SnowWorkerM1 { | |||||
} | } | ||||
// MinSeqNumber | // MinSeqNumber | ||||
if options.MinSeqNumber > maxSeqNumber { | |||||
panic!("MinSeqNumber error. (range:[1, {}]", maxSeqNumber); | |||||
if options.MinSeqNumber > maxSeqNumber || options.MinSeqNumber < 5 { | |||||
panic!("MinSeqNumber error. (range:[5, {}]", maxSeqNumber); | |||||
} else { | } else { | ||||
self.MinSeqNumber = options.MinSeqNumber; | |||||
self.MinSeqNumber = if options.MinSeqNumber <= 0 { 5 } else { options.MinSeqNumber }; | |||||
} | } | ||||
self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount }; | self.TopOverCostCount = if options.TopOverCostCount == 0 { 2000 } else { options.TopOverCostCount }; | ||||
@@ -13,7 +13,6 @@ pub struct YitIdHelper; | |||||
static mut idGenInstance: Option<Arc<Mutex<DefaultIdGenerator>>> = None; | static mut idGenInstance: Option<Arc<Mutex<DefaultIdGenerator>>> = None; | ||||
impl YitIdHelper { | impl YitIdHelper { | ||||
fn IdGenInstance() -> Arc<Mutex<DefaultIdGenerator>> { | fn IdGenInstance() -> Arc<Mutex<DefaultIdGenerator>> { | ||||
unsafe { | unsafe { | ||||
idGenInstance.get_or_insert_with(|| { | idGenInstance.get_or_insert_with(|| { | ||||
@@ -28,6 +27,13 @@ impl YitIdHelper { | |||||
idgen.Worker.SetOptions(options); | idgen.Worker.SetOptions(options); | ||||
} | } | ||||
pub fn SetWorkerId(workerId: u32) { | |||||
let mut idgenArc = YitIdHelper::IdGenInstance(); | |||||
let mut idgen = idgenArc.lock().unwrap(); | |||||
let mut options = IdGeneratorOptions::New(workerId); | |||||
idgen.Worker.SetOptions(options); | |||||
} | |||||
pub fn NextId() -> i64 { | pub fn NextId() -> i64 { | ||||
let mut idgenArc = YitIdHelper::IdGenInstance(); | let mut idgenArc = YitIdHelper::IdGenInstance(); | ||||
let mut idgen = idgenArc.lock().unwrap(); | let mut idgen = idgenArc.lock().unwrap(); | ||||