Accueil du SiteAccueil du Site  AccueilAccueil  Dernières imagesDernières images  RechercherRechercher  ConnexionConnexion  S'enregistrerS'enregistrer  



Le deal à ne pas rater :
Fnac : 2 Funko Pop achetées : le 3ème offert (large sélection de ...
Voir le deal

Partagez
 

 [XP] Database Management v1

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Mat
Paysan (niveau 2)
Paysan (niveau 2)
Mat

Messages postés : 17
Date d'inscription : 05/09/2013
Jauge LPC :
[XP] Database Management v1 891527140040 / 10040 / 100[XP] Database Management v1 8915271400


[XP] Database Management v1 Empty
MessageSujet: [XP] Database Management v1   [XP] Database Management v1 EmptyVen 6 Sep 2013 - 22:32


Database Management v1



Auteur : Åvygeil

Description : Ce script permet d'automatiser la création et la gestion de base de données à partir de fichiers texte

Script :

Code:
#===============================================================================
# *** Database Management
#-------------------------------------------------------------------------------
# Auteur  : Åvygeil
#-------------------------------------------------------------------------------
# Ce script permet d'automatiser la création et la gestion de base de données
# à partir de fichiers texte sous un format de sérialisation spécial,
# DBSL (DataBase Serialization Language).
#===============================================================================
  
#===============================================================================
# ** Database
#-------------------------------------------------------------------------------
# Le module qui permet d'automatiquement créer les tables
# de la base de données, et les remplir.
#===============================================================================
module Database
    
  #-----------------------------------------------------------------------------
  # Chargement de la base de données de base.
  #-----------------------------------------------------------------------------
  Actor       = load_data("Data/Actors.rxdata")
  Class       = load_data("Data/Classes.rxdata")
  Skill       = load_data("Data/Skills.rxdata")
  Item        = load_data("Data/Items.rxdata")
  Weapon      = load_data("Data/Weapons.rxdata")
  Armor       = load_data("Data/Armors.rxdata")
  Enemy       = load_data("Data/Enemies.rxdata")
  Troop       = load_data("Data/Troops.rxdata")
  State       = load_data("Data/States.rxdata")
  Animation   = load_data("Data/Animations.rxdata")
  Tileset     = load_data("Data/Tilesets.rxdata")
  CommonEvent = load_data("Data/CommonEvents.rxdata")
  System      = load_data("Data/System.rxdata")
  
  #=============================================================================
  # ** Database::Table
  #-----------------------------------------------------------------------------
  # La classe Table donne une interface pour créer une classe correspondante.
  #=============================================================================
  class Table
    
    #===========================================================================
    # * Database::Table#initialize
    #     table_name  : nom de la table
    #     &block      : bloc de création des colonnes
    #---------------------------------------------------------------------------
    # La méthode initialize crée une nouvelle classe dans le module Database.
    #===========================================================================
    def initialize(table_name, &block)
      @columns = []
      @column_default_vals = []
      block.call(self)
      #-------------------------------------------------------------------------
      # Création de la classe Database::table_name
      #-------------------------------------------------------------------------
      class_table = ::Class.new
      # Constantes table_name::COLUMNS et table_name::COLUMN_DEFAULT_VALS
      class_table.const_set("COLUMNS", @columns)
      class_table.const_set("COLUMN_DEFAULT_VALS", @column_default_vals)
      class_table.class_eval{
        # Pour chaque colonne, on ajoute un accesseur
        for name in class_table.const_get("COLUMNS")
          attr_accessor name
        end
        # Constructeur des objets Database::table_name
        # Chaque champs de l'objet est mis sa valeur par défaut
       define_method("initialize") {
          columns = class_table.const_get("COLUMNS")
          column_default_vals = class_table.const_get("COLUMN_DEFAULT_VALS")
          for i in 0...columns.size
            instance_variable_set("@#{columns[i]}", column_default_vals[i])
          end
        }
        # Méthode qui renvoie la constante COLUMNS
        define_method("columns") {
          return class_table.const_get("COLUMNS")
        }
        # Database::table_name se comporte comme une table de base de données,
        # un objet Enumerable contenant une liste d'objets Database::table_name,
        # sur lequel on peut faire des requetes.
        class << self
          # Accesseur en écriture aux lignes de la table
          def rows=(rs)
            @rows = rs
          end
          # Objet Enumerable
          include Enumerable
          # Méthode each, qu itère sur les lignes de la table
         def each(&block)
            @rows.each(&block)
          end
        end
      }
      # On ajoute la classe créée au module Database.
      Database.const_set(table_name, class_table)
    end
    
    #===========================================================================
    # * Database::Table#column
    #     col_name  : nom de la colonne
    #     col_type  : type de la colonne (integer, string, boolean, array, hash)
    #---------------------------------------------------------------------------
    # Méthode d'ajout d'une colonne à la table.
    #===========================================================================
    def column(col_name, col_type, default_val = nil)
      @columns << col_name
      if default_val.nil?
        @column_default_vals << default_val(col_type)
      else
        @column_default_vals << default_val
      end
    end
    
    #===========================================================================
    # * Database::Table#default_val
    #     col_type  : type
    #---------------------------------------------------------------------------
    # Renvoie une valeur par défaut en fonction du type.
    #===========================================================================
    def default_val(col_type)
      case col_type
      when :integer
        return 0
      when :string
        return ""
      when :boolean
        return false
      when :array
        return []
      when :hash
        return {}
      else
        return nil
      end
    end
    private :default_val
    
  end
  
  #=============================================================================
  # * Database.create_table
  #     table_name  :
  #     &block      : bloc de création des colonnes
  #-----------------------------------------------------------------------------
  # Méthode de création et de remplissage d'une table de la base de données.
  #=============================================================================
  def self.create_table(table_name, &block)
    Table.new(table_name, &block)
    table = self.const_get(table_name)
    if $DEBUG
      Dir.mkdir("#{table_name} Data") rescue nil
      File.open("#{table_name} Data/template.dbsl", "w") do |file|
        file.puts(Serialization.dump(table.new))
      end
      data = []
      for dbsl_file in Dir["#{table_name} Data/*.dbsl"]
        File.open(dbsl_file, "r") do |file|
          obj = Serialization.load(file.read)
          data << obj
        end
      end
      File.open("Data/#{table_name}.rxdata", "wb") do |file|
        Marshal.dump(data, file)
      end
    end
    table.rows = load_data("Data/#{table_name}.rxdata")
  end
  
  #=============================================================================
  # ** Database::Serialization
  #-----------------------------------------------------------------------------
  # Ce module contient les méthodes qui permettent de sauver ou charger
 # des objets au format DBSL.
  #=============================================================================
  module Serialization
    
    #===========================================================================
    # * Database::Serialization.dump
    #     ruby_obj  : un objet Ruby
    #---------------------------------------------------------------------------
    # Renvoie une String représentant l'objet Ruby au format dbsl.
    #===========================================================================
    def self.dump(ruby_obj)
      s = "#{ruby_obj.class}
"
      for var in ruby_obj.columns
        s << "#{var}: #{ruby_obj.method(var).call.to_dbsl}
"
      end
      return s
    end
  
    #===========================================================================
    # * Database::Serialization.load
    #     dbsl_obj  : String représentant un "objet dbsl"
    #---------------------------------------------------------------------------
    # Récupère un objet Ruby à partir de sa description dbsl.
    #===========================================================================
    def self.load(dbsl_obj)
      lines = dbsl_obj.split("
")
      ruby_obj = eval(lines[0] + ".new")
      for line in lines[1..lines.size-1]
        expr = line.split(":")
        ruby_obj.method(expr[0]+"=").call(eval(expr[1]))
      end
      return ruby_obj
    end
    
  end
    
end

#===============================================================================
# ** Représentation DBSL des types de base
#===============================================================================

#===============================================================================
# * Nilclass
#===============================================================================
class NilClass
  
  def to_dbsl
    "nil"
  end
  
end

#===============================================================================
# * TrueClass
#===============================================================================
class TrueClass
  
  def to_dbsl
    "true"
  end
  
end

#===============================================================================
# * FalseClass
#===============================================================================
class FalseClass
  
  def to_dbsl
    "false"
  end
  
end

#===============================================================================
# * Numeric
#===============================================================================
class Numeric
  
  def to_dbsl
    to_s
  end
  
end

#===============================================================================
# * String
#===============================================================================
class String
  
  def to_dbsl
    ""#{to_s}""
  end
  
end

#===============================================================================
# * Symbol
#===============================================================================
class Symbol
  
  def to_dbsl
    ":#{to_s}"
  end
  
end

#===============================================================================
# * Array
#===============================================================================
class Array
  
  def to_dbsl
    s = "["
    if self.size != 0
      for v in self[0...self.size-1]
        s << (v.to_dbsl + ", ")
      end
      s << (self.last.to_dbsl)
    end
    s << "]"
    return s
  end
  
end

#===============================================================================
# * Hash
#===============================================================================
class Hash
  
  def to_dbsl
    s = "{"
    if self.size != 0
      for k in self.keys[0...self.size-1]
        s << ("#{k.to_dbsl} => #{self[k].to_dbsl}, ")
      end
      s << "#{self.keys.last.to_dbsl} => #{self[self.keys.last].to_dbsl}"
    end
    s << "}"
    return s
  end

end
Utilisation :

Copier le script au dessus de main.
Pour créer une nouvelle table, entre le script et main déclaré la nouvelle table sous la forme :
Code:

Database.create_table("nomDeLaTable") { |t|
  t.column :nomAttribut1, :type
  t.column :nomAttribut2, :type
}
Les types autorisés sont :
- integer : Un entier
- string : Une chaine de caractère
- boolean : Un Booléen (vrai ou faux)
- array : Un tableau de valeur
- hash : Un tableau associant un couple clé/valeur.

A l’exécution du projet, un dossier "nomDeLaTable Data" est crée, ainsi qu'un fichier template.dbsl. Copier le fichier template.dbsl et remplisse les pour chaque entités de la nouvelle table voulu.

Au cryptage du projet, un fichier "nomDeLaTable.rxdata" est crée. Il ne reste plus qu'à retirer le dossier "nomDeLaTable Data" lors de la diffusion du projet pour ne pas divulguer le contenu de la table.
Revenir en haut Aller en bas
lidenvice
Ancien staffeux
Ancien staffeux
lidenvice

Masculin
Messages postés : 1955
Date d'inscription : 18/10/2011
Jauge LPC :
[XP] Database Management v1 891527140068 / 10068 / 100[XP] Database Management v1 8915271400

[XP] Database Management v1 Membre10
[XP] Database Management v1 Doyen10
[XP] Database Management v1 Travai10
[XP] Database Management v1 Membre15
[XP] Database Management v1 Altrui10
[XP] Database Management v1 Padago10
[XP] Database Management v1 Scanar10
[XP] Database Management v1 Mappeu10
[XP] Database Management v1 Event-10
[XP] Database Management v1 Maker_10
[XP] Database Management v1 Projet16
[XP] Database Management v1 Mythe_10
[XP] Database Management v1 Riche_10
[XP] Database Management v1 Collec10
[XP] Database Management v1 Collec11
[XP] Database Management v1 Collec12
[XP] Database Management v1 Collec13
[XP] Database Management v1 Antino10
[XP] Database Management v1 Serial10


[XP] Database Management v1 Empty
MessageSujet: Re: [XP] Database Management v1   [XP] Database Management v1 EmptySam 7 Sep 2013 - 5:07

Merci de ce partage, je te donne les points.
Revenir en haut Aller en bas
 
[XP] Database Management v1
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» [RMXP] Advanced Input et Database Management - Avygeil

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Le Palais Créatif :: ~ PARTAGE ~ :: Scripts et plugins :: RPG Maker XP :: Autres-
Sauter vers: