Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Massive 3? #302

Closed
mikebeaton opened this issue Feb 9, 2017 · 24 comments
Closed

Massive 3? #302

mikebeaton opened this issue Feb 9, 2017 · 24 comments

Comments

@mikebeaton
Copy link
Contributor

mikebeaton commented Feb 9, 2017

Dear Frans,

Is there any potential for a new, beta Massive 3.0 branch?

We've been discussing loads of issues which I think could live there:

I'd be very happy to work on any and all of these. If you're not really interested - at least not in any of the larger breaking changes or refactorings, I'd also be interested in popping up a v3.0 branch of my own.

Mike

@mikebeaton mikebeaton changed the title Massive v3.0?? Massive v3.0? Feb 9, 2017
@mikebeaton mikebeaton changed the title Massive v3.0? Massive v3.0?? Feb 9, 2017
@mikebeaton
Copy link
Contributor Author

c.f. #234 where @FransBouma has provided good reasons NOT to support transactions in Massive, and a way to work round this if you need to

@avinashl3175
Copy link

Hi @mikebeaton ! Can you pls provided massive version for dot net core, since you are almost done as mentioned in #265

@mikebeaton mikebeaton changed the title Massive v3.0?? Massive 3 Mar 28, 2017
@mikebeaton
Copy link
Contributor Author

mikebeaton commented Mar 28, 2017

https://github.com/MikeBeaton/Massive/tree/Massive3

This version of Massive supports:

  • .NET Core
  • MySQL (back-ported to v2.0 already)
  • Stored Procedures
  • Named and directional parameters (these are optional; the old calls still work and remain the preferred way of doing things for simpler calls)
  • Cursors (both directions, plus automatic dereferencing)
  • Multiple result sets
  • Access to multiple ADO.NET providers at once

There is a README.

It is compile and link compatible with Massive v2.0.

[Edited: No unlinked organisation, sorry.]

@mikebeaton
Copy link
Contributor Author

This potentially addresses: #263, #265, #293 (also #285 - correctly)

@FransBouma
Copy link
Owner

What's 'massive3' ? Looks like a fork to split the repository in two (this one and the one at Massive3)? If you wanted to fork this to take over massive, I rather would have liked it if you would have said so.

Not cool.

@mikebeaton
Copy link
Contributor Author

mikebeaton commented Mar 28, 2017

It's a huge bunch of new features. It's entirely comptaible with the existing Massive, because you emphasized the need for that. Everything about what I think it is, is in the README. I offered to work with you on Massive, privately, you told me never to contact you privately and that you didn't want any help with large features as it was quicker to do them yourself than to work with someone else. Since then, I have done all the large features listed, because I want them, and because other people need them. At the moment, the only announcement or publicity about this is precisely this issue. It can go wherever we both want it to go next.

@FransBouma
Copy link
Owner

FransBouma commented Mar 28, 2017

It can go only one way: this repository right here is Massive and you can discuss what you want to add, but if you want to fork it, to split it in two, then you're on your own.

You have one problem though: I own the copyright of the code I wrote, not you, and with v2.0 that's about all lines, give or take the method signatures and class declarations. You can fork all you want, but I don't give you permission to use any of the Massive 2.0 code as you own 0.0 of that, I do. Make no mistake, I am very harsh in protecting my work. I will report your repo as stolen code to github if you keep it up like this in its own organisation. I will check within half an hour and if it's not gone I will report it.

You can fork Massive on your own account and develop it there, but there's a key difference doing that with what you've done now: developing your own fork as a fork on your account still has ties with its upstream, namely this repository. What you have done is effectively taking my code without ties to an upstream and uploading it as your own to an organisation / account you control. That violates my copyright.

And don't make this out like I refused to let you built cool stuff, but that's absolutely not the case. You wanted to talk privately and I refused that because this is an OSS repo and things have to be done in the open. You proposed a lot of things which were not going to end up well, and would take a lot of time to debate, time I didn't have.

@FransBouma
Copy link
Owner

I now see you also want to get massive uploaded to nuget. I can assure you, if you do, I'll ask Microsoft to take it down, because it will forever block the official repository (this one) to upload a nuget package for Massive and you don't own the official repository: @robconery officially passed it on to me, not you, to make sure it stays alive.

This isn't how OSS works. You have central repositories users look at for getting the official bits. you have forks of these repos (with ties to upstream) where people add new stuff and then give back through PRs. What you've done is take the repository and upload it to a spot where you control it and want to move the train forward in the direction you think is best. That only benefits you, not the users of Massive, nor any other contributors.

@FransBouma
Copy link
Owner

Reported.

@FransBouma
Copy link
Owner

FransBouma commented Mar 28, 2017

This repository contains the copyrighted work of all contributors, not only me, but a lot of others too. I can't do anything else but to issue a DMCA takedown on behalf of everyone who has contributed to this repository and have your Massive3 organisation removed.

Again, I have no problem with you keeping your Massive fork on your own account with upstream ties to this repository (i.e. https://github.com/MikeBeaton/Massive) and do whatever you want there. That's how this model works: if you want to give back to the main repo, you can, but you don't have to. That's fine.

What your 'Massive3' organisation suggests is that that is the official Massive repository. It's not. For that I have to issue the DMCA route. I hate that, to be honest, but it's the right thing to do in this case.

@robconery
Copy link
Contributor

robconery commented Mar 28, 2017

Hi there - since I was tagged above I thought I'd weigh in :). I do have a few thoughts...

@FransBouma I completely understand how frustrating this might be. Have to say that @mikebeaton's approach here is more than a little overbearing and unkind - you (and I) have put in a lot of work and hijacking that is ... really quite bullshitty.

I might suggest, @mikebeaton, that if you want to do things your way you create your own project. Massive has inspired any number of other toolsets, all of which managed to create their own thing. What you're doing here amounts to a bit of "I know better" hostility and, on a personal level, makes me more than a bit cranky.

EDIT: I had a little blurb here trying to stay balanced but then yeah... I saw the org and the new name and... no fucking way. @mikebeaton this is complete shit.

@FransBouma
Copy link
Owner

FransBouma commented Mar 28, 2017

@robconery The fork itself is fine, if he keeps it as a normal github fork. The problem I have is with the 'Massive3' organisation which hosts this new Massive fork as well: it suggests that's the official repository. It's not. A github fork itself has ties to its upstream: users can see 'oh this is a fork of another repo' and whether or not decide to go there. But more importantly: they know the origin of the code: where it came from.

For a user IMHO this is very important. What if I add new stuff to Massive and it creates two parallel universes? Which Massive is Massive? the one on some random guy's account (this repo) or the one on the official looking 'Massive3' account? It even has a logo!

I agree that taking the DMCA route sucks and if there would have been another way I would have: github said they need a DMCA takedown notice to take down an account so I used that. If Mike wants to write Massive SuperExtraOrdinair in his own repo as a github fork, he can and I don't mind: it's a downstream fork, and people do that all the time, that's github. But the upstream ties are crucial: a user of some code on some repo has to know it's a fork and not the official codebase. An official org like 'Massive3' with a repo that doesn't have any upstream ties is a completely different thing.

We'll see what github will do. If they keep it up and @mikebeaton wants to keep it up too, then there's not much else I can do besides ignore it completely and tell @mikebeaton to go fuck himself. It's sad though. He contributed MySQL support which was great and works well. I have no idea why people then all of a sudden think they need to control the universe.

@robconery
Copy link
Contributor

@FransBouma yeah edited the comment above. Sorry for this mate; I'll do what I can to help out.

@FransBouma
Copy link
Owner

@robconery thanks man :) I hope this is solved so all parties can agree on its solution, as that's best for Massive's users. Time will tell, I guess ;)

@mikebeaton
Copy link
Contributor Author

mikebeaton commented Mar 28, 2017

No unlinked organisation any more. Sorry.

I did this because I wanted SP support. In fact because I'd already added SP support to my own copy, and thought it was good enough to commit back.

You said that my proposed SP support was DB specific, Frans, and that it could never support various other useful features like properly handled nulls, or cursors. Which was a challenge, obviously. Especially because I had specifically intended it NOT to be DB specific, and was sure it could handle nulls. But cursors... hmm... intriguing. Now it does all that. (And that's directly thanks to you pointing out all the things it needed to do - and how - if it wanted to try to be properly good.)

As part of that I added MySQL support, as much as anything (in fact, more than anything) to be as sure as possible that I had done my SP, cursor, etc. support right.

I also (now) want and need .NET Core support. I think the post by @avinashl3175 in #265, just before I was ready to put up what I'd been doing, correctly captures that Massive will lose market share sooner rather than later without it. (That's in my own, not humble enough, opinion.) My own company is exactly just about to need Massive with .NET Core, or else to switch to something else, for example.

Supporting multiple providers at once genuinely made it easier to port to .NET Core, and is pretty obviously a nice feature.

And making it all so that you can literally drop it into the Massive v2.0 test suite, and it all runs, without any changes whatsoever required, I think is nice too. And - like a lot of what I've done - a direct response to the feedback you were kind enough to take time to give on the various sub-issues which I raised, Frans.

Of course, the whole thing, every part of it, is a big bunch of work - with a lot of careful testing, and a lot of new tests.

But it is built on @robconery's original Massive, which is genius, and your repository and all the very useful new features which that brings to Massive, too. It's never going to be anything other than that.

But now what, I don't know.

  • If my 'Massive3' (or whatever) is not Massive, no one's going to use it (but I can't make it be Massive; sorry, f*** up - or more - on my part - sorry again)
  • If Massive doesn't get .NET Core asap, I think people might start dropping off using Massive
  • For that matter, this version adds a bunch of features which otherwise might make someone choose one of the other MicroORM's, over the really nice, easy syntax of Massive
  • If Massive isn't on NuGet at some point, I think that might reduce it's traction too
    o But being a NuGet dll is not really the original single file idea of Massive v1.0 (and Massive v2.0, kind of) at all (and pace the 'fake' single file thing which PetaPoco now does); even though the codebase and API of what I've done is still (exactly) Massive (plus new things)
    o This is now a relatively big project (and it was in v2.0 too) - it's not really a drop in file any more; not one that the average user can reasonably be expected to get to grips with; it just needs to run, and work, for people who aren't going to contribute to the codebase - doesn't it?
  • But apart from MySQL, which is already in the main line anyway, the new code isn't really a bunch of separate features, which makes it a pretty big ball of code... even though it is a bunch of reasonably clear and self-contained commits, and (all the way through) I've refactored absolutely as little as possible (and spent a lot of extra time doing so).

Well, there it is - it does some stuff. Hmm.

And sorry, again.

@mikebeaton mikebeaton changed the title Massive 3 Massive 3? Mar 29, 2017
@FransBouma
Copy link
Owner

I'm glad the 'Massive3' organisation is now gone so there's no confusion what the official massive repository is for users. As for .NET core, the plan is to wait for netstandard2.0. It will arrive this summer and as many ppl wait for that before moving over to .net core, I don't see a problem to wait too.

About nuget, Massive is intended to be distributed as source files, because that encourages people to alter the code to their liking if they want to. A nuget package doesn't. I'll think about it.

About you personally, @mikebeaton: trust has been broken. I liked the contribution of the MySQL support, but your move to make your massive fork 'the future' (I read your readme version, I was not amused to say the least) broke my trust in you. I don't see myself merge code from you ever again, sorry.

@mikebeaton
Copy link
Contributor Author

Hi Frans.

You've said your piece, so I might as well say mine.

I produced this code in good faith. It has a LOT of good (careful, cleanly coded) new features, and it was a lot of hard work. I announced that I was doing this, in this issue: see the first message! You left it open. So I did it.

I said that it was a beta/test/trial version. It still is. Sorry about the comment about 'The Future', but I did (and do) mean a (beta/test/trial) comment (in a beta/test/trial version) about a possible future of Massive. Depending on what you think about the beta/test/trial version which I'm showing to you.

But I stuffed up. I pissed you off. Bad Idea. And RobConery. Bad idea. And various users of Massive who also commented in that 'Massive3' repository (deleted, by me), and here, that I stuffed up.

Then again... there's a bunch of stuff in here that you said couldn't be done as I was doing it (#281/#293 SPs, #285 add args to TryInvokeMember). I guess that's the stuff that was "not going to end up well". It has been done, that way. It works. It hasn't ended badly (in terms of technically). And another bunch of stuff which has been asked for for 5+ years (SPs), 2-ish years (+) (MySQL) or ~1 years (.NET Core)... but hasn't ever happened. Except now, in a lame languishing branch by me, it has. (And by the way, I have committed back a TON of stuff to the main repo, in completely good faith, as I have been going - just look at the recent commit list.)

I offered to work with you on these big new features, which I wanted to contribute to, in this codebase, in completely good faith, but you flat out refused. You said you wanted to do them yourself, and that it took more time than it was worth to let anyone else contribute big new features. You did say that, Frans. You are maintaining Massive extremely well, and of course you made a huge contribution to the codebase when you took it on. Massive is stable and solid. But it is not moving forwards fast, right now. Maybe it doesn't need to. But since the scenery (changes to .NET) is moving fast, it is just right now in time starting to look like it will get left behind - as a live project which people actually use, rather than as a genius point in the history of MicroORMs.

It is also not true that all the lines of code are yours (I'm talking about authorship, not copyright, here). It's kind of a crazy claim. And you make it (explicitly or implicitly) several times in comments on various issues here. I know the codebase at different versions very well now, and it's simply not true... I'm sure you touched almost every line, but you simply didn't re-write (all of) it. A lot of the code is still Massive v1.0 code. No more than it could possibly be true that all the lines of code in this beta/test/trial branch are by me.

Your approach to all the big new things has been (for some years now): "I'll do them soon, I just have to write the next version of my commercial ORM LLBLGen Pro, but don't worry, it won't be long, I'll soon be back to adding new features to the different, free, open source ORM which I wrote.". But it has been long. And you didn't (write it). You added to it (well - very, very well - of course).

Rob Conery gave it to you to maintain and add to. You have done, very successfully. It's yours now. And it's still very, very cool - which is why I wanted to work on it and with it.

@FransBouma
Copy link
Owner

I didn't flat out refuse anything other than to go into endless debates about trivial stuff. I simply didn't want to do things the way you thought was the best way forward and I stick to that. You now again try to make yourself some sort of victim of me, the bully maintainer, but that's simply not matching reality.

It is also not true that all the lines of code are yours (I'm talking about authorship, not copyright, here). It's kind of a crazy claim. And you make it (explicitly or implicitly) several times in comments on various issues here. I know the codebase at different versions very well now, and it's simply not true... I'm sure you touched almost every line, but you simply didn't re-write (all of) it. A lot of the code is still Massive v1.0 code. No more than it could possibly be true that all the lines of code in this beta/test/trial branch are by me

Which lines are still v1.0? The whole design of the code is different from v1.0!

Your approach to all the big new things has been (for some years now): "I'll do them soon, I just have to write the next version of my commercial ORM LLBLGen Pro, but don't worry, it won't be long, I'll soon be back to adding new features to the different, free, open source ORM which I wrote.". But it has been long. And you didn't (write it). You added to it (well - very, very well - of course).

This is a lie: I not only refactored the codebase into a codebase which shares a lot of code among the supported databases, corrected a ton of things, I also added Async/await support, and added all tests.

Where did I miss 'the big new things' ? And where did I say that above statement to justify lack of additions (Which additions btw?) I never stated I wrote Massive, see the readme at the start of the project. I changed a lot of the codebase, if not almost every line, since I took over, but the initial code wasn't mine, it was Rob's.

I don't have time for this. Again a long winded story with both praises and backstabs, it's been enough. I don't have to defend myself for pouring my own free time in maintaining this codebase, adding a lot of code to it and refactoring it so it was more maintainable during the years. If I hadn't done all that, Massive would have been gone years ago. I don't need your lies that I didn't do anything to really move it forward or that I flatout refused to work with you despite your tremendous amount of work you apparently put into the code and what not. You try to paint a bad picture of me here and that the future of Massive is at stake and apparently not in good hands at the moment.

I'm sorry, but how on earth is that going to make me trust you at all? It's not.

@FransBouma
Copy link
Owner

(And by the way, I have committed back a TON of stuff to the main repo, in completely good faith, as I have been going - just look at the recent commit list.)

Let me refer you to one of your PRs which I didn't merge: #277

Please read the reply I made there about statistics. You contributed MySQL support (based on existing code, but still, it works and I was happy with the contribution, as I already said to you). And you contributed a lot of trivial things like line-endings, readme typos, references mismatches etc. Don't come with that 'look at the commit list' crap, as if you made a tremendous amount of contributions. When I saw the PR above, I thought "is this some way to get on the commit list a lot of times to get associated with a highly-starred repo?" and I dismissed the thought. Was I right back then with that thought, Mike? It looks like it, doesn't it?

See how it feels, when you trust someone and then that all falls apart? Yeah that.

@mikebeaton
Copy link
Contributor Author

mikebeaton commented Mar 29, 2017

They weren't just whitespace fixes.

And I offered you stored procedure support, which is not small, and not trivial, but which you declined (because you thought it couldn't be made to fully work cross-db, the way I did it; though I carried on and did it anyway, and basically ... it really does do what you (for not unreasonable reasons) thought it couldn't do).

And I have .NET Core support, which I am more than happy to still offer back. The way I have done it, it would be trivial to make it so that the two DataTable methods pop back in when .NET Core/Standard is upgraded.

I am sorry for this, it's been a bit of a fiasco. Apologies again, Frans - and Rob.

@FransBouma
Copy link
Owner

Do you want me to go over every bullet point?

  • The MySQL support was great.
  • the multiple provider support: I told you how to do it, you implemented it. It's IMHO a trivial change, but whatever
  • I don't recall what the oracledb change was, have to look that up
  • I fixed New test MaxOnFilteredSet failing #274 as it was my mistake in the first place btw. the other 2 issues were really minor
  • line endings were whitespace issues but nevertheless for people who have the vs setting enabled to make it pop up an error it was useful
  • 2 lines of text.

The stored procedure support you offered wasn't added because of the reasons I gave you. I can't merge stuff that isn't working for all databases, and your offering at the time didn't work for all databases. If you since then made it work for all databases, that's great, but what you offered didn't and you know that.

Maintaining a codebase means you have the responsibility that the codebase works for the users who take a dependency on it and it keeps working, it stays on the quality they saw when they took a dependency. That means you have to be very careful what is getting into the codebase: comb through every line. It's not some repo that's used by just me or a co-worker, it's a codebase that's used by many many people. That's not a thing to take lightly and it sadly thus comes with the fact that you have to disappoint people who had the best intentions for reasons which might be unclear or even unfair to them. That's life.

Adding .NET core support now is a couple of #if statements and a DbProviderFactory instance pass to the ctor, last time I checked, or use polyfills. The main issue is that the code has to change again for netstandard20 and no-one will use the 1.6 one ever again, but it's still out there. I didn't want that, and therefore will wait for netstandard2.0. For the early adopters of .netcore a bit of a let down perhaps, but again c'est la vie.

It's not been a total fiasco, Mike. You said it yourself, you were new to open source, didn't know how to start. I gave you a list of things to look into and you did, Massive received a list of things to commit to before sending in a PR, you contributed some changes and MySQL and overall the Massive codebase got better because of it. The code you wrote in your own repo isn't lost either, it's still there, you wrote that code you added. If your employer / company wants to use that they can.

The move with the Massive3 org was a total let down and you shouldn't have done that. OSS is besides about code also about trust: shall I invest time in this person to explain things? Go over the code contributed by this person? Is it worth it to invest time to help this person so the PR / code contributed fits better in the overall picture? If I can't trust a person, it's game over in that department: time is a valuable resource, and investing that in a person I can't trust is a waste of it. I'm sorry too it has ended this way, I really thought things were going well after the MySQL contribution. Alas, things went in a different direction.

@mikebeaton
Copy link
Contributor Author

mikebeaton commented Mar 29, 2017

Yes. All of that.

The Oracle db change was the dynamic property set thing. Small, not completely trivial.

The .gitattributes thing was just wrong. Commits from different machines were going in wrong (and had done), because of it. It was hard to figure it out and fix it, because it turns out Git gets very fixed about what the line ending settings are and doesn't like changing them once it thinks it knows what they should be for the project.

I didn't say the issues weren't minor, I said they were real minor bugs.

Writing clear documentation - even one small bit about something - is not just a matter of sitting at a keyboard for 1 minute - and you know that.

I fucked up completely about 'Massive 3' - I guess - I think - I got over excited, sorry.

The other bit I have for .NET Core is a new way of sending in a connection string, with ProviderName= added in the connection string, and I've found a way to persuade .NET Core to instantiate a factory from a known class and assembly (via a weak assembly name), so this just works for users on a known provider. And is much more lightweight to use that instantiating and passing in a factory object. Mind you, it's true, that sits in with the other thing I did of multiple DB providers at the same time. [Actually, on second thought, it doesn't really require that, and it could be changed a little bit to stand alone without it.]

Sorry, Frans.

Mike

@mikebeaton
Copy link
Contributor Author

Dear Frans (@FransBouma) and Rob (@robconery) (if I may, and since I've already dragged you in to this),

I would love to have one last go at trying to explain what I did, and what I thought I was doing.

I really thought that when you saw that Massive could cleanly do:

dynamic squareResult = db.ExecuteAsProcedure("square_num", ioParams: new { x = 4 });
Assert.AreEqual(16, squareResult.x);
dynamic result = db.ExecuteWithParams("BEGIN :a := 1; END;", outParams: new { a = 0 });
Assert.AreEqual(1, result.a);
//this is passing input and output cursors between calls, simply, in Massive
var res1 = db.ExecuteWithParams("begin open :p_rc for select* from emp where deptno = 10; end;", outParams: new { p_rc = new Cursor() }, connection: conn);
db.ExecuteAsProcedure("cursor_in_out.process_cursor", inParams: new { p_cursor = res1.p_rc }, connection: conn);

that you'd both think that spoke for itself, and was genuinely cool.

And it can also now speak to multiple databases at once. And it supports manually controlled transactions by the user (I'd forgotten to even mention that one, because I've done a ton of work on this). And it drops in and passes the v2.0 test suite with no changes at all required (as well, of course, as it's own test suite with tests of all the new stuff). And it runs on .NET Core, now; and as a user of that you don't have to instantiate and pass in factory objects (even though .NET Core makes it hard not to follow that design pattern), you can pass in connection strings with ProviderName added, and it all just works.

I don't want that stuff to just sit in my company's code base. But, even if I can repair bridges with you, which I would really like to, I don't think all that is just a bunch of additions to Massive v2.0, I think it's a new version. But I obviously want it to be Massive. A major advantage of it - as it is - is that anyone using Massive could just start using it.

I could go off and write a new MicroORM, which takes all my features, and is either explicit that it is Massive with new stuff - which probably doesn't work very well at all (how can I use the Massive namespace in a differently named project, for example? and if I don't, I lose the whole drop-in for current users which I worked so hard on) - or else which re-writes the core engine, similarly to how it is but not identical. Which would both be a waste, because at the moment there's a new version of Massive sitting there, with a bunch of new, genuinely useful features, which someone already using Massive could just take and use.

Could I add one final thing? I did announce that I was working on a v3.0 version (right here, this Issue). I did deliver on that announcement, and I did take down the extra organisation (which I thought of as a way to deliver it, not a way to take over) as soon as you (and everyone else) told me that I was being a complete tit.

I don't know if there's a way forward, but I wish there was.

Mike
https://www.linkedin.com/in/mjsbeaton/

@mikebeaton
Copy link
Contributor Author

I chose to use Massive because it had (still has) an even nicer interface than its major competitors. But while I was using it, in terms of up-to-date support it was at least arguably lagging. E.g. .NET Core, transactions, full stored procedure support (parameter names and directions), multiple result sets.

Adding all that sounds like a different project, but I didn't think it needed to be. I thought it could be added to Massive with a high degree of compatibility. That (arguably) wasn't what was wanted, and I (definitely) went about it the wrong way anyway. Sorry.

But in case anyone still wants the lovely interface of Massive, but with a bunch of new features, I did finally finish it, and am planning to support it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants