{"id":21402463,"url":"https://github.com/elvircrn/biblioteka","last_synced_at":"2026-05-19T17:12:32.246Z","repository":{"id":91018561,"uuid":"72960329","full_name":"elvircrn/Biblioteka","owner":"elvircrn","description":null,"archived":false,"fork":false,"pushed_at":"2017-01-19T00:49:25.000Z","size":209,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"Zadaca3","last_synced_at":"2025-03-16T16:25:36.081Z","etag":null,"topics":["c-sharp","entity-framework","oracle-db","university-project","winforms"],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elvircrn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-06T00:01:36.000Z","updated_at":"2017-11-17T12:45:26.000Z","dependencies_parsed_at":null,"dependency_job_id":"b628b015-9ebe-4bc8-9d35-9163b5a11c36","html_url":"https://github.com/elvircrn/Biblioteka","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/elvircrn/Biblioteka","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvircrn%2FBiblioteka","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvircrn%2FBiblioteka/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvircrn%2FBiblioteka/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvircrn%2FBiblioteka/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elvircrn","download_url":"https://codeload.github.com/elvircrn/Biblioteka/tar.gz/refs/heads/Zadaca3","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elvircrn%2FBiblioteka/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33225437,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-19T15:49:41.270Z","status":"ssl_error","status_checked_at":"2026-05-19T15:49:22.917Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["c-sharp","entity-framework","oracle-db","university-project","winforms"],"created_at":"2024-11-22T15:37:46.466Z","updated_at":"2026-05-19T17:12:32.228Z","avatar_url":"https://github.com/elvircrn.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# RPR Biblioteka\n\nDisclaimer: repozitorij je bio privatan za vrijeme trajanja zadace\n\n## Podaci o autoru:\n\tElvir Crncevic, index: 17455\n\n## User credentials za koristenje aplikacije\n\n* Bibliotekar\n    * Username: bibliotekar0 \n    * Password: aaa\n* Admin\n    * Username: admin \n    * Password: admin\n* Clan\n    * Username: clan0 \n    * Password: aaa\n\n## Baza podataka\n\n### Tabele\nZa modeliranje baze podataka je koristen OracleManagedDataAccess.EntityFramework. To je omogucilo generisanje baze podataka uz 'neznatne' izmjene u samom modelu. U klasi ApplicationDbContext definisu su definisane sve tabele pomocu DBset propertija koje su napunjene kroz Seed metodu u Configuration klasi. Ova metoda je pokrenuta prije slanja zadace i nije preporucljivo njeno ponovno pokretanje. O dio ORM-a se nalaze u Bibliteka.Model, \n### Servisi\nBiblioteka.BLL sadrzi service koji su zaduzeni za CRUD operacije. Svaki servis posjeduje objekat ApplicationDbContext preko kojeg pristupa bazi podataka. Kljucni dio implementacije svakog servisa (za primjer je uzet servis za knjige) je sljedece lazy (ili bar pokusaj) loadanja:\n\nKnjigaManager.cs:\n```csharp\nApplicationDbContext _context;\nprivate static readonly int SifraLength = 10;\n\nprivate List\u003cKnjiga\u003e _knjigasCache;\n\nprivate List\u003cKnjiga\u003e _knjige\n{\n    get\n    {\n        if (_knjigasCache == null)\n            return _knjigasCache = _context.Knjigas.Include(\"SpisakAutora\").ToList();\n        else\n            return _knjigasCache;\n    }\n}\n```\nIdeja je da se svako pozivanje kontejnerskog objekta presretne sa pozivom na bazu(ako je to neophodno) i da se cache-iraju podaci ako to vec nije ucinjeno. To je ucinjeno za sve servise(managere) koji na pocetku dobijaju ApplicationDbContext objekat.\n\nProgram.cs\n\n\n```csharp\nusing (ApplicationDbContext context = new ApplicationDbContext())\n{\n\tRun(new LogInForm(DataAPI.Inject(context)));\n}\n//...\ndataAPI.UserAPI = new UserManager(context);\n//...\n```\n\n\nFunkcionalnost servisa je zadrzana u odnosu na prethodnu zadacu te oni sada rade sa bazom podataka... nadam se ...\n\n### Serijalizacija\n\nXml serijalizacija i deserijalizacija je implementirana asinhrono za clanove, radnike i knjige, a binarna serijalizacija samo podrzava upise :(\n\n### Animacija logo-a\nVrsi se crtanje Hilbertovog fraktala koji se restartuje kada dodje do kraja (jos nisam svjedocio tome).\t\n### Asinhroni rad sa datotekama\nXml serijalizacija radi asinhrono i implementirana je kroz klase u Common.XmlIO i Common.XmlSerializer. Common inace sadrzi pomocne metode, i gotovo svi projekti imaju referencu na ovaj paket klasa. Binarni Serializer, nazalost, radi samo sinhrono. \n### TPL\n\nClanManager.cs:\n```csharp\npublic void AddClanRange(List\u003cClan\u003e list)\n{\n    int ind = 0;\n    var cd = new ConcurrentDictionary\u003cint, Clan\u003e(list\n            .Select(x =\u003e new KeyValuePair\u003cint, Clan\u003e(ind++, x))\n            .ToList());\n    Parallel.ForEach(cd, x =\u003e\n    {\n        AddClan(x.Value);\n    });\n}\n// Concurrent Dictionary\npublic List\u003cKnjiga\u003e SearchByNaziv(string naziv, Comparator comparator = null)\n{\n    int ind = 0;\n    var cd = new ConcurrentDictionary\u003cint, Knjiga\u003e(_knjige\n        .Select(x =\u003e new KeyValuePair\u003cint, Knjiga\u003e(ind++, x))\n        .ToList());\n\n    if (comparator != null)\n        return cd.Where(x =\u003e comparator(x.Value)).ToList().Select(x =\u003e x.Value).ToList();\n    else\n        return _knjige.Where(x =\u003e x.Naslov == naziv).ToList();\n}\n```\n\nKnjigaManager.cs\n```csharp\n// Concurrent Dictionary\npublic List\u003cKnjiga\u003e SearchByNaziv(string naziv, Comparator comparator = null)\n{\n    int ind = 0;\n    var cd = new ConcurrentDictionary\u003cint, Knjiga\u003e(_knjige\n        .Select(x =\u003e new KeyValuePair\u003cint, Knjiga\u003e(ind++, x))\n        .ToList());\n\n    if (comparator != null)\n        return cd.Where(x =\u003e comparator(x.Value)).ToList().Select(x =\u003e x.Value).ToList();\n    else\n        return _knjige.Where(x =\u003e x.Naslov == naziv).ToList();\n}\n\n```\n\nWorkerManager.cs\n```csharp\npublic void AddWorkerRange(List\u003cWorker\u003e list)\n{\n    int ind = 0;\n    var cd = new ConcurrentDictionary\u003cint, Worker\u003e(list\n        .Select(x =\u003e new KeyValuePair\u003cint, Worker\u003e(ind++, x))\n        .ToList());\n\n    Parallel.ForEach(cd, x =\u003e\n    {\n        AddWorker(x.Value);\n    });\n}\n```\n\n## Paralelizacija serijalizacija (jedan primjer)\n```csharp\nusing (var fbd = new FolderBrowserDialog())\n{\n    DialogResult result = fbd.ShowDialog();\n\n    if (result == DialogResult.OK \u0026\u0026 !string.IsNullOrWhiteSpace(fbd.SelectedPath))\n    {\n        string path = fbd.SelectedPath + @\"\\clanovi.xml\";\n\n        using (System.IO.StreamWriter file = new System.IO.StreamWriter(path))\n        {\n            var uiContext = TaskScheduler.FromCurrentSynchronizationContext();\n            Task[] tasks = new Task[] { file.WriteAsync(Common.Serialization.XMLSerializer.SerializeToXmlString(_data.ClanAPI.GetClans()\n                                                                                                           .Select(x =\u003e (Clan)x)\n                                                                                                           .ToList())) };\n            await Task.Factory.ContinueWhenAll(tasks, antecedents =\u003e\n             {\n                 MessageBox.Show(\"Serijalizacija clanova zavrsena\");\n             }, CancellationToken.None, TaskContinuationOptions.None, uiContext);\n        }\n    }\n}\n```\n\n## UWP Aplikacija\nNe egzistira...\n\nTakodje nije pozeljno diskonektovati se sa interneta za vrijeme rada aplikacije.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvircrn%2Fbiblioteka","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felvircrn%2Fbiblioteka","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felvircrn%2Fbiblioteka/lists"}