Hi Mark,
Normally, when I create/release a *SRVPGM I don't use *PRV
blocks. In the rare case I need it, it's a deliberate
decision.
So every time you add a new procedure to your service program, you
re-bind all callers. What would you do in a situation where you don't
control all callers?
Consider my HTTPAPI service program. It's used by more than 1000 shops,
all over the world. How can I rebind my callers when many of them are on
boxes I know nothing about? I could, of course, force anyone who uses
the tool to rebind when they upgrade -- but I've found that becomes a
deterrent to upgrade. People will put the upgrade off because of the
amount of work required.
Even for in-house stuff (which is a majority of my work) I find
rebinding everything to be a deterrent. When I've done that sort of
work, I found myself avoiding adding new procedures (likewise, I also
avoid adding new fields to a file) because of the extra work of
rebinding everything.
And, in shops where they don't have a good CMS in place, it might take
an hour of work just to figure out who the callers are.
Therefore, if I were to use a hardcoded sig and I rebuilt
the *SRVPGM with a new export sequence, but neglected to manually
change the sig, I would probably be getting some unexpected results
Yes that's true... I can see your point of view. In a situation where
you're not using *PRV, and you WANT to rebind with every change, it
makes more sense to use (the default) SIGNATURE(*GEN)
However, my experience has been that it's much more efficient for the IT
staff to adhere to the REALLY SIMPLE rule of just adding new exports to
the end of the binder language, thus making it very easy to avoid the
need to rebind everything.
You say it's really easy to accidentally break things with that policy.
But it's very simple to just add your exports to the end. I mean, how
hard is that? It's no different from adding parameters to an existing
procedure, the programmer needs to add them at the end and make them
optional... and IBM doesn't have any sort of level check or signature
to verify *that* at all. Why is that any different?
These are "gotcha" errors that may or may not be found in testing,
since an already tested part of the code might not get
re-tested. Since there was a resequenced/inserted/deleted export
list, it won't work properly. Of course, I think it's a really bad
idea, for this reason, to do that.
You do understand that the sequence of your RPG code doesn't matter at
all, right? The only sequence that matters is the sequence of data in
the binder language. Who is going to resequence the binder language?
Deleting procedures is EXTRAORDINARILY rare. It almost never happens,
and if it does, how hard is it to increase a version number?
Inserting procedures simply has to be done at the end. It's not hard,
and if you are using *PRV you have the same restriction, you must always
do it at the end, and if you don't, the system won't catch it.
So really the only time using SIGNATURE(*GEN) makes sense is when you're
doing what you are describing, Mark. When you WANT to force a re-bind
every time you add a procedure.
In my environment, that re-bind isn't practical.
As an Amazon Associate we earn from qualifying purchases.