[Plugin] [REL] MySQL Plugin (Now on github!)
#1

MySQL Plugin
The best and most famous MySQL plugin for SA:MP out there!
Code:
10/12/2013:
The project has been moved from ******code to github
This plugin allows you to use MySQL in PAWN. It's currently being developed by Pain123/maddinat0r; you'll find all older versions, including source codes and sample scripts, from R5 to R7 at the bottom of this post and the latest release here.



How to install:


Move mysql.dll (windows) or mysql.so (linux) to your 'plugins/' directory. On windows you'll have to download the mysql library (libmysql.dll, see downloads) and move it to your main server directory. The server configuration (server.cfg) has to be edited aswell.
  • Windows
    Code:
    plugins mysql
  • Linux
    Code:
    plugins mysql.so

PAWN Scripting R5-R7: (a_mysql.inc)
  • Native functions: (All parameters in squared brackets are optional)
  • * = R5, R6 (supports threaded and non-threaded scripts)
  • * = R7 (supports only threaded scripts)
  • Caching guide - Click!

    • mysql_affected_rows( [connectionHandle = 1] ) **
    • mysql_close( [connectionHandle = 1] ) **
      • Make sure you call this on OnGameModeExit()/OnFilterscriptExit()
    • mysql_connect( const host[], const user[], const database[], const password[] ) *
    • mysql_connect( const host[], const user[], const database[], const password[] [, port = 3306] ) *
      • Returns a connection handle you can use for multiple connections
    • mysql_debug( enable = 1 ) **
      • Enables the debug modus and creates a log file named mysql.log
    • mysql_errno( [connectionHandle = 1] ) **
    • mysql_fetch_int( [connectionHandle = 1] ) *
    • mysql_fetch_field_row( string[], const fieldname[] [,connectionHandle = 1] ) **
    • mysql_fetch_float( &Float:result [,connectionHandle = 1] ) *
    • mysql_fetch_row_format( string[], const delimiter[] = "|" [,connectionHandle = 1] ) **
    • mysql_field_count( [connectionHandle = 1] ) **
    • mysql_format( connectionHandle, output[], format[], {Float,_}:... ) * (works on R6-2 aswell)
      pawn Code:
      Supported formats: (including precisions)
      - %e (escapes a string at once, no mysql_real_escape_string() needed)
      - %s (string)
      - %d / %i (integer)
      - %f (float)
      - %x (hex)
      - %b (binary)

      new szDestination[100];
      mysql_format(connectionHandle, szDestination, "SELECT * FROM `%s` WHERE `bar` = '%e' AND `foobar` = '%.2f' LIMIT %d", "foobar", "escape'me\"please", 1.2345, 1337);
      // the variable 'szDestination' contains now the formatted query (including the escaped string)
      mysql_query(szDestination);
    • mysql_free_result( [connectionHandle = 1] ) **
    • mysql_get_charset( destination[] [,connectionHandle = 1] ) **
    • mysql_insert_id( [connectionHandle = 1] ) **
    • mysql_num_rows( [connectionHandle = 1] ) **
    • mysql_num_fields( [connectionHandle = 1] ) **
    • mysql_ping( [connectionHandle = 1] ) **
      • Returns true (1) if the connection is alive, else (-1)
    • mysql_query( query[] [,resultid = (-1), extraid = (-1), connectionHandle = 1] ) *
      • Setting result id to something else than (-1), triggers the OnQueryFinish callback
    • mysql_query_callback( index, query[], callback[] [, extraid = (-1), connectionHandle = 1] ) **
      • Allows you to create custom callbacks for better structured coding (See sample_script.pwn below)
    • mysql_real_escape_string( const source[], destination[] [,connectionHandle = 1] ) **
    • mysql_reconnect( [connectionHandle = 1] ) **
    • mysql_reload( [connectionHandle = 1] ) **
    • mysql_retrieve_row( [connectionHandle = 1] ) **
      • Returns true (1) incase there are still rows to retrieve, else false (0)
    • mysql_set_charset( charset[] [,connectionHandle = 1] ) **
    • mysql_stat( const destination[] [,connectionHandle = 1] ) **
    • mysql_store_result( [connectionHandle = 1] ) **
    • mysql_warning_count( [connectionHandle = 1] ) **
    • cache_get_row( row, idx, dest[] [, connectionHandle = 1] ) *
    • cache_get_field( field_index, dest[] [, connectionHandle = 1] ) *
    • cache_get_data( &num_rows, &num_fields [, connectionHandle = 1] ) *
    • cache_get_field_content( row, const field_name[], dest[] [, connectionHandle = 1] ) *
    • enable_mutex( bool:enable ) *
      • Disable mutexes incase you experience random crashes. (seems to happen on some linux distros only)
    • mysql_function_query( connectionHandle, query[], bool:cache, callback[], format[], {Float,_}:... ) *
      pawn Code:
      mysql_function_query(connectionHandle, "UPDATE `foo` SET `bar` = 1", false, "CustomResponse", "dsf", 1337, "string", 1.5634);

      public CustomResponse(integer, string[], Float:float)
      {
          printf("Query successful executed. Data: %d | %s | %f", integer, string, float);
          return 1;
      }
  • Pawn Callback:
    • OnQueryFinish( query[], resultid, extraid, connectionHandle ) * - Sample usage (updated)
      • This is just called if you used the 'resultid' parameter in the query function
    • OnQueryError( errorid, error[], resultid, extraid, callback[], query[], connectionHandle ) *
    • OnQueryError( errorid, error[], callback[], query[], connectionHandle ) *

Compiling Notes:
  • Windows: Open the project file with Microsoft Visual C++ and click the build button. (MySQL Visual Studio/C++ is required of course)
  • Linux: Install gcc, gpp & mysql-client and type "make" in the source files folder.
Downloads: (for newer updates, use the github project site above!)

NOTE: DON'T USE VERSION R7 OR ABOVE IF YOU HAVE NO IDEA WHAT THREADING MEANS OR HOW IT WORKS. YOU MIGHT HARM YOUR SERVER WHEN USING IT NOT PROPERLY.
Thanks to:
  • Chaprnks, Gehaktbal, JaTochNietDan, LS:RP Tester team, Webflori (Testing)
  • AndreT (Testing/Cache Tutorial)
  • JernejL (Testing/Suggestions)
  • krisk (Testing/Suggestions)
  • Kye (Coding support)
  • Mow (Compiling/Testing/Hosting)
  • nemesis (Testing)
  • Pain123 (Developing the plugin as of R8)
  • Sergei (Testing/Suggestions/Wiki documentation)
  • xxmitsu (Testing/Compiling)
If you have any questions, post them here!
Reply
#2

Good job GStylezzz
Reply
#3

Need something better to get values. It would be great to have mysql_get_field() or c_strtok() like in [RAZ]ADreNaLiNe-DJ plugin are.
Reply
#4

Quote:
Originally Posted by Bardokas
Need something better to get values. It would be great to have mysql_get_field() or c_strtok() like in [RAZ]ADreNaLiNe-DJ plugin are.
There is already a strtok function in PAWN.'mysql_fetch_row' returns like the following format if you selected more than one row in the query:

row1 row2 row3

Now you can just use strtok to split it in tokens.Also 'mysql_get_field' is probably a good idea for the next version.
Reply
#5

I know strtok function in PAWN, but in C i think it will be faster?
Reply
#6

hey

does the memory deallocation work here correctly?
Reply
#7

I think so. The code is much cleaner here and I hadn't any problems with this plugin on Debian 4.0 ETCH.
Reply
#8

Somebody is finally adding some more stuff to mysql, great job!
Reply
#9

Do I have to know PHP to make a page that shows user stats online?
Reply
#10

Quote:
Originally Posted by Yaheli
Do I have to know PHP to make a page that shows user stats online?
Yes, quite limited PHP though, I thought it was hard at first but after going through other Control Panels code its actually quite easy going to PHP from some PAWN knowledge.
Reply
#11

Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Do I have to know PHP to make a page that shows user stats online?
Yes, quite limited PHP though, I thought it was hard at first but after going through other Control Panels code its actually quite easy to match PHP + SA-MP
Hm... you have anything good I can learn from?
Reply
#12

Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Do I have to know PHP to make a page that shows user stats online?
Yes, quite limited PHP though, I thought it was hard at first but after going through other Control Panels code its actually quite easy to match PHP + SA-MP
Hm... you have anything good I can learn from?
Well you need to learn some basic SQL first, I thought it was very hard but after I got into it and a bit of help from G-Stylezzz its quite easy. Then once you know some basic SQL just download Los Santos Next Episodes control panel by G-Stylezz and take a look at how he integrates user stats etc. Its a bit of a learning curve but its worth learning.
Reply
#13

Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Do I have to know PHP to make a page that shows user stats online?
Yes, quite limited PHP though, I thought it was hard at first but after going through other Control Panels code its actually quite easy to match PHP + SA-MP
Hm... you have anything good I can learn from?
Well you need to learn some basic MySQL first, I thought it was very hard but after I got into it and a bit of help from G-Stylezzz its quite easy. Then once you know some basic MySQL just download Los Santos Next Episodes control panel by G-Stylezz and take a look at how he integrates user stats etc. Its a bit of a learning curve but its worth learning.
And i'm guessing that to learn basic MySQL I need to go to their webpage?
Reply
#14

Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by JaTochNietDan
Quote:
Originally Posted by Yaheli
Do I have to know PHP to make a page that shows user stats online?
Yes, quite limited PHP though, I thought it was hard at first but after going through other Control Panels code its actually quite easy to match PHP + SA-MP
Hm... you have anything good I can learn from?
Well you need to learn some basic MySQL first, I thought it was very hard but after I got into it and a bit of help from G-Stylezzz its quite easy. Then once you know some basic MySQL just download Los Santos Next Episodes control panel by G-Stylezz and take a look at how he integrates user stats etc. Its a bit of a learning curve but its worth learning.
And i'm guessing that to learn basic MySQL I need to go to their webpage?
http://www.w3schools.com/PHP/php_mysql_intro.asp

That is an extremely good website for learning ANYTHING!
Reply
#15

OMG! A ready made php script! :O
Respect man! thx

EDIT: FFS, I cant see the download button --..--
Reply
#16

Quote:
Originally Posted by Rafay
OMG! A ready made php script! :O
Respect man! thx

EDIT: FFS, I cant see the download button --..--
It isn't exactly a ready made php script, theres lots of work to do... (Which I am having trouble understanding )
Reply
#17

Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by Rafay
OMG! A ready made php script! :O
Respect man! thx

EDIT: FFS, I cant see the download button --..--
It isn't exactly a ready made php script, theres lots of work to do... (Which I am having trouble understanding )
& i can't even download it!
Somebody upload it to somewhere please.!
Reply
#18

When I execute a SELECT query, selecting multiple rows, and I call the mysql_fetch_row function, the server crashes.
though it does not when i limit the results to 1 row..
Reply
#19

Quote:
Originally Posted by Rafay
Quote:
Originally Posted by Yaheli
Quote:
Originally Posted by Rafay
OMG! A ready made php script! :O
Respect man! thx

EDIT: FFS, I cant see the download button --..--
It isn't exactly a ready made php script, theres lots of work to do... (Which I am having trouble understanding )
& i can't even download it!
Somebody upload it to somewhere please.!
What script?
Reply
#20

Hai!

Nice work on the plugin!

@ Yaheli: You can take a look at SAMPSt's php files.You can learn quite a lot out of these. Link: http://forum.sa-mp.com/index.php?topic=23380.0
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)