Submit Your Article


 
RPG Maker

Welcome Guest ( Log In | Register )


  Games Resources RPG Maker VX RPG Maker XP Scripts Tutorials Downloads

 
Reply to this topicStart new topic
> Mysql support for Rgss
berka
post May 23 2010, 02:34 PM
Post #1


Level 8
Group Icon

Group: Revolutionary
Posts: 111
Type: Scripter
RM Skill: Advanced




Mysql support for Rgss
Version: 1.0
By: Berka


Introduction
This script allows you to connect to a mysql server with rgss.
Please read carefully the instructions in the script.

Screenshots
Not needed

Script


CODE
#======================================================================
#                                                                    Net::Mysql
#       29-05-2010                             www.rpgmakervx-fr.com                                    Rgss1&2  v.1
#                                                                     par berka                  
#--------------------------------------------------------------------------------------------------------------
# This script is free to use. Do not post anywhere without my permission. Credits needed.
#--------------------------------------------------------------------------------------------------------------
# Warning: if your game is cracked and decrypted, your mysql login will be available !
# Do not use with a database containing personal information.
# Your mysql host should accept external connections.
# Check with it for remote SSH access to your database.
#--------------------------------------------------------------------------------------------------------------
# This script allows interractions with a mysql database directly in the game
# It requires a file "libmysql.dll" in the game folder
#--------------------------------------------------------------------------------------------------------------
# Attention: en cas de décryptage de votre jeu, vos identifiants mysql seront accessibles !
#  Ne pas utiliser de base de donnée contenant des informations personnelles.
#  Votre hébergeur Mysql doit accepter les connexions mysql externes.
#  Vérifiez auprès de lui que vous avec un accès distant SSH à votre base de données.
#--------------------------------------------------------------------------------------------------------------------------
# Ce script permet d'interragir avec une base de données mysql directement via le jeu.
# Il nécessite un fichier "libmysql.dll" à placer dans le dossier du jeu.
#--------------------------------------------------------------------------------------------------------------------------
# — md5() support
# — Mysql functions:
#   - Net::Mysql.new([host,user,pass,base,port]) : return : mysql connection handle
#   - @mysql.close : return : bool
#   - @mysql.list_tables([filter]) : return : ["table1", "table2"]
#   - @mysql.select_db(base_name) : return : true if the db exists or false
#   - @mysql.query("query",ret=false) : return : if ret = true : rows else result handle
#   - @mysql.get_fields([handle result]) : return : ["field1", "field2"]
#   - @mysql.get_rows([handle result]) : return : [["l1 row1", "l1 row2"], ["l2 row1", "l2 row2"]]
#   - @mysql.fetch_assoc : return : {"field" => ["row1", "row2"] }
#   - @mysql.num_rows([handle result]) : return : integer
# — Html functions:
#   - "string".to_ruby : return : true, false, nil, Integer, Float, self, etc.
#   - "<berka>".htmlspecialchars : return : "&lr;berka&gt;"
#   - "<berka>".urlencode : return : "%3Cberka%3E"
#   - "%3Cberka%3E".urldecode : return : "<berka>"
#--------------------------------------------------------------------------------------------------------------------------
# SQL queries samples
# —  "SELECT * FROM table"
# —  "INSERT INTO table (fields) VALUES (values)"
# —  "INSERT INTO table SET field = value WHERE field = value"
# —  "UPDATE table SET field = value WHERE field = value"
#--------------------------------------------------------------------------------------------------------------------------
# Sample :
# @mysql = Net::Mysql.new
# @mysql.query("SELECT * FROM `members`)
# res = @mysql.fetch_assoc
# => {:id=>["1","2"], :nom=>["berka","rgss"], :age=>["19",""]}
#======================================================================

module Berka
  module Mysql
    Host   = "127.0.0.1"                          # mysql server(local : 127.0.0.1)
    User   = ""                                           # mysql user
    Pass  = ""                                           # mysql password
    Base  = "rgss"                                   # base name
    Port    = 3306                                     # server port (default: 3306)
    
    Err_Con = "Mysql:\nUnable to connect to the database"
    Err_Req = "Mysql:\nUnable to send the query"
  end
  
  module Html
    Spec_Char=["$","&","+",",","/",";",":","=","@","?"," ","<",">","#","%","{","}","|","\\","^","~","[","]","`"]
  end
end

class Numeric
  def copymem(len)
    # move memory to convert c structs to ruby objects
    Win32API.new("kernel32", "RtlMoveMemory", "ppl", "").call(buf="\0"*len,self,len);buf
  end
end

class String
  
  def to_ruby
    # detect if the string is a md5 hash
    return self if self=~/^[a-f0-9]{32}$/
    # converts syntax of a string to ruby controls
    eval(self)rescue self
  end
  
  def htmlspecialchars
    # converts special chars to html compatibles chars (ASCII)
    {"&"=>"&amp;",'"'=>"&quot;","'"=>"'","<"=>"&lr;",">"=>"&gt;"}.each_pair{|k,v|self.gsub!(k,v)}
    self
  end
    
  def urlencode
    # converts special char of url
    o="";self.scan(/./).each{|c|c="%"+c.unpack('H*')[0]if Berka::Html::Spec_Char.include?(c);o<<c};o
  end
    
  def urldecode
    # converts encoded special char of url to normal chars
    self.gsub!(/\%(\w\w)/){|c|c.gsub!("%","").hex.chr}
  end
end
  
module Net
  class Mysql
    MI=Win32API.new("libmysql.dll","mysql_init","l","l")
    MC=Win32API.new("libmysql.dll","mysql_close","l","l")
    MQ=Win32API.new("libmysql.dll","mysql_query","lp","l")
    MLT=Win32API.new("libmysql.dll","mysql_list_tables","lp","l")
    MFL=Win32API.new("libmysql.dll","mysql_fetch_lengths","p","l")
    MFR=Win32API.new("libmysql.dll","mysql_fetch_row","p","l")
    MNF=Win32API.new("libmysql.dll","mysql_num_fields","p","l")
    MFC=Win32API.new("libmysql.dll","mysql_field_count","p","l")
    MSR=Win32API.new("libmysql.dll","mysql_store_result","l","l")
    MRC=Win32API.new("libmysql.dll","mysql_real_connect","lpppplpl","l")
    MNR=Win32API.new("libmysql.dll","mysql_num_rows","p","l")
    MFFD=Win32API.new("libmysql.dll","mysql_fetch_field_direct","pi","l")
    MFRE=Win32API.new("libmysql.dll","mysql_free_result","p","l")
    MSDB=Win32API.new("libmysql.dll","mysql_select_db","p","l")
    
    attr_reader :handle
    
    def initialize(h=Berka::Mysql::Host,u=Berka::Mysql::User,p=Berka::Mysql::Pass,b=Berka::Mysql::Base,po=Berka::Mysql::Port)
      # @handle : handle of mysql initialization
      @handle=MI.call(0)
      # establishes the mysql connection
      (print(Berka::Mysql::Err_Con))if MRC.call(@handle,h,u,p,b,po,nil,0)==0
      # returns: handle
      @handle
    end
    
    def close
      # closes the current connection
      MC.call(@handle)
    end
    
    def select_db(base)
      # selects a current database
      MSDB.call(base)==true
    end
    
    def list_tables(m="")
      # lists tables request -> fetch the result -> to ruby string
      l=MFR.call(MLT.call(@my,m)).copymem(1024)
      # splits the string to array -> list of tables
      l.scan(/\t(\w+)\0/).flatten
    end
    
    def query(req,ret=false)
      # sends the query (msg error)
      (return print(Berka::Mysql::Err_Req+req))if !MQ.call(@handle,req)
      # previous results are released
      MFRE.call(@result)if @result
      # gets the results from the query -> c struct handle
      @result=MSR.call(@handle)
      ret ? get_rows(@result) : @result
    end
    
    # Proc: gets the name of the field (cstruct) -> to ruby string of handles -> to ruby string
    # returns the fieldname or nil if the field is not found.
    ReadField=Proc.new{|r,i,of|MFFD.call(r,i).copymem(1024).unpack("iissi")[0].copymem(of).delete!("\0")}
    
    def get_fields(res=nil)
      # if a result handle is provided
      r=res.nil? ? @result : res
      # gets the number of fields, offset: 8bytes-2 (cf. loop)
      nf,ch,of=MFC.call(@handle),[],6
      # each field: if the fieldname is not found: increase the offset of bytes.
      nf.times{|i|a=ReadField.call(r,i,of+=2)until a
        # add to the fields array
        ch<<a
        # reinitialize the offset for the next iteration
        of=6}
      # returns an array of fields
      ch
    end
    
    def get_rows(res=nil)
      # if a result handle is provided
      r=res.nil? ? @result : res
      # nr: number of rows, nf: number of fields
      nr,nf,en=MNR.call(r),MNF.call(r),[]
      # each row:
      nr.times{|i|
       # gets each row: c struct -> to ruby string -> to array (handles)
       c=MFR.call(r).copymem(4).unpack("i")[0]
       # gets each field length: c struct -> to ruby string -> to array (handles)
       tf=MFL.call(r).copymem(4*nf).unpack("i*")
       # size of field: offset of each field
       sf=tf.inject(0){|n,i|n+i}
       # handle of row -> to string (offset) -> to array
       en<<c.copymem(sf+nf).split("\0")
       }
       # returns each row as an array
      en
    end
    
    def num_rows(res=nil)
      # if a result handle is provided
      r=res.nil? ? @result : res
      # returns: number of rows
      MNR.call(r)
    end
    
    def fetch_assoc(to_ruby=false)
      # gets rows and fields
      h,f,r={},get_fields,get_rows
      # each field: read the rows and store them to an hash : h[:field]=[rows]
      # rows are converted to ruby objects if to_ruby == true
      f.each_with_index{|fi,i|t=[];r.each{|l|t<<l[i]};h[fi.to_sym]=(to_ruby ? t.map!{|o|o.to_ruby if o} : t)}
      h
    end
  end
end


Instructions

Paste this script above main. This script works with RMXP and RMVX
Add this file: libmysql.dll in your project's root.
Mediafire: libmysql.dll

FAQ
- the script does not work:
-> check for the remote SSH access with your webhost. Please test first in localhost.
-> your query may have syntax errors
- the script takes time to run:
-> the result of your query is too big
-> your server may be overloaded

Compatibility
No issues I guess

Credits and Thanks
The mysql team
French testers

Terms and Conditions
This script is free to use. Do not post anywhere without my permission. Credits needed.

Enjoy.

Berka
Attached File(s)
Attached File  rgss_mysql.txt ( 9.73K ) Number of downloads: 18
 


__________________________
Go to the top of the page
 
+Quote Post
   
Scriptless
post May 23 2010, 03:33 PM
Post #2


Level 1337
Group Icon

Group: Banned
Posts: 1,664
Type: Writer
RM Skill: Intermediate




You are possibly the best scripter I have ever seen.

All of your scripts are amazing, thank you for the great scripts!


__________________________
I'm not dead. Thanks.
Go to the top of the page
 
+Quote Post
   
BlackFilter
post May 25 2010, 08:24 PM
Post #3


Level 1
Group Icon

Group: Member
Posts: 13
Type: Developer
RM Skill: Intermediate




What a great script, simply amazing biggrin.gif Wish I can also create script like you, LOL tongue.gif

I may not be able to use this now, but I'm sure I will in the future... I find it useful smile.gif
Go to the top of the page
 
+Quote Post
   
berka
post May 26 2010, 12:45 AM
Post #4


Level 8
Group Icon

Group: Revolutionary
Posts: 111
Type: Scripter
RM Skill: Advanced




Thanks.
I am now working on a mini orpg.
I will release a demo as soon as possible and a new release: I have found a bug in the Mysql#get_fields method.
regards,

berka


__________________________
Go to the top of the page
 
+Quote Post
   
titogod
post May 26 2010, 05:13 AM
Post #5


Level 5
Group Icon

Group: Member
Posts: 66
Type: None
RM Skill: Undisclosed




what advantages do we have when we connect to a database?

I mean, RPG MAKER VX, can already hold music, pictures, and videos.


__________________________
Go to the top of the page
 
+Quote Post
   
berka
post May 26 2010, 05:33 AM
Post #6


Level 8
Group Icon

Group: Revolutionary
Posts: 111
Type: Scripter
RM Skill: Advanced




You can store datas in a serveur like best scores, items descriptions. You can also make a online rpg.


__________________________
Go to the top of the page
 
+Quote Post
   
berka
post May 29 2010, 05:42 AM
Post #7


Level 8
Group Icon

Group: Revolutionary
Posts: 111
Type: Scripter
RM Skill: Advanced




New version released:

- Mysql class
- select_db
- minor bugs fixed
- comments added


__________________________
Go to the top of the page
 
+Quote Post
   
efeplaya35
post Jul 23 2010, 03:01 PM
Post #8


Level 1
Group Icon

Group: Member
Posts: 5
Type: None
RM Skill: Beginner




Hey, I want create a game. This game should connect my sql tables and players can look table with html.

And Table variables have to increase with events...


can you send me a demo or can be support with msn?
Go to the top of the page
 
+Quote Post
   
bangitstyler
post Dec 19 2011, 10:50 AM
Post #9



Group Icon

Group: Member
Posts: 1
Type: Artist
RM Skill: Beginner




The link for the DLL file is dead. Is there a mirror to download from?
Go to the top of the page
 
+Quote Post
   
berka
post Dec 19 2011, 05:29 PM
Post #10


Level 8
Group Icon

Group: Revolutionary
Posts: 111
Type: Scripter
RM Skill: Advanced




Hi,

You can download the dll file here:
http://www.mediafire.com/?puz82rrmg3ygguw

Regards,

Berka


__________________________
Go to the top of the page
 
+Quote Post
   

Reply to this topicStart new topic
1 User(s) are reading this topic (1 Guests and 0 Anonymous Users)
0 Members:

 

Lo-Fi Version Time is now: 24th May 2013 - 11:59 AM
RPG RPG Revolution is an Privacy Policy and Legal
eXTReMe Tracker