From 2186e0f88b02d555cd2aa653d0bfb6c639b151e1 Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Sun, 12 Sep 2021 19:42:29 +0300 Subject: [PATCH 01/13] Basic COCk example [COC]: - create - open - close --- rust/.gitignore | 2 + rust/Cargo.toml | 10 ++ rust/build.rs | 4 + .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 0 -> 85664 bytes rust/src/common.rs | 9 ++ rust/src/lib.rs | 32 ++++++ rust/src/link_c.rs | 101 ++++++++++++++++++ rust/src/persistent_memory_manager.rs | 70 ++++++++++++ 8 files changed, 228 insertions(+) create mode 100644 rust/.gitignore create mode 100644 rust/Cargo.toml create mode 100644 rust/build.rs create mode 100644 rust/dylibs/libPlatform.Data.Triplets.Kernel.a create mode 100644 rust/src/common.rs create mode 100644 rust/src/lib.rs create mode 100644 rust/src/link_c.rs create mode 100644 rust/src/persistent_memory_manager.rs diff --git a/rust/.gitignore b/rust/.gitignore new file mode 100644 index 0000000..96ef6c0 --- /dev/null +++ b/rust/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock diff --git a/rust/Cargo.toml b/rust/Cargo.toml new file mode 100644 index 0000000..fd2ea7c --- /dev/null +++ b/rust/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "triplets" +version = "0.1.0" +authors = ["uselessgoddess"] +edition = "2018" + +build = "build.rs" + +[dependencies] +libc = "0.1" diff --git a/rust/build.rs b/rust/build.rs new file mode 100644 index 0000000..23e51ee --- /dev/null +++ b/rust/build.rs @@ -0,0 +1,4 @@ +fn main() { + println!("cargo:rustc-link-search=native=dylibs"); + println!("cargo:rustc-link-lib=static=Platform.Data.Triplets.Kernel"); +} \ No newline at end of file diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a new file mode 100644 index 0000000000000000000000000000000000000000..176fa4a0131990cf9cf40ca7f7e6693a5c4fa24c GIT binary patch literal 85664 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 D*<@zS literal 0 HcmV?d00001 diff --git a/rust/src/common.rs b/rust/src/common.rs new file mode 100644 index 0000000..2e1eeeb --- /dev/null +++ b/rust/src/common.rs @@ -0,0 +1,9 @@ +pub type SignedInteger = libc::int64_t; +pub type UnsignedInteger = libc::uint64_t; +pub type LinkIndex = UnsignedInteger; + +pub type Visitor = extern "C" fn(LinkIndex); +pub type StoppableVisitor = extern "C" fn(LinkIndex) -> SignedInteger; + +pub const SUCCESS_RESULT: SignedInteger = 0; +pub const ERROR_RESULT: SignedInteger = 1; \ No newline at end of file diff --git a/rust/src/lib.rs b/rust/src/lib.rs new file mode 100644 index 0000000..e7741de --- /dev/null +++ b/rust/src/lib.rs @@ -0,0 +1,32 @@ +#![feature(try_trait)] + +use common::{*}; +use link_c::{*}; +use persistent_memory_manager::{*}; + +pub mod common; +pub mod link_c; +pub mod persistent_memory_manager; + +#[cfg(test)] +mod test { + use std::ffi::{CStr, CString}; + use std::fs::File; + use std::path::Path; + use std::time::{Duration, SystemTime}; + + use crate::{*}; + + #[test] + fn it_works() { + { + let mem = PersistentMemoryManager::create("db.links"); + println!("{:?}", mem); + // close db file + } + + let mem = PersistentMemoryManager::open("db.links").unwrap(); + println!("{:?}", mem); + mem.close().unwrap(); + } +} diff --git a/rust/src/link_c.rs b/rust/src/link_c.rs new file mode 100644 index 0000000..df9c655 --- /dev/null +++ b/rust/src/link_c.rs @@ -0,0 +1,101 @@ +use crate::common::{*}; + +extern "C" { + pub fn GetSourceIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetLinkerIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetTargetIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetTime( + index: LinkIndex + ) -> SignedInteger; + + pub fn CreateLink( + source: LinkIndex, + linker: LinkIndex, + target: LinkIndex, + ) -> LinkIndex; + + pub fn SearchLink( + source: LinkIndex, + linker: LinkIndex, + target: LinkIndex, + ) -> LinkIndex; + + pub fn ReplaceLink( + index: LinkIndex, + replacement: LinkIndex, + ) -> LinkIndex; + + pub fn UpdateLink( + index: LinkIndex, + source: LinkIndex, + linker: LinkIndex, + target: LinkIndex, + ) -> LinkIndex; + + pub fn DeleteLink( + index: LinkIndex + ); + + pub fn GetFirstRefererBySourceIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetFirstRefererByLinkerIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetFirstRefererByTargetIndex( + index: LinkIndex + ) -> LinkIndex; + + pub fn GetLinkNumberOfReferersBySource( + index: LinkIndex + ) -> UnsignedInteger; + + pub fn GetLinkNumberOfReferersByLinker( + index: LinkIndex + ) -> UnsignedInteger; + + pub fn GetLinkNumberOfReferersByTarget( + index: LinkIndex + ) -> UnsignedInteger; + + pub fn WalkThroughAllReferersBySource( + root: LinkIndex, + visitor: Visitor, + ); + + pub fn WalkThroughReferersBySource( + root: LinkIndex, + visitor: StoppableVisitor, + ) -> SignedInteger; + + pub fn WalkThroughAllReferersByLinker( + root: LinkIndex, + visitor: Visitor, + ); + + pub fn WalkThroughReferersByLinker( + root: LinkIndex, + visitor: StoppableVisitor, + ) -> SignedInteger; + + pub fn WalkThroughAllReferersByTarget( + root: LinkIndex, + visitor: Visitor, + ); + + pub fn WalkThroughReferersByTarget( + root: LinkIndex, + visitor: StoppableVisitor, + ) -> SignedInteger; +} \ No newline at end of file diff --git a/rust/src/persistent_memory_manager.rs b/rust/src/persistent_memory_manager.rs new file mode 100644 index 0000000..63a1d9d --- /dev/null +++ b/rust/src/persistent_memory_manager.rs @@ -0,0 +1,70 @@ +use crate::common::{*}; +use libc::c_char; +use std::path::Path; +use std::io::{Error, ErrorKind}; +use std::ffi::{CStr, CString, NulError}; + +extern "C" { + pub fn OpenLinks(filename: *const c_char) -> SignedInteger; + pub fn CloseLinks() -> SignedInteger; + + pub fn GetMappedLink(mapped_index: SignedInteger) -> LinkIndex; + pub fn SetMappedLink(mapped_index: SignedInteger, link_index: LinkIndex); + + pub fn WalkThroughAllLinks(visitor: Visitor); + pub fn WalkThroughLinks(visitor: StoppableVisitor) -> SignedInteger; + + pub fn GetLinksCount() -> UnsignedInteger; + + pub fn AllocateLink() -> LinkIndex; + pub fn FreeLink(link_index: LinkIndex); +} + +#[derive(Debug)] +pub struct PersistentMemoryManager; + +impl PersistentMemoryManager { + pub fn open>(path: P) -> std::io::Result { + //std::fs::File::open(&path)?; // wrapper to return an error if the file does not exist + + let raw_path_str = path.as_ref().to_str(); + let path_str; + match raw_path_str { + None => { return Err(Error::from(ErrorKind::NotFound)) } + Some(str) => { path_str = str } + } + + let c_str = CString::new(path_str)?; + let result = unsafe { OpenLinks(c_str.as_ptr()) }; + match result { + SUCCESS_RESULT => { Ok(Self { }) } + _ => { Err(Error::from_raw_os_error(result as i32)) } + } + } + + pub fn create>(path: P) -> std::io::Result { + let raw_parent = path.as_ref().parent(); + match raw_parent { + None => { Err(Error::from(ErrorKind::NotFound)) } + Some(parent) => { + std::fs::create_dir_all(parent)?; + std::fs::File::create(&path)?; + Self::open(path) + } + } + } + + pub fn close(&self) -> std::io::Result<()> { + let result = unsafe { CloseLinks() }; + match result { + SUCCESS_RESULT => { Ok(()) } + _ => { Err(Error::from_raw_os_error(result as i32)) } + } + } +} + +impl Drop for PersistentMemoryManager { + fn drop(&mut self) { + self.close(); + } +} \ No newline at end of file From 30796a136cb30e3985b67fc5f72c8ec9ca4981ba Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Sun, 12 Sep 2021 20:16:17 +0300 Subject: [PATCH 02/13] Optimize imports --- .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 85664 -> 77562 bytes rust/src/lib.rs | 5 ----- 2 files changed, 5 deletions(-) diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a index 176fa4a0131990cf9cf40ca7f7e6693a5c4fa24c..cb4e8487b596811887498fecfeca63e353285523 100644 GIT binary patch literal 77562 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 D*<@zS diff --git a/rust/src/lib.rs b/rust/src/lib.rs index e7741de..51f7445 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -10,11 +10,6 @@ pub mod persistent_memory_manager; #[cfg(test)] mod test { - use std::ffi::{CStr, CString}; - use std::fs::File; - use std::path::Path; - use std::time::{Duration, SystemTime}; - use crate::{*}; #[test] From 06d9763ae64556d32c97cf5031dfed57023abf58 Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Mon, 13 Sep 2021 18:09:08 +0300 Subject: [PATCH 03/13] =?UTF-8?q?Small=20refactoring=20-=20use=20shorter?= =?UTF-8?q?=20syntax=20-=20use=20isolated=20=D0=A1=20realisation=20-=20bas?= =?UTF-8?q?e=20for=20create(link)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- rust/src/lib.rs | 8 +++--- rust/src/persistent_memory_manager.rs | 33 ++++++++++--------------- rust/src/persistent_memory_manager_c.rs | 18 ++++++++++++++ 3 files changed, 36 insertions(+), 23 deletions(-) create mode 100644 rust/src/persistent_memory_manager_c.rs diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 51f7445..c115345 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -5,9 +5,11 @@ use link_c::{*}; use persistent_memory_manager::{*}; pub mod common; -pub mod link_c; +mod link_c; +mod persistent_memory_manager_c; pub mod persistent_memory_manager; + #[cfg(test)] mod test { use crate::{*}; @@ -15,12 +17,12 @@ mod test { #[test] fn it_works() { { - let mem = PersistentMemoryManager::create("db.links"); + let mem = Links::create("db.links"); println!("{:?}", mem); // close db file } - let mem = PersistentMemoryManager::open("db.links").unwrap(); + let mem = Links::open("db.links").unwrap(); println!("{:?}", mem); mem.close().unwrap(); } diff --git a/rust/src/persistent_memory_manager.rs b/rust/src/persistent_memory_manager.rs index 63a1d9d..e4b7e34 100644 --- a/rust/src/persistent_memory_manager.rs +++ b/rust/src/persistent_memory_manager.rs @@ -1,31 +1,22 @@ use crate::common::{*}; +use crate::persistent_memory_manager_c::{*}; use libc::c_char; use std::path::Path; use std::io::{Error, ErrorKind}; use std::ffi::{CStr, CString, NulError}; -extern "C" { - pub fn OpenLinks(filename: *const c_char) -> SignedInteger; - pub fn CloseLinks() -> SignedInteger; - - pub fn GetMappedLink(mapped_index: SignedInteger) -> LinkIndex; - pub fn SetMappedLink(mapped_index: SignedInteger, link_index: LinkIndex); - - pub fn WalkThroughAllLinks(visitor: Visitor); - pub fn WalkThroughLinks(visitor: StoppableVisitor) -> SignedInteger; - - pub fn GetLinksCount() -> UnsignedInteger; - - pub fn AllocateLink() -> LinkIndex; - pub fn FreeLink(link_index: LinkIndex); -} +pub struct Links; #[derive(Debug)] pub struct PersistentMemoryManager; -impl PersistentMemoryManager { - pub fn open>(path: P) -> std::io::Result { - //std::fs::File::open(&path)?; // wrapper to return an error if the file does not exist +impl Links { + const ITSELF: LinkIndex = 0; + const CONTINUE: LinkIndex = 0; + const STOP: LinkIndex = 1; + + pub fn open>(path: P) -> std::io::Result { + std::fs::File::open(&path)?; // simulate return an error if the file does not exist let raw_path_str = path.as_ref().to_str(); let path_str; @@ -37,12 +28,12 @@ impl PersistentMemoryManager { let c_str = CString::new(path_str)?; let result = unsafe { OpenLinks(c_str.as_ptr()) }; match result { - SUCCESS_RESULT => { Ok(Self { }) } + SUCCESS_RESULT => { Ok(PersistentMemoryManager { }) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } - pub fn create>(path: P) -> std::io::Result { + pub fn create>(path: P) -> std::io::Result { let raw_parent = path.as_ref().parent(); match raw_parent { None => { Err(Error::from(ErrorKind::NotFound)) } @@ -53,7 +44,9 @@ impl PersistentMemoryManager { } } } +} +impl PersistentMemoryManager { pub fn close(&self) -> std::io::Result<()> { let result = unsafe { CloseLinks() }; match result { diff --git a/rust/src/persistent_memory_manager_c.rs b/rust/src/persistent_memory_manager_c.rs new file mode 100644 index 0000000..203c294 --- /dev/null +++ b/rust/src/persistent_memory_manager_c.rs @@ -0,0 +1,18 @@ +use crate::common::{*}; +use libc::c_char; + +extern "C" { + pub fn OpenLinks(filename: *const c_char) -> SignedInteger; + pub fn CloseLinks() -> SignedInteger; + + pub fn GetMappedLink(mapped_index: SignedInteger) -> LinkIndex; + pub fn SetMappedLink(mapped_index: SignedInteger, link_index: LinkIndex); + + pub fn WalkThroughAllLinks(visitor: Visitor); + pub fn WalkThroughLinks(visitor: StoppableVisitor) -> SignedInteger; + + pub fn GetLinksCount() -> UnsignedInteger; + + pub fn AllocateLink() -> LinkIndex; + pub fn FreeLink(link_index: LinkIndex); +} \ No newline at end of file From 4cda0daec8bfae21df51cf9f3b75a5110ace708f Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Mon, 13 Sep 2021 21:26:26 +0300 Subject: [PATCH 04/13] CrUD example like C --- .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 77562 -> 40468 bytes rust/src/lib.rs | 25 ++++ rust/src/persistent_memory_manager.rs | 120 +++++++++++++++++- 3 files changed, 139 insertions(+), 6 deletions(-) diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a index cb4e8487b596811887498fecfeca63e353285523..8a43e71ec6a29815a79ec0862dc1fe720fae3a48 100644 GIT binary patch literal 40468 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

kd70e0#3nkmyb7(Vt28eL{_X9WXb> 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 literal 77562 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 { + parent: &'a PersistentMemoryManager, + index: LinkIndex, +} + +impl<'a> Clone for LinkAdapter<'a> { + fn clone(&self) -> Self { + Self { parent: self.parent, index: self.index } + } +} + +pub trait AsIndex { + fn index(&self) -> LinkIndex; +} + +impl AsIndex for LinkIndex { + fn index(&self) -> LinkIndex { + *self + } +} + +impl<'a> AsIndex for LinkAdapter<'a> { + fn index(&self) -> LinkIndex { + self.index + } +} + +impl<'a> AsIndex for &LinkAdapter<'a> { + fn index(&self) -> LinkIndex { + self.index + } +} + +impl<'a> Deref for LinkAdapter<'a> { + type Target = LinkIndex; + + fn deref(&self) -> &Self::Target { + &self.index + } +} + +impl<'a> LinkAdapter<'a> { + // pub fn first_referer_by(&self, kind: LinkKind) -> Self { + // match kind { + // LinkKind::Source => unsafe { + // LinkAdapter { + // parent: self.parent, + // index: GetFirstRefererBySourceIndex(self.index), + // } + // } + // LinkKind::Linker => unsafe { + // LinkAdapter { + // parent: self.parent, + // index: GetFirstRefererByLinkerIndex(self.index), + // } + // } + // LinkKind::Target => unsafe { + // LinkAdapter { + // parent: self.parent, + // index: GetFirstRefererByTargetIndex(self.index), + // } + // } + // } + // } + + pub fn update(&mut self, source: T, linker: L, target: S) + where S: AsIndex, L: AsIndex, T: AsIndex + { + self.index = unsafe { UpdateLink(self.index, source.index(), linker.index(), target.index()) } + } + + pub fn delete(self) { + unsafe { DeleteLink(self.index) } + } + + // pub fn replace(&mut self, other: O) { + // self.index = unsafe { CreateLink(source.index(), linker.index(), target.index()) }, + // } + + // pub fn drop_index(self) -> LinkIndex { + // self.index() + // } +} pub struct Links; @@ -21,14 +115,14 @@ impl Links { let raw_path_str = path.as_ref().to_str(); let path_str; match raw_path_str { - None => { return Err(Error::from(ErrorKind::NotFound)) } + None => { return Err(Error::from(ErrorKind::NotFound)); } Some(str) => { path_str = str } } let c_str = CString::new(path_str)?; let result = unsafe { OpenLinks(c_str.as_ptr()) }; match result { - SUCCESS_RESULT => { Ok(PersistentMemoryManager { }) } + SUCCESS_RESULT => { Ok(PersistentMemoryManager {}) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } @@ -47,6 +141,20 @@ impl Links { } impl PersistentMemoryManager { + pub fn create(&'a self, source: S, linker: L, target: T) -> LinkAdapter<'a> + where S: AsIndex, L: AsIndex, T: AsIndex + { + LinkAdapter { parent: self, index: unsafe { CreateLink(source.index(), linker.index(), target.index()) } } + } + + // pub fn search(&'a self, source: LinkIndex, linker: LinkIndex, target: LinkIndex) -> LinkAdapter<'a> { + // LinkAdapter { parent: self, index: unsafe { SearchLink(source, linker, target) } } + // } + + pub fn count(&self) -> usize { + (unsafe { GetLinksCount() }) as usize + } + pub fn close(&self) -> std::io::Result<()> { let result = unsafe { CloseLinks() }; match result { From 6c97891235bed79beeb8a99da1d4d0354b21742a Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Tue, 14 Sep 2021 22:25:25 +0300 Subject: [PATCH 05/13] Rewrite C api to non-singleton style --- .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 40468 -> 50572 bytes rust/src/common.rs | 58 +++++++++++++++++- rust/src/lib.rs | 43 +++++++++++-- rust/src/link_c.rs | 47 ++++++++++---- rust/src/persistent_memory_manager.rs | 12 +++- rust/src/persistent_memory_manager_c.rs | 18 +++--- 6 files changed, 150 insertions(+), 28 deletions(-) diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a index 8a43e71ec6a29815a79ec0862dc1fe720fae3a48..99d829aff7ce0b582e0c6e7704e2d56c36f95038 100644 GIT binary patch literal 50572 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 NPTR%lS05n#{{zSyoKXM( literal 40468 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

kd70e0#3nkmyb7(Vt28eL{_X9WXb> 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 diff --git a/rust/src/common.rs b/rust/src/common.rs index 2e1eeeb..1fd1557 100644 --- a/rust/src/common.rs +++ b/rust/src/common.rs @@ -1,3 +1,9 @@ +#[cfg(windows)] +use std::os::windows::raw::HANDLE; +use libc::c_void; +use libc::int64_t; +use libc::uint64_t; + pub type SignedInteger = libc::int64_t; pub type UnsignedInteger = libc::uint64_t; pub type LinkIndex = UnsignedInteger; @@ -6,4 +12,54 @@ pub type Visitor = extern "C" fn(LinkIndex); pub type StoppableVisitor = extern "C" fn(LinkIndex) -> SignedInteger; pub const SUCCESS_RESULT: SignedInteger = 0; -pub const ERROR_RESULT: SignedInteger = 1; \ No newline at end of file +pub const ERROR_RESULT: SignedInteger = 1; + +#[repr(C)] +pub struct Link +{ + pub SourceIndex: LinkIndex, + pub TargetIndex: LinkIndex, + pub LinkerIndex: LinkIndex, + pub Timestamp: SignedInteger, + pub BySourceRootIndex: LinkIndex, + pub BySourceLeftIndex: LinkIndex, + pub BySourceRightIndex: LinkIndex, + pub BySourceCount: UnsignedInteger, + pub ByTargetRootIndex: LinkIndex, + pub ByTargetLeftIndex: LinkIndex, + pub ByTargetRightIndex: LinkIndex, + pub ByTargetCount: UnsignedInteger, + pub ByLinkerRootIndex: LinkIndex, + pub ByLinkerLeftIndex: LinkIndex, + pub ByLinkerRightIndex: LinkIndex, + pub ByLinkerCount: UnsignedInteger, +} + +#[repr(C)] +pub struct RawDB +{ + #[cfg(windows)] + pub storageFileHandle: HANDLE, + #[cfg(windows)] + pub storageFileMappingHandle: HANDLE, + #[cfg(unix)] + storageFileHandle: int64_t, + pub storageFileSizeInBytes: int64_t, + pub pointerToMappedRegion: *mut c_void, + + pub currentMemoryPageSizeInBytes: int64_t, + pub serviceBlockSizeInBytes: int64_t, + pub baseLinksSizeInBytes: int64_t, + pub baseBlockSizeInBytes: int64_t, + pub storageFileMinSizeInBytes: int64_t, + + pub pointerToDataSeal: *mut int64_t, + pub pointerToLinkIndexSize: *mut int64_t, + pub pointerToMappingLinksMaxSize: *mut int64_t, + pub lpointerToPointerToMappingLinks: *mut LinkIndex, + pub lpointerToLinksMaxSize: *mut LinkIndex, + pub lpointerToLinksSize: *mut LinkIndex, + pub LpointerToLinks: *mut Link, + + pub pointerToUnusedMarker: *mut Link, +} diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 041a4c1..5475315 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -1,19 +1,54 @@ -#![feature(try_trait)] +//#![feature(try_trait)] +#![feature(thread_local)] #![feature(in_band_lifetimes)] use common::{*}; use link_c::{*}; -use persistent_memory_manager::{*}; +//use persistent_memory_manager::{*}; pub mod common; mod link_c; mod persistent_memory_manager_c; -pub mod persistent_memory_manager; +//pub mod persistent_memory_manager; #[cfg(test)] mod test { + use crate::common::RawDB; + use libc::malloc; + use crate::link_c::{RawDB_new, CreateLink, UpdateLink, DeleteLink}; + use crate::persistent_memory_manager_c::{OpenLinks, CloseLinks, GetLinksCount}; + use std::ffi::CString; + + #[test] + fn CrUD() { unsafe { + let db = RawDB_new(); + + let name = CString::new("юникод_data_base.links").unwrap(); + OpenLinks(db, name.as_ptr()); + + let itself = 0; + + let is_a = CreateLink(db, itself, itself, itself); + let is_not_a = CreateLink(db, itself, itself, is_a); + let link = CreateLink(db, itself, is_a, itself); + let thing = CreateLink(db, itself, is_not_a, link); + + UpdateLink(db, is_a, is_a, is_a, link); + + DeleteLink(db, is_a); + DeleteLink(db, thing); + + println!("Links count: {}", GetLinksCount(db)); + + CloseLinks(db); + }} + /* use crate::{*}; + use std::cell::RefCell; + use std::rc::Rc; + use std::sync::Arc; + use std::collections::hash_map::RandomState; #[test] fn it_works() { @@ -50,5 +85,5 @@ mod test { thing.delete(); println!("{:?}", mem.count()); - } + }*/ } diff --git a/rust/src/link_c.rs b/rust/src/link_c.rs index df9c655..a41003b 100644 --- a/rust/src/link_c.rs +++ b/rust/src/link_c.rs @@ -1,40 +1,50 @@ use crate::common::{*}; extern "C" { + pub fn RawDB_new() -> *mut RawDB; + pub fn GetSourceIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetLinkerIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetTargetIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetTime( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> SignedInteger; pub fn CreateLink( + db: *mut RawDB, source: LinkIndex, linker: LinkIndex, target: LinkIndex, ) -> LinkIndex; pub fn SearchLink( + db: *mut RawDB, source: LinkIndex, linker: LinkIndex, target: LinkIndex, ) -> LinkIndex; pub fn ReplaceLink( + db: *mut RawDB, index: LinkIndex, replacement: LinkIndex, ) -> LinkIndex; pub fn UpdateLink( + db: *mut RawDB, index: LinkIndex, source: LinkIndex, linker: LinkIndex, @@ -42,60 +52,73 @@ extern "C" { ) -> LinkIndex; pub fn DeleteLink( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ); pub fn GetFirstRefererBySourceIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetFirstRefererByLinkerIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetFirstRefererByTargetIndex( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> LinkIndex; pub fn GetLinkNumberOfReferersBySource( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> UnsignedInteger; pub fn GetLinkNumberOfReferersByLinker( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> UnsignedInteger; pub fn GetLinkNumberOfReferersByTarget( - index: LinkIndex + db: *mut RawDB, + index: LinkIndex, ) -> UnsignedInteger; pub fn WalkThroughAllReferersBySource( + db: *mut RawDB, root: LinkIndex, visitor: Visitor, ); pub fn WalkThroughReferersBySource( + db: *mut RawDB, root: LinkIndex, visitor: StoppableVisitor, ) -> SignedInteger; pub fn WalkThroughAllReferersByLinker( + db: *mut RawDB, root: LinkIndex, visitor: Visitor, ); pub fn WalkThroughReferersByLinker( + db: *mut RawDB, root: LinkIndex, visitor: StoppableVisitor, ) -> SignedInteger; pub fn WalkThroughAllReferersByTarget( + db: *mut RawDB, root: LinkIndex, visitor: Visitor, ); pub fn WalkThroughReferersByTarget( + db: *mut RawDB, root: LinkIndex, visitor: StoppableVisitor, ) -> SignedInteger; -} \ No newline at end of file +} diff --git a/rust/src/persistent_memory_manager.rs b/rust/src/persistent_memory_manager.rs index 416c93c..b2fc62e 100644 --- a/rust/src/persistent_memory_manager.rs +++ b/rust/src/persistent_memory_manager.rs @@ -99,6 +99,9 @@ impl<'a> LinkAdapter<'a> { // } } +#[thread_local] +static mut LOCK: bool = false; + pub struct Links; #[derive(Debug)] @@ -121,8 +124,13 @@ impl Links { let c_str = CString::new(path_str)?; let result = unsafe { OpenLinks(c_str.as_ptr()) }; + + //if unsafe { LOCK } { + // return Err(Error::from(ErrorKind::WouldBlock)); + //} + match result { - SUCCESS_RESULT => { Ok(PersistentMemoryManager {}) } + SUCCESS_RESULT => { /*unsafe { LOCK = true; }*/ Ok(PersistentMemoryManager {}) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } @@ -158,7 +166,7 @@ impl PersistentMemoryManager { pub fn close(&self) -> std::io::Result<()> { let result = unsafe { CloseLinks() }; match result { - SUCCESS_RESULT => { Ok(()) } + SUCCESS_RESULT => { /* unsafe { LOCK = false; }*/ Ok(()) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } diff --git a/rust/src/persistent_memory_manager_c.rs b/rust/src/persistent_memory_manager_c.rs index 203c294..b12927d 100644 --- a/rust/src/persistent_memory_manager_c.rs +++ b/rust/src/persistent_memory_manager_c.rs @@ -2,17 +2,17 @@ use crate::common::{*}; use libc::c_char; extern "C" { - pub fn OpenLinks(filename: *const c_char) -> SignedInteger; - pub fn CloseLinks() -> SignedInteger; + pub fn OpenLinks(db: *mut RawDB, filename: *const c_char) -> SignedInteger; + pub fn CloseLinks(db: *mut RawDB) -> SignedInteger; - pub fn GetMappedLink(mapped_index: SignedInteger) -> LinkIndex; - pub fn SetMappedLink(mapped_index: SignedInteger, link_index: LinkIndex); + pub fn GetMappedLink(db: *mut RawDB, mapped_index: SignedInteger) -> LinkIndex; + pub fn SetMappedLink(db: *mut RawDB, mapped_index: SignedInteger, link_index: LinkIndex); - pub fn WalkThroughAllLinks(visitor: Visitor); - pub fn WalkThroughLinks(visitor: StoppableVisitor) -> SignedInteger; + pub fn WalkThroughAllLinks(db: *mut RawDB, visitor: Visitor); + pub fn WalkThroughLinks(db: *mut RawDB, visitor: StoppableVisitor) -> SignedInteger; - pub fn GetLinksCount() -> UnsignedInteger; + pub fn GetLinksCount(db: *mut RawDB) -> UnsignedInteger; - pub fn AllocateLink() -> LinkIndex; - pub fn FreeLink(link_index: LinkIndex); + pub fn AllocateLink(db: *mut RawDB) -> LinkIndex; + pub fn FreeLink(db: *mut RawDB, link_index: LinkIndex); } \ No newline at end of file From 35ef885bf683462b5e61b4937396d34e52d03d55 Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Tue, 14 Sep 2021 23:04:20 +0300 Subject: [PATCH 06/13] Full write basic api --- .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 50572 -> 37922 bytes rust/src/lib.rs | 73 +++++++++++------- rust/src/persistent_memory_manager.rs | 64 ++++++++------- 3 files changed, 81 insertions(+), 56 deletions(-) diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a index 99d829aff7ce0b582e0c6e7704e2d56c36f95038..0924c17a206a6676bed81ed11fc95253c5697a75 100644 GIT binary patch literal 37922 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 NPTR%lS05n#{{zSyoKXM( diff --git a/rust/src/lib.rs b/rust/src/lib.rs index 5475315..9bb24ca 100644 --- a/rust/src/lib.rs +++ b/rust/src/lib.rs @@ -9,19 +9,37 @@ use link_c::{*}; pub mod common; mod link_c; mod persistent_memory_manager_c; -//pub mod persistent_memory_manager; +pub mod persistent_memory_manager; #[cfg(test)] mod test { - use crate::common::RawDB; + use crate::common::{RawDB, LinkIndex}; use libc::malloc; use crate::link_c::{RawDB_new, CreateLink, UpdateLink, DeleteLink}; use crate::persistent_memory_manager_c::{OpenLinks, CloseLinks, GetLinksCount}; use std::ffi::CString; + use crate::persistent_memory_manager::Links; #[test] - fn CrUD() { unsafe { + fn it_works() { + std::fs::remove_file("db.links"); + { + let mem = Links::create("db.links"); + println!("{:?}", mem); + // close db file + } + + let mem = Links::open("db.links").unwrap(); + println!("{:?}", mem); + mem.close().unwrap(); + } + + #[test] + fn c_like_CrUD() { + std::fs::remove_file("юникод_data_base.links"); + + unsafe { let db = RawDB_new(); let name = CString::new("юникод_data_base.links").unwrap(); @@ -42,34 +60,16 @@ mod test { println!("Links count: {}", GetLinksCount(db)); CloseLinks(db); - }} - /* - use crate::{*}; - use std::cell::RefCell; - use std::rc::Rc; - use std::sync::Arc; - use std::collections::hash_map::RandomState; - #[test] - fn it_works() { - std::fs::remove_file("db.links"); - { - let mem = Links::create("db.links"); - println!("{:?}", mem); - // close db file - } - - let mem = Links::open("db.links").unwrap(); - println!("{:?}", mem); - mem.close().unwrap(); - } + libc::free(db as *mut libc::c_void); + }} #[test] fn CrUD() { std::fs::remove_file("db.links"); let mem = Links::create("db.links").unwrap(); - let itself = 0; + let itself = 0 as LinkIndex /* optional */; let mut is_a = mem.create(itself, itself, itself); let is_not_a = mem.create(itself, itself, &is_a); @@ -84,6 +84,27 @@ mod test { is_a.delete(); // delete all thing.delete(); - println!("{:?}", mem.count()); - }*/ + println!("Links count: {:?}", mem.count()); + } + + #[test] + fn multi_file() { + std::fs::remove_file("1.links"); + std::fs::remove_file("2.links"); + + let mem1 = Links::create("1.links").unwrap(); + let mem2 = Links::create("2.links").unwrap(); + + mem1.create(1, 0, 2); + mem2.create(2, 0, 3); + + println!("mem1: {:?}", mem1); + println!("mem1 links count: {}", mem1.count()); + println!("{:-<10}", '-'); + println!("mem2: {:?}", mem2); + println!("mem2 links count: {}", mem1.count()); + println!("{:-<10}", '-'); + println!("mem1 close result: {:?}", mem1.close()); + println!("mem2 close result: {:?}", mem2.close()); + } } diff --git a/rust/src/persistent_memory_manager.rs b/rust/src/persistent_memory_manager.rs index b2fc62e..7dac705 100644 --- a/rust/src/persistent_memory_manager.rs +++ b/rust/src/persistent_memory_manager.rs @@ -2,7 +2,7 @@ use std::ffi::{CStr, CString, NulError}; use std::io::{Error, ErrorKind}; use std::path::Path; -use libc::c_char; +use libc::{c_char, c_void}; use crate::common::{*}; use crate::link_c::{*}; @@ -48,6 +48,12 @@ impl<'a> AsIndex for &LinkAdapter<'a> { } } +impl<'a> AsIndex for &mut LinkAdapter<'a> { + fn index(&self) -> LinkIndex { + self.index + } +} + impl<'a> Deref for LinkAdapter<'a> { type Target = LinkIndex; @@ -80,32 +86,23 @@ impl<'a> LinkAdapter<'a> { // } // } - pub fn update(&mut self, source: T, linker: L, target: S) + pub fn update(&mut self, source: S, linker: L, target: T) where S: AsIndex, L: AsIndex, T: AsIndex { - self.index = unsafe { UpdateLink(self.index, source.index(), linker.index(), target.index()) } + self.index = *self.parent.update(&*self, source, linker, target) } - pub fn delete(self) { - unsafe { DeleteLink(self.index) } + pub fn delete(self) { + self.parent.delete(self) } - - // pub fn replace(&mut self, other: O) { - // self.index = unsafe { CreateLink(source.index(), linker.index(), target.index()) }, - // } - - // pub fn drop_index(self) -> LinkIndex { - // self.index() - // } } -#[thread_local] -static mut LOCK: bool = false; - pub struct Links; #[derive(Debug)] -pub struct PersistentMemoryManager; +pub struct PersistentMemoryManager { + db: *mut RawDB +} impl Links { const ITSELF: LinkIndex = 0; @@ -122,15 +119,13 @@ impl Links { Some(str) => { path_str = str } } - let c_str = CString::new(path_str)?; - let result = unsafe { OpenLinks(c_str.as_ptr()) }; + let db = unsafe { RawDB_new() }; - //if unsafe { LOCK } { - // return Err(Error::from(ErrorKind::WouldBlock)); - //} + let c_str = CString::new(path_str)?; + let result = unsafe { OpenLinks(db, c_str.as_ptr()) }; match result { - SUCCESS_RESULT => { /*unsafe { LOCK = true; }*/ Ok(PersistentMemoryManager {}) } + SUCCESS_RESULT => { Ok(PersistentMemoryManager { db }) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } @@ -152,21 +147,29 @@ impl PersistentMemoryManager { pub fn create(&'a self, source: S, linker: L, target: T) -> LinkAdapter<'a> where S: AsIndex, L: AsIndex, T: AsIndex { - LinkAdapter { parent: self, index: unsafe { CreateLink(source.index(), linker.index(), target.index()) } } + let index = unsafe { CreateLink(self.db, source.index(), linker.index(), target.index()) }; + LinkAdapter { parent: self, index } } - // pub fn search(&'a self, source: LinkIndex, linker: LinkIndex, target: LinkIndex) -> LinkAdapter<'a> { - // LinkAdapter { parent: self, index: unsafe { SearchLink(source, linker, target) } } - // } + pub fn update(&'a self, index: I, source: S, linker: L, target: T) -> LinkAdapter<'a> + where I: AsIndex, S: AsIndex, L: AsIndex, T: AsIndex + { + let index = unsafe { UpdateLink(self.db, index.index(), source.index(), linker.index(), target.index()) }; + LinkAdapter { parent: self, index } + } + + pub fn delete(&'a self, index: I) { + unsafe { DeleteLink(self.db, index.index()) }; + } pub fn count(&self) -> usize { - (unsafe { GetLinksCount() }) as usize + (unsafe { GetLinksCount(self.db) }) as usize } pub fn close(&self) -> std::io::Result<()> { - let result = unsafe { CloseLinks() }; + let result = unsafe { CloseLinks(self.db) }; match result { - SUCCESS_RESULT => { /* unsafe { LOCK = false; }*/ Ok(()) } + SUCCESS_RESULT => { Ok(()) } _ => { Err(Error::from_raw_os_error(result as i32)) } } } @@ -175,5 +178,6 @@ impl PersistentMemoryManager { impl Drop for PersistentMemoryManager { fn drop(&mut self) { self.close(); + unsafe { libc::free(self.db as *mut c_void) } } } \ No newline at end of file From 014c333648f3a7bc3f2b99ae173f5b9dd71a2c4a Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Tue, 14 Sep 2021 23:05:07 +0300 Subject: [PATCH 07/13] Use linux build --- .../dylibs/libPlatform.Data.Triplets.Kernel.a | Bin 37922 -> 50572 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rust/dylibs/libPlatform.Data.Triplets.Kernel.a b/rust/dylibs/libPlatform.Data.Triplets.Kernel.a index 0924c17a206a6676bed81ed11fc95253c5697a75..99d829aff7ce0b582e0c6e7704e2d56c36f95038 100644 GIT binary patch literal 50572 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 NPTR%lS05n#{{zSyoKXM( literal 37922 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 Date: Wed, 15 Sep 2021 18:21:38 +0300 Subject: [PATCH 08/13] Update CD --- .github/workflows/CD.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index b8e14b0..43b2efd 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -11,8 +11,21 @@ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SCRIPTS_BASE_URL: https://raw.githubusercontent.com/linksplatform/Scripts/master/MultiProjectRepository + + jobs: - testAndDeploy: + rust: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + submodules: true + - name: Rustup nightly + run: rustup toolchain install nightly + - name: Rust test + run: cargo +nightly test --verbose + + csharpTestAndDeploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 From bbe44a16968dd48ec0581e694828ec6508e0c943 Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Wed, 15 Sep 2021 18:23:27 +0300 Subject: [PATCH 09/13] Update CD --- .github/workflows/CD.yml | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 43b2efd..75fc33b 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -11,8 +11,6 @@ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SCRIPTS_BASE_URL: https://raw.githubusercontent.com/linksplatform/Scripts/master/MultiProjectRepository - - jobs: rust: runs-on: ubuntu-latest @@ -69,18 +67,18 @@ jobs: wget "$SCRIPTS_BASE_URL/publish-release.sh" bash ./publish-release.sh - pushCSharpNuGetToGitHubPackageRegistry: - needs: testAndDeploy - if: github.event_name == 'push' - runs-on: windows-latest - steps: - - uses: actions/checkout@v1 - with: - submodules: true - - uses: nuget/setup-nuget@v1 - - name: Publish CSharp NuGet to GitHub Package Registry - run: | - dotnet build -c Release - dotnet pack -c Release - nuget source Add -Name "GitHub" -Source "https://nuget.pkg.github.com/linksplatform/index.json" -UserName linksplatform -Password ${{ secrets.GITHUB_TOKEN }} - nuget push **/*.nupkg -Source "GitHub" -SkipDuplicate + # pushCSharpNuGetToGitHubPackageRegistry: + # needs: testAndDeploy + # if: github.event_name == 'push' + # runs-on: windows-latest + # steps: + # - uses: actions/checkout@v1 + # with: + # submodules: true + # - uses: nuget/setup-nuget@v1 + # - name: Publish CSharp NuGet to GitHub Package Registry + # run: | + # dotnet build -c Release + # dotnet pack -c Release + # nuget source Add -Name "GitHub" -Source "https://nuget.pkg.github.com/linksplatform/index.json" -UserName linksplatform -Password ${{ secrets.GITHUB_TOKEN }} + # nuget push **/*.nupkg -Source "GitHub" -SkipDuplicate From ae1170626d5fb2c4a178eeb17959320a67765e48 Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Wed, 15 Sep 2021 18:23:59 +0300 Subject: [PATCH 10/13] Update CD --- .github/workflows/CD.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 75fc33b..ce6610d 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -11,6 +11,7 @@ env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SCRIPTS_BASE_URL: https://raw.githubusercontent.com/linksplatform/Scripts/master/MultiProjectRepository + jobs: rust: runs-on: ubuntu-latest From b0d0c350f96eae6ec3ce9b6b02be972a1f3e9b6a Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Wed, 15 Sep 2021 18:55:00 +0300 Subject: [PATCH 11/13] Update CD --- .github/workflows/CD.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index ce6610d..a763b41 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -20,9 +20,12 @@ jobs: with: submodules: true - name: Rustup nightly - run: rustup toolchain install nightly + run: | + rustup toolchain install nightly - name: Rust test - run: cargo +nightly test --verbose + run: | + cd rust + cargo +nightly test --verbose csharpTestAndDeploy: runs-on: ubuntu-latest From 755365a109a99dfc9b49d33d4f6afd8e9bdd2f8f Mon Sep 17 00:00:00 2001 From: uselessgoddess Date: Wed, 15 Sep 2021 18:58:16 +0300 Subject: [PATCH 12/13] Show output --- .github/workflows/CD.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index a763b41..0bb7004 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -25,7 +25,7 @@ jobs: - name: Rust test run: | cd rust - cargo +nightly test --verbose + cargo +nightly test --verbose -- --show-output csharpTestAndDeploy: runs-on: ubuntu-latest From c805f495da88dbb33366e8d02883b282a62fc203 Mon Sep 17 00:00:00 2001 From: uselessgoddess <68294279+uselessgoddess@users.noreply.github.com> Date: Sun, 24 Oct 2021 16:32:53 +0300 Subject: [PATCH 13/13] We can reenable this section Co-authored-by: Konstantin Dyachenko --- .github/workflows/CD.yml | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/CD.yml b/.github/workflows/CD.yml index 0bb7004..a9af10d 100644 --- a/.github/workflows/CD.yml +++ b/.github/workflows/CD.yml @@ -71,18 +71,18 @@ jobs: wget "$SCRIPTS_BASE_URL/publish-release.sh" bash ./publish-release.sh - # pushCSharpNuGetToGitHubPackageRegistry: - # needs: testAndDeploy - # if: github.event_name == 'push' - # runs-on: windows-latest - # steps: - # - uses: actions/checkout@v1 - # with: - # submodules: true - # - uses: nuget/setup-nuget@v1 - # - name: Publish CSharp NuGet to GitHub Package Registry - # run: | - # dotnet build -c Release - # dotnet pack -c Release - # nuget source Add -Name "GitHub" -Source "https://nuget.pkg.github.com/linksplatform/index.json" -UserName linksplatform -Password ${{ secrets.GITHUB_TOKEN }} - # nuget push **/*.nupkg -Source "GitHub" -SkipDuplicate +pushCSharpNuGetToGitHubPackageRegistry: + needs: testAndDeploy + if: github.event_name == 'push' + runs-on: windows-latest + steps: + - uses: actions/checkout@v1 + with: + submodules: true + - uses: nuget/setup-nuget@v1 + - name: Publish CSharp NuGet to GitHub Package Registry + run: | + dotnet build -c Release + dotnet pack -c Release + nuget source Add -Name "GitHub" -Source "https://nuget.pkg.github.com/linksplatform/index.json" -UserName linksplatform -Password ${{ secrets.GITHUB_TOKEN }} + nuget push **/*.nupkg -Source "GitHub" -SkipDuplicate