|
Thanks for the update.
I tried saved searches yesterday (read about it in newsletter); it didn't work for me, I never seemed able to save more than one. It does work today. I think I would prefer the saved search widgets to be on a single horizontal row, above the search box.
However, 301 isn't urgent any longer, I installed a little browser bookmark button that links to the search page with ?sort=createddesc in the URL and that works just fine (as long as I don't reach the page in another way).
110 is very relevant when searching for code examples on a class. The way it is now, a statement such as Button.Font=new Font(...) is not matched by Button which is, er, not good.
I understand literal search is either expensive or hard; on rare occasions it is the only way to retrieve something, say an example of the ?? or ?: operators in C#.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
Keeping track of some CP bugs I encountered. All entries have a unique ID; they are in no particular order. Bugs that have been solved will be removed.
My current top priority is: F112
#1# new text (11-JAN-2011) has been flagged #1#
#2# new text (20-JAN-2011) has been flagged #2#
categories:
easy: should be simple to fix
medium: needs some work
hard: probably needs major effort
swa: a simple work-around would improve the situation right away
status:
SB: reported in Suggestions&Bugs forum
Articles
ID Cat Status Description
A101 easy SB 16-DEC-2010 Browse Code gives no indication which file is currently being watched
#1# CP task #1917
A102 medium SB 16-DEC-2010 Browse Code often cuts the viewed file short (doesn't occur on simple files)
solved 17-JAN-2011
A103 easy SB 16-DEC-2010 Browse Code shows gibberish for PNG files
#1# Seems fixed
Tips/Tricks
ID Cat Status Description
T101 easy SB 01-JAN-2011 There is an attempt to prevent multiple alternatives by the same author; it is a bad idea to forbid
this as there could easily be two or more ways to do better than the original. And the attempt
to prevent extra alternatives is flawed. Proof is
here[^].
T102 easy SB 01-JAN-2011 Alternatives aren't listed on the home page when the original is less than 3 hours old.
That is unfair as their value does not depend on the age of the original.
My two alternatives never showed on the home page, while another one added later did show.
I have a screenshot showing John's original and the third-party alternative, its all about
this.[^]
Forum messages
ID Cat Status Description
F101 easy SB 25-APR-2010 An HTML tag at the end of a line eats the next NewLine (reported many times)
#1# CP task #1918
#2# fixed ca 17-JAN-2011
F102 easy SB 17-JUL-2010 Modifying a message several times, at larger than 5 minute intervals, makes the
"Modified on..." message intrude in my (pretty full) sig. [See also F111]
F103 easy SB 19-JUN-2010 First right-arrow on a freshly loaded forum page goes wrong
#1# CP task #755
F104 easy SB 03-JUN-2010 Exiting "View thread" mode should bring us back to the page where the trhead was, not to page 1.
F105 easy SB 27-MAY-2010 When applying a style (bold, underline, ...) through a widget, if the selection ends on a space,
that space should not be considered selected.
F106 medium SB Replies to the enquirer should default to type "Answer" no matter at what nesting level they are.
#1# The replier can change it (e.g. to question) when appropriate, however "answer" is the
#1# most likely content (Note: it is replies to the enquirer, not to just anybody)
F107 easy SB The "Use HTML in this post" checkbox should apply to the message and not to the sig
(04-FEB-2010)
#1# Even when message and sig are stored together, this should be doable, as the edit page
#1# knows how to tell them apart again.
F108 easy SB Smileys should not include spaces, i.e. a simple ":(" should be sufficient to get the sad smiley.
#1# IMO this is most relevant for the sad smiley.
*** sad smiley lost its space (13-JAN-2011)
F109 easy SB Tags that have been left open accidentally should automatically be closed at the end of a message
(before the sig), so the sig never becomes part of say a PRE block
F110 easy new in forum messages like this one, hyperlinks don't work inside PRE blocks.
#1# CP task #1919
F111 medium SB The "Modified on..." message uses Toronto time, which is confusing as everything else
is using local time. IMO the message table should have a "Last modified on" field and
use that, rather than storing a "Modified on..." sentence inside the message.
F112 medium SB 11-JAN-2011 Bold is hardly noticeable inside a PRE block. Sometimes a question shows a nice snippet
#1# and the message text claims to have a problem in the bold line, which I can hardly discern.
Not sure what a good solution would be (automatically also underline? blink? ...)
F113 easy SB 11-JAN-2011 A thread starting question (or even any message in a thread), once it has gotten one or
#1# more replies, should not offer a "remove" widget at all, or its function should be
altered so only " [removed]" gets added to the subject line, leaving the body intact,
rather than mutilate the entire thread. The non-leaf starting question could instead
offer a "thread is done" widget which appends " [done]" to the subject line, and no more.
#2# partially dealt with
Varia
ID Cat Status Description
V101 hard SB Colorizer sometimes gets confused by quotes, double quotes, empty strings
#1# CP task #1895
V102 medium SB One cannot undo a vote (one can correct a vote, say replace 5 by 3, but that's about it;
especially bad on a good/bad vote.)
#1# suggestion: when already voted, don't show voting tools, just show the existing vote and
#1# an "unvote/revote" widget which cancels the vote and brings back the voting tools.
V103 hard SB Search functionality is insufficient (#1# I know this is WIP)
more here[^]
V104 hard SB 05-OCT-2010 There are discrepancies between rep numbers and rep graph (typically graph is a few points short)
The difference vanishes on a recalculation, then shows up pretty soon, without changing much.
#1# Not quite fixed yet, I now have a 200 Author discrepancy.
Reputation (not necessarily bugs)
ID Cat Status Description
R101 easy SB I still think "Post Comment" should not yield Participant points, Debator or Organizer yes,
it just does not fit amongst the other participation actions.
#1# irreconcilable differences
R102 easy SB 17-OCT-2010 Give extra (participant) points for S&B posts (always? those added to TODO?)
#1# If a new message type is used, make it the default there!
#1# I would settle for a bonus factor (all S&B messages get an extra factor of say 5), not the votes!
R103 easy SB 23-AUG-2010 Give extra (participant) points for approving an article
R104 easy SB FAQ does not explain which actions get points multiplied by some color weight factor.
#1# Fixed, FAQ says "Points are weighted by voting member's level."
#1# It might have been clearer by adding a "* VW" in the numeric columns (VW=voter weight)
#1# Well, not OK, neither of those specify which voter level matters.
And finally some suggestions (i.e. not bugs at all)
ID Cat Status Description
S101 medium SB Improve site documentation (01-OCT-2010: what is a group?)
#1# CP task #941
S102 easy SB 21-SEP-2010 Show server name also at the top of every page (only to gold+; to get better bug reports)
#1# Bottom only makes me scroll a lot of pages!
S103 medium SB provide CP web service
S104 medium SB add code sniffing to message editor (that is what I provided it for!)
#1# CP task #1808 is merging both editors
S105 easy SB 19-AUG-2010 provide widget for downloading a single file, and an entire zip, on the Browse Code tab
S106 medium SB more storage space for sig (say 1K char)
S107 medium SB accept IMG tags everywhere for CP-resident images, so platinums can use "My Uploads"
to show some illustration in forum message or sig.
#1# if you can't trust platinums, whom can you trust?
S108 hard SB 28-JUN-2010 I don't like my tip/tricks being edited without getting a message from the editor explaining
what has changed and why. And I rather get such message and do the edits myself.
#1# CP task #1921 will send e-mail
S109 medium new Can't we avoid most layout problem reports by renaming dependent files on an update,
hence forcing them being downloaded. I know that makes it a bit trickier for your source control,
however that must be solvable in a transparent way (e.g. copying their history)
S110 medium SB 24-MAR-2010 Article Wizard suggestions
see here[^]
#1# CP task #1103
S111 medium SB Actions that are only available for members with sufficient rep (e.g. edit tip) should be
visible but disabled for members not having the privilege, but with a tooltip explaining
what the feature would do and what would be required to get it enabled.
#1# A specific idea: add a help mode to the site, toggled on/off by the click of a button.
#1# Off = the page does what it does now; on would give tooltips for most buttons/widgets/etc
#1# with comprehensive text (both a short telex style, and full sentences giving all details)
PS: If and when comments were posted in response, I would read, process and probably delete them.
|
|
|
|
|
Jan 10, 2011:
A101 - added (#1917)
A102 - can you provide a repeatible example? Note: if the coloriser crashes then the file is shown without colorization. The bug is elsewhere.
A103 - PNG files should not be offered for viewing. Fixed
T101 - this is by design.
T102 - There is no 3hr limit. Alternatives are listed as soon as they are approved
F101 - Updated Task (now #1918)
F102 - See F111
F103 - task #755
F104 - Not always possible. I'll review, though
F105 - I'm fairly sure this is browser dependant
F106 - I disagree. A post that asks for clarification is not an answer.
F107 - Very tricky. We don't store the sig independantly so doing this would require serious replumbing.
F108 - Some smileys can be confused with technical terms. :( probably won't be, so I'll remove it for this this one.
F109 - This related to F107 in that we do not store sigs separately. We store the raw HTML and apply HTML -> XHTML conversion to the content on display, not on storage. This allows us to update our HTML correctors on the fly, but means that HTML correction will apply to the entire message.
F110 - Task #1919
F111 - This is because we hardcode the time into the message instead of adding a placeholder which would then need to be replaced on the fly. I'll add a task for this to display the modified time outside of the message. (#1920)
V101 - Task #1895
V102 - Suggest a UI.
V103 - New search in beta.
V104 - Fixed. The issue was we introduced an "active" flag on rep events and forgot to take that into account in one of the stored procs.
R101 - Discussed, and I disagree
R102 - Great idea. Not sure how to neatly implement this. Possibly a new message type?
R103 - Task #1915
R104 - Where this occurs the FAQ states "Points are weighted by voting member's level."
S101 - Task #941
S102 - Showing at the bottom isn't sufficient?
S103 - In progress
S104 - It's already in place in the general editor. Task 1808 will merge with the forum specific editor
S105 - part of the (much) larger project of getting download counts history from our IIS logs.
S106 - I think the sig size is an adequate compromise
S107 - The never ending debate I have with myself.
S108 - Task added (#1921) to alert the poster an edit was made. However, sending a message and hoping the poster will update their tip will in general result in few updates.
S109 - files already have a querystring "dt=<version>" to combat this.
S110 - Task #1103
S111 - I';ve decided against doing this in order to not clutter up the interface. Happy to be convinced otherwise though - even for a subset of tasks.
cheers,
Chris Maunder
The Code Project | Co-founder
Microsoft C++ MVP
|
|
|
|
|
I have processed your reply, and added your info to the original, as well as some clarifications you asked or triggered.
Luc Pattyn [Forum Guidelines] [My Articles] Nil Volentibus Arduum
Please use <PRE> tags for code snippets, they preserve indentation, improve readability, and make me actually look at the code.
|
|
|
|
|
This is the thread that hosts the discussion about my proposal for a CP Web Service.
A proposal document is available here[^]. Its current version is 1.0; it will be replaced by a future version if and when it becomes available.
|
|
|
|
|
My initial comments, in no particular order, and based on myown personal goals for the API, are:
1. I want the API to start out focussing on an individual developer: you. The API (initially) is not something to allow members to trawl through thousands, or millions, of member records. It should, instead, provide information relevant to you, and to your profile and your experience on CodeProject.com.
2. I will be leveraging our Object References system which relies on an ObjectType ID / Object ID pair. Eg a member is ObjectTypeID = 1, so member #1 is identified uniquely across all objects using (1,1).
3. IsMVP should in fact be "MemberTypes" since a member could be Mentor, MVP, SubEditor etc.
4. You've made no mention of ratings, yet this is one of the things I see being a focus of many CP scrapers. I will be adding something along the lines of GetVotes(int ObjectTypeID, int ObjectID, DateTime startDate) . This allows you to get all votes for all your items, filtered by ObjectType (eg articles, messages etc), a single object, or all votes past a given date. Vote info will be date, score and weight.
5. Do you really want GetXByY methods, or GetX(sortMethod) methods? My preference, in order to keep the API small and extendable, is the latter.
6. In your Article structure you have a list of member IDs. I would prefer to return usable objects (say, name, ID, profile URL) to save an expected followup lookup.
7. Protocol. You mention using Windows WebServices. I was thinking of starting with JSON data initially with XML to follow immediately afterwards.
cheers,
Chris Maunder
The Code Project | Co-founder
Microsoft C++ MVP
|
|
|
|
|
Thanks Chris. I'll await other inputs before reacting in extenso. Except this:
1. The need is wider than just for one member's info. CP Vanity lists the "highest achievers", i.e. all people appearing in the first 4 or 5 pages of Who's Who when sorted by article count or message count.
4. the proposal V1.0 has average ratings in the Member structure, and rating and voteCount in the Article and Message structures; it does not include more detailed voting info as that info is currently not available on the web site either.
|
|
|
|
|
I skimmed through it. It seems reasonable.
Have you tried passing a System.DateTimeOffset? (I haven't.)
|
|
|
|
|
Hi PIEBALD,
Thanks for your first reaction.
I haven't felt the need to pass a DateTimeOffset; in fact I never even used one. My thinking was to communicate UTC only, then a client could, and probably would, adjust everything for local time (i.e. I'm not going to ask CP what timezone I'm in). Do you see a need for DTO?
|
|
|
|
|
|
I just tried/wrestled with it -- svcutil insists on creating a System.DateTimeOffset struct that conflicts with .net on the client.
This requires messing with the generated file (generally a no-no as you know) to get things to work.
|
|
|
|
|
I still have no idea why one would use a DateTimeOffset at all, I didn't know it existed, and I don't understand it.
What is wrong with DateTime, it looks like WSDL serializes it properly.
|
|
|
|
|
Hi Luc,
Firstly, thanks for including me in your discussions, it an honour, and thanks for the reference on the document to my CPRepWatcher!
Looking a the document, you have put together some excellent methods for the webservice, some comments i would have are;
1) The member structure should be maybe be modified to remove some elements; e.g. the Twitter Name. There should be another method that can be called to get this information, if Chris adds other associations in the future, e.g. LinkedIn, Facebook, AnOther, then there would be a requirement for the structure to change. Perhaps have a GetMemberExternalAsscociations that returns a KeyValue Pair string dictionary, where each entry would have the site as the key, and the member name or reference url as the value e.g. Twitter=daveauld
2) I would also remove the things like the post counts average ratings etc, and have them associated with a separate method, for similar reasons to #1 above. Keep the GetMemberInfo to the basic info that is unlikely to ever change.
3) The GetMemberRating, should possibly also be changed to a dictionary list of key/value pairs, for the same reasom, as the site evolves, more items may be added, and the structure would have to change, by using a dictionary, the client would only then have to add another handler for the key value
4) I take it the count parameter in the GetMembersByxxxx returns the number of items being requested? Or is this also updated by the return call to return the number actually returned? Possibly need to limit this to MaxNumber internally per call, also, if you called 1000 and you started at 500 from the end, if it returned only 500, the client would know there are no more and to stop querying during recursive calls.
5) What about a GetMemberCount(); to return the number of site members.
Thats it for the moment!
Cheers.
Dave
Find Me On: Web| Facebook| Twitter| LinkedIn
CPRepWatcher now available as Packaged Chrome Extension, visit my articles for link.
|
|
|
|
|
Hi Dave,
you're one of the known HTML scrapers, so I included you in the review panel.
thanks for your feedback. I'll delay a full response till all have had the opportunity to provide their feedback.
Two clarifications though:
4. the methods returning a list of IDs have a count indicating how many results the caller hopes to get, and there is an imposed maximum (MAXCOUNT); no it isn't a ref parameter (I don't think Web Services can handle that), the returned results will contain count or fewer items; fewer implies end of list. This is in the doc already (principle 5, on page 3), I probably didn't formulate it well enough.
5. MAXCOUNT and the memberCount are returned by GetGeneralInfo(), see page 5.
Cheers.
|
|
|
|
|
I think we should consider implementing my tip/trick regarding web service access (one method returns all data as XML).
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
|
Sorry about that. I had read the comments everyone else had posted and the wife just got home, and wanted to eat, so I was pressed for time. I had only briefly scanned the document, but am about to give it a good read.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
OK, thanks. Take your time and enjoy.
|
|
|
|
|
0) The GetMembersByXXXX methods should impose some sane limit on the number of users returned. Otherwise, someone could bog down the site with a request for all members.
1) The name GetMembersByID seems redundant. I think it would be more useful if it were GetMembers(int startingID, int count).
2) I don't personally see a need to return a user's name with HTML decoration, but that's just me.
3) The Articles struct needs a DownloadCount field
4) I think the web service should have a single method that accepts a dynamic list of parameters, which includes the name of the stored proc to be called. This REALLY helps in terms of maintainability. All returned data should be in XML format. The programmer can then deserialize the returned data in any way he sees fit.
.45 ACP - because shooting twice is just silly ----- "Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "The staggering layers of obscenity in your statement make it a work of art on so many levels." - J. Jystad, 2001
|
|
|
|
|
Hi Luc,
Great news that this may actually get implemented
I thought about this a while back, and have a few suggestions for your proposal. Just my 2c
1) I presume you mean PascalCase ( EndOfFile ) instead of camelCase ( endOfFile ). We are .NET devs, after all
2) Reputation levels ( Bronze, Silver, Gold, Platinum, ? ) should be handled separately from the CP UI colours returned by GetColors .
enum ReputationLevel
{
Bronze,
Silver,
Gold,
Platinum,
...
}
ReputationLevel[] GetAllReputationLevels();
This enum should be used everywhere a reputation level is specified.
And possibly ( Chris: are the weights the same throughout the site? )
struct ReputationLevelDetails
{
ReputationLevel Level;
ColorDef Color;
int Weight;
}
ReputationLevelDetails[] GetAllReputationLevelDetails();
3) Is the .NET DateTime type portable? I mean, would non-.NET clients have problems consuming this type? Or is it handled by the binding?
4) For performance, I would also add a binary tcp/ip endpoint for .NET clients ( presuming this will be implemented using WCF ).
5) On page 13 "A note on data types". For a .NET client, you can "Add Service Reference" and it will match up .NET types in the WSDL with the correct framework class on the client. Obviously, non-.NET clients will have to work with just the plain data objects. Also, you can choose how to materialize collections on the client: Array, List<T>, ...
6) All DateTime 's should be in UTC.
I am mainly interested in votes for my own articles. I would like a method that retrieves a collection of summaries for all my articles, and then a method that gets the voting details for a particular article.
Your Article structure looks ok, but I would add: DownloadCount and LastVoteCast .
The method would just be:
Article[] GetArticleSummaries( int memberId )
For the votes, there are 3 possibilities: new, changed and deleted.
So I would declare a class for describing a vote ( which could be used across the site ):
class Vote
{
int ObjectTypeId;
int ObjectId;
DateTime DateTime;
int Rating;
ReputationLevel ReputationLevel;
int ReputationWeight;
int ReputationPoints;
}
Then a class that holds a pair of Votes :
class VoteCast
{
Vote Old;
Vote Now;
}
The 3 possibilities would be handled like this:
- New: Old = null, Now is populated
- Changed: both populated
- Deleted: Old is populated, Now = null
The method would be:
VoteCast[] GetVotes( int objectTypeId, int objectId, DateTime fromDateTime )
The overall rating and popularity at any point in time can be calculated from this data.
BTW: I've just finished a contract using WCF. I'm not an expert ( maybe Roman Kiss could help ), but I'll help if I can
Cheers,
Nick
|
|
|
|
|
Hi Nick,
thanks for your input.
1. yes PascalCase it should be.
2. I had been refraining from using enums to avoid potential comm problems; I know now returning enum values is no problem whatsoever, so I will propose to modify all ColorName by a color enum.
3. DateTime values get ToStringed in SOAP/HTTP, my test says it is now 2010-10-06T12:43:11.939Z; that looks sufficiently portable to me.
4. I'm not familiar with it; I think I'll open the proposal up to multiple communication schemes, with the SOAP/HTTP one as the primary.
5. I'm not familiar with it, will look into it.
6. I already spec'd UTC everywhere.
7. Voting info: you're not the only one asking such, I'll add it to "Possible Extensions". As a rule I did not add new functionality, everything could be gotten through HTTP/HTML as is, with one exception: Members by total rep, something we should have had for a long time.
BTW: IMO there are two major obstacles to voting info: privacy, and volatility of the system.
Thanks again. Shall I add you to my little mailing list?
Cheers.
|
|
|
|
|
Hi Luc,
Luc Pattyn wrote: thanks for your input
No problem
About voting: this information is obtainable at the moment, but you need to poll the site and catch every vote. For me this would be the most important part of a CP API.
Luc Pattyn wrote: Shall I add you to my little mailing list?
Yes please My email address is cp [at] my CP profile Homepage domain.
Nick
|
|
|
|
|
Okay, I went through the proposed methods and would like to suggest these :
(1) There needs to be a way to get a member's last 1000 posts along with forum information.
Collection<SomeStruct> GetPosts(int memberId, int count);
struct SomeStruct
{
Url MessageUrl;
String Forum;
IsThreadStarter;
DateTime TimeStamp;
. . .
}
(2) There needs to be a way to get a forum's last 1000 posts with the reverse info to (1) above:
Collection<AnotherStruct> GetPosts(string forum, int count);
or
Collection<AnotherStruct> GetPosts(ForumEnum forum, int count);
struct AnotherStruct
{
Url MessageUrl;
int memberId;
IsThreadStarter;
DateTime TimeStamp;
. . .
}
(3) Similar to (2), but gets threads instead of posts
Collection<ThreadStruct> GetThreads(ForumEnum forum, int count);
struct ThreadStruct
{
int UniqueThreadId,
Url MessageUrl;
int MemberId;
int Count;
DateTime TimeStamp;
}
(4) A method to get all thread messages:
Collection<AnotherStruct> GetThreadPosts(int threadId);
At this point, these are the major omissions I noticed in Luc's spec document, if I think of more, I'll post them here again. Meanwhile Luc and others, do let me know what you think.
|
|
|
|
|
Hmm. Do we need all this?
So far I tried to formalize what had been used (by scraping) in the existing apps, while keeping things pretty general, not excluding future extensions, not tailoring to exactly what would be used today.
We can ask for message information, OK, no problem. Not sure what use it would have. Do you want to create your own forum viewer?
We can ask for extensive voting information, I did not even consider that, as it is not available on the web site as is, and I do not really want to ask for information the web pages themselves aren't offering. The voting system is a delicate system, it is partially anonymous, etc. I don't feel like offering a second view on it, deviating from the first view, which is the web pages themselves. It would open a truckload of cans of worms IMO.
I could come up with a lot more ideas, but do we want them? do we need them?
My wants (not the needs from existing apps) would include:
- give me all threads where members M1 and M2 participate.
- give me all threads where "xyz" is in the subject line.
- give me arbitrary search facilities.
That is because I'm convinced the CP database is a gold mine, and we can barely scratch the surface with the current search facilities. However, here too, I would prefer the web site itself to offer better functionality (just like you would prefer MSDN help to work extremely well inside Visual Studio).
In summary: convince me I want your app, the one that needs these extra functions, right now. Do you have the concept for such a killer app? and will you offer it provided the info is available?
I'm a bit pragmatic here. I don't mind adding functionality if it increases the attractiveness of the proposal, and not just makes it bigger and less likely to get realized any time soon...
How about this: lets agree on some functionality with limited scope (e.g. similar to V1.0, with minor adjustments, based on existing feedback), get that approved, implemented, adopted by some apps, and enjoyed. Then perhaps consider a V2.0 with new features added. Rationale: we can dream up all kinds of things, is it worth delaying everything? Initially we had no scraping apps; then there was one, not enough to warrant a web service. Now there are four. I studied them all, saw similarities and possible synergy. I would like to grab the opportunity, right now.
|
|
|
|
|
Luc,
I was about to start work on a new CP-app that would have needed those. So no, I didn't think these up as future requirements but rather as immediate needs. None of those will be extra load on the servers since all the info I want can be obtained with SELECT TOP queries and perhaps CP already has wrapper layers around it (since we already have a paged message retrieval functionality on the website).
Of course if you think that asking too many features would put Chris off from doing this, I am fine with getting some minimal functionality now and then asking him to add stuff whenever he gets a chance or whenever we think it will majorly help one of these meta-applications.
|
|
|
|
|