O Simple.Data parokrotnie już pisałem na blogu. W aktualnym projekcie używamy tej biblioteki dość intensywnie – tak naprawdę zastąpiliśmy nią całkowicie NHibernate i jest to nasz jedyny sposób na kontakt z bazą. W większości scenariuszy w tym systemie ów wybór sprawdził się znakomicie. Ma to także swoje wady, ale o tym może kiedy indziej.
Problem pojawia się w momencie, gdy chcemy wykorzystać Simple.Data z bazą danych, która nie jest “oficjalnie” wspierana przez autora – Marka Rendle. My używamy PostgreSql, a adapter do tej bazy był nieco… przestarzały. Na tyle przestarzały, że nie dało się go używać, ponieważ został skompilowany z baaardzo dawną wersją Simple.Data, zawierającą sporo irytujących bugów (jak na przykład zwracanie 0 zamiast null dla int?, nawet jeśli w bazie null siedzi).
Postanowiliśmy zainwestować kilka godzin i spróbować zaktualizować ten adapter. Okazało się to dość proste, a efekt można zobaczyć na ultrikowym githubie: https://github.com/ultrico/Simple.Data.PostgreSql/.
Tak naprawdę początkowo jedyne co mieliśmy do zrobienia to zmiana sygnatury dwóch metod, które zmieniły się w publicznym API Simple.Data pomiędzy wersją 0.16.2.2 a 0.18.3.1.
Z czasem prawdopodobnie natkniemy się na inne “issues”, z którymi, z racji przejęcia kodu, będziemy mogli własnymi siłami powalczyć.
Na pierwszy ogień poszło wsparcie dla enumów. Poprzedni adapter wywalał się w momencie insertu do bazy obiektu z właściwością enum, co prowadziło do dość brzydkich “workarounds”: dodawania do klasy właściwości typu int mapowanej do kolumny w bazie i enumowych gettera/settera do ustawiania tego w kodzie. Gdy drugi raz przyszło takie coś pisać, nastąpił moment “kiedy powiem sobie dość”. Okazało się, że fix zajął raptem niecałą godzinę i w naszej wersji adaptera można wrzucić do PostgreSql enuma za pomocą Simple.Data – zarówno przy wstawianiu jednego, jak i wielu obiektów (bo błąd występował w obu przypadkach).
Na ogień drugi – stronicowanie. Wygląda na to, że oryginalny autor przerabiał po prostu adapter do MySql, bo Skip().Take() generowało instrukcję LIMIT x,y, co w Postgre jest oczywiście niepoprawne – tutaj trzeba użyć składni LIMIT x OFFSET y. Co ciekawe, przy uruchomieniu testów wszystko przechodzi… bo test sprawdzający poprawność stronicowania został opatrzony atrybutem: [Ignore(“Skip does not appear to be working”)]. Nie-nice. Tak czy siak – poprawione.
Prawdopodobnie problemów tej natury będzie w przyszłości więcej i, równie prawdopodobnie, będziemy się z nimi w miarę upływu czasu rozprawiać. Jeśli zatem trzymasz dane w PostgreSql i chcesz nałożyć na to Simple.Data, zachęcam do obserwowania projektu…. a najlepiej do aktywnego udziału w jego rozwoju. Nie ma go na żadnym nugecie, więc jedyny sposób to clone/fork i kompilacja rękami własnymi.
Custom SimpleData.PostgreSql | Maciej Aniserowicz o programowaniu…
Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl…
O ile pamietam pracujecie na Mono – rozumiem ze “zrobione a nawet sie kompiluje” ?
BTW to ze nie ma na NuGet – moze jakis PR do autora i prosba o merge i opublikowanie nowej wersji ?
Z mono na razie jest przerwa, ale “oryginalny” adapter działał więc problemu być nie powinno.
PR jest już od kogoś innego, od dawna ignorowany.
Najwyraźniej autor miał od jakiegoś czasu konkretne plany, co do tego projektu i zdecydował się na wprowadzenie poprawek dopiero w wersji 2.0, nad którą zaczął pracować trzy dni temu (http://blog.markrendle.net/2013/09/18/simple-data-2-0/ )
Mark nie jest autorem tego adaptera i to właśnie był problem :)
Sorki. Nie trzy dni temu tylko wczoraj ;)