/* Copyright (c) 2017, 2018, Oracle and/or its affiliates. All rights reserved.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License, version 2.0,
as published by the Free Software Foundation.
This program is also distributed with certain software (including
but not limited to OpenSSL) that is licensed under separate terms,
as designated in a particular file or component or in included license
documentation. The authors of MySQL hereby grant you an additional
permission to link the program and your derivative works with the
separately licensed software that they have included with MySQL.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License, version 2.0, for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */
/**
@page GENERAL_DEVELOPMENT_GUIDELINES General Development Guidelines
We use Git for source management.
You should use the TRUNK source tree (currently called
"mysql-trunk") for all new development. To download and set
up the public development branch, use these commands:
~~~~~~~~~~~~~~~~
shell> git clone https://github.com/mysql/mysql-server.git mysql-trunk
shell> cd mysql-trunk
shell> git branch mysql-trunk
~~~~~~~~~~~~~~~~
Before making big design decisions, please begin by posting a
summary of what you want to do, why you want to do it, and
how you plan to do it. This way we can easily provide you
with feedback and also discuss it thoroughly. Perhaps another
developer can assist you.
- @subpage CODING_GUIDELINES_OF_SERVER
- @subpage NAMING_CONVENTION
- @subpage COMMENTING_CODE
- @subpage HEADER_FILE
- @subpage EXAMPLE_SETUP_FOR_CTAGS
*/
/**
@page CODING_GUIDELINES_OF_SERVER Legacy C++ Coding Guidelines of MySQL Server
This section covers guidelines for C++ code for the MySQL
server, old code only. (New code should follow Google C++ coding style.)
The guidelines do not necessarily apply for other
projects such as MySQL Connector/J or Connector/ODBC.
*/
/**
@page NAMING_CONVENTION Legacy Naming Conventions
- For identifiers formed from multiple words, separate each
component with underscore rather than capitalization.
Thus, use my_var instead of myVar or MyVar.
- Avoid capitalization except for class names; class names
should begin with a capital letter.
This exception from Google coding guidelines exists
because the server has a history of using My_class. It will
be confusing to mix the two (from a code-review perspective).
~~~~~~~~~~~~~~~~
class Item;
class Query_arena;
class Log_event;
~~~~~~~~~~~~~~~~
- Avoid function names, structure elements, or variables
that begin or end with '_'.
- Use long function and variable names in English. This
makes your code easier to read for all developers.
- We used to have the rule: "Structure types are typedef'ed
to an all-upper-case identifier." That rule has been
deprecated for C++ code. Do not add typedefs for
structs/classes in C++.
- All \#define declarations should be in upper case.
~~~~~~~~~~~~~~~~
#define MY_CONSTANT 15
~~~~~~~~~~~~~~~~
- Enumeration names should begin with enum_.
- Function declarations (forward declarations) have
parameter names in addition to parameter types.
*/
/**
@page COMMENTING_CODE Legacy Commenting Style
- Comment your code when you do something that someone else
may think is not trivial.
- Comments for pure virtual functions, documentation for
API usage should precede (member, or
non-member) function declarations. Descriptions of
implementation details, algorithms, anything that does
not impact usage, should precede the
implementation. Please try to not duplicate information.
Make a reference to the declaration from the
implementation if necessary. If the implementation and
usage are too interleaved, put a reference from the
interface to the implementation, and keep the entire
comment in a single place.
- Class comments should precede the class
declaration.
- When writing multi-line comments please put the '*' and
'*/' on their own lines, put the '*/' below the
'/*', put a line break and a two-space indent after the
'/*', do not use additional asterisks on the left of the comment.
/*
This is how a multi-line comment in the middle of code
should look. Note it is not Doxygen-style if it is not at the
beginning of a code enclosure (function or class).
*/
/* *********This comment is bad. It's indented incorrectly, it has
* additional asterisks. Don't write this way.
* **********/
|
- When writing single-line comments, the '/*' and '*/" are
on the same line. For example:
/* We must check if stack_size = Solaris 2.9 can return 0 here.
*/ |
- Single-line comments like this are okay in C++.
// We must check if stack_size = Solaris 2.9 can return 0 here.
|
- For a short comment at the end of a line, you may use
either /* ... */ or a // double slash. In C files or in
header files used by C files, avoid // comments.
- Align short side // or /* ... */ comments by 48th column
(start the comment in column 49).
{ qc*= 2; /* double the estimation */ }
|
- All comments should be in English.
- Each standalone comment must start with a Capital letter.
- There is a '.' at the end of each statement in a comment
paragraph, including the last one.
/*
This is a standalone comment. The comment is aligned to fit 79
characters per line. There is a period at the end of each sentence.
Including the last one.
*/
|
- Every structure, class, method or function should have a
description unless it is very short and its purpose is
obvious.
- Use the following example as a template for function or
method comments.
+ Please refer to the Doxygen Manual
(http://www.stack.nl/~dimitri/doxygen/manual.html)
for additional information.
+ Note the IN and OUT parameters. IN is implicit, and
can (but usually should not) be specified with the
\@param[in] tag. For OUT and INOUT parameters you should
use \@param[out] and \@param[in,out] tags,
respectively.
+ Parameter specifications in \@param section start
with lowercase and are not terminated with a full
stop/period.
+ Section headers are aligned at two spaces. This must
be a sentence with a full stop/period at the end.
If the sentence must express a subject that
contains a full stop such that Doxygen would be
fooled into stopping early, then use \@brief and
\@details to explicitly mark them.
+ Align \@retval specifications at four spaces if they
follow a \@return description. Else, align at two
spaces.
+ Separate sections with an empty line.
+ All function comments should be no longer than 79
characters per line.
+ Put two line breaks (one empty line) between a
function comment and its description.
+ Doxygen comments: Use /** ... */ syntax and not ///
+ Doxygen command: Use '@' and not '\' for doxygen commands.
/**
Initialize SHA1Context.
Set initial values in preparation for computing a new SHA1 message digest.
\@param[in,out] context the context to reset
\@return Operation status
\@retval SHA_SUCCESS OK
\@retval != SHA_SUCCESS sha error Code
*/
int sha1_reset(SHA1_CONTEXT *context)
{
...
|
*/
/**
@page HEADER_FILE Header Files
- Use header guards. Put the header guard in the first
line of the header, before the copyright. Use an
all-uppercase name for the header guard. Derive the
header guard name from the file base name, and append
_INCLUDED to create a macro name. Example: sql_show.h ->
SQL_SHOW_INCLUDED.
- Include directives shall be first in the file. In a class
implementation, include the header file containing the class
declaration before all other header files, to ensure
that the header is self-sufficient.
- Every header file should be self-sufficient in the sense
that for a header file my_header.h, the following should
compile without errors:
~~~~~~~~~~~~~~~~
#include "my_header.h"
~~~~~~~~~~~~~~~~
An exception is made for generated files; for example, those
generated by Yacc and Lex, because it is not possible to
rewrite the generators to produce "correct" files.
*/
/**
@page EXAMPLE_SETUP_FOR_CTAGS Example Setup for ctags
Put this configuration into your ~/.ctags file:
@verbatim
--c++-kinds=+p
--fields=+iaS
--extra=+q
--langdef=errmsg
--regex-errmsg=/^(ER_[A-Z0-9_]+)/\1/
--langmap=errmsg:(errmsg*.txt),c:+.ic,yacc:+.yy
@endverbatim
*/
/**
@page DBUG_TAGS DBUG Tags
The full documentation of the DBUG library is in files dbug/user.* in the
MySQL source tree. Here are some of the DBUG tags we now use:
- enter
Arguments to the function.
- exit
Results from the function.
- info
Something that may be interesting.
- warning
When something does not go the usual route or may be wrong.
- error
When something went wrong.
- loop
Write in a loop, that is probably only useful when debugging the loop.
These should normally be deleted when you are satisfied with the code
and it has been in real use for a while.
Some tags specific to mysqld, because we want to watch these carefully:
- trans
Starting/stopping transactions.
- quit
info when mysqld is preparing to die.
- query
Print query.
*/