public List <Tupla> leerLista(Tabla tabla, ComparadorTuplas comparador) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); List <Tupla> lista = new List <Tupla>(); while (archivo.Position < archivo.Length) { //Tupla aux = (Tupla)formatter.Deserialize(archivo); Tupla aux = leerYavanzar(archivo, tabla); if (aux != null && comparador(aux)) { lista.Add(aux); } } archivo.Close(); //archivo.Position = 0; return(lista); }
/* Construye un archivo con los datos de la clase Vida que es serializable * a partir de unos datos de Vida no serializables. */ private static void generarVidaSerializable(Vida vida, ref VidaSerializable vidaSerializable) { vidaSerializable = new VidaSerializable(); vidaSerializable.animales = new List <AnimalSerializable>(); for (int i = 0; i < vida.animales.Count; i++) { vidaSerializable.animales.Add(getAnimalSerializable(vida.animales[i])); } vidaSerializable.vegetales = new List <VegetalSerializable>(); for (int i = 0; i < vida.vegetales.Count; i++) { vidaSerializable.vegetales.Add(getVegetalSerializable(vida.vegetales[i])); } vidaSerializable.edificios = new List <EdificioSerializable>(); for (int i = 0; i < vida.edificios.Count; i++) { vidaSerializable.edificios.Add(getEdificioSerializable(vida.edificios[i])); } vidaSerializable.idActualAnimal = vida.idActualAnimal; vidaSerializable.idActualEdificio = vida.idActualEdificio; vidaSerializable.idActualVegetal = vida.idActualVegetal; vidaSerializable.posicionesColindantes = new List <Tupla <int, int> >(); for (int i = 0; i < vida.posicionesColindantes.Count; i++) { Tupla <int, int> tupla = new Tupla <int, int>(vida.posicionesColindantes[i].e1, vida.posicionesColindantes[i].e2); vidaSerializable.posicionesColindantes.Add(tupla); } generarTableroSerializable(vida.tablero, ref vidaSerializable.tablero); }
private static EdificioSerializable getEdificioSerializable(Edificio edi) { EdificioSerializable resultado = new EdificioSerializable(); resultado.compAvzConsumidosPorTurno = edi.compAvzConsumidosPorTurno; resultado.compAvzProducidosPorTurno = edi.compAvzProducidosPorTurno; resultado.compBasConsumidosPorTurno = edi.compBasConsumidosPorTurno; resultado.compBasProducidosPorTurno = edi.compBasProducidosPorTurno; resultado.energiaConsumidaPorTurno = edi.energiaConsumidaPorTurno; resultado.energiaProducidaPorTurno = edi.energiaProducidaPorTurno; resultado.matBioConsumidoPorTurno = edi.matBioConsumidoPorTurno; resultado.matBioProducidoPorTurno = edi.matBioProducidoPorTurno; resultado.idSer = edi.idSer; resultado.posX = edi.posX; resultado.posY = edi.posY; resultado.radioAccion = edi.radioAccion; resultado.modelo = getModeloSerializable(edi.tipo); resultado.tipo = getTipoEdifSerializable(edi.tipo); resultado.eficiencia = edi.eficiencia; resultado.numMetales = edi.numMetales; resultado.matBioSinProcesar = edi.matBioSinProcesar; resultado.radioAccion = edi.radioAccion; resultado.matrizRadioAccion = new List <Tupla <int, int, bool> >(); for (int i = 0; i < edi.matrizRadioAccion.Count; i++) { Tupla <int, int, bool> tupla = new Tupla <int, int, bool>(); tupla.e1 = edi.matrizRadioAccion[i].e1; tupla.e2 = edi.matrizRadioAccion[i].e2; tupla.e3 = edi.matrizRadioAccion[i].e3; resultado.matrizRadioAccion.Add(tupla); } return(resultado); }
private static Edificio getEdificioNoSerializable(Vida vida, EdificioSerializable edi) { int idSer = edi.idSer; TipoEdificio tipoEdif = getTipoEdifNoSerializable(vida, edi.tipo); int posX = edi.posX; int posY = edi.posY; int eneCons = edi.energiaConsumidaPorTurno; int compBaCons = edi.compBasConsumidosPorTurno; int compAvCons = edi.compAvzConsumidosPorTurno; int matBioCons = edi.matBioConsumidoPorTurno; int eneProd = edi.energiaProducidaPorTurno; int compBaProd = edi.compBasProducidosPorTurno; int compAvProd = edi.compAvzProducidosPorTurno; int matBioProd = edi.matBioProducidoPorTurno; float eficiencia = edi.eficiencia; int numMetales = edi.numMetales; int matBioSin = edi.matBioSinProcesar; int radioAccion = edi.radioAccion; List <Tupla <int, int, bool> > matrizRadioAccion = new List <Tupla <int, int, bool> >(); for (int i = 0; i < edi.matrizRadioAccion.Count; i++) { Tupla <int, int, bool> tupla = new Tupla <int, int, bool>(); tupla.e1 = edi.matrizRadioAccion[i].e1; tupla.e2 = edi.matrizRadioAccion[i].e2; tupla.e3 = edi.matrizRadioAccion[i].e3; matrizRadioAccion.Add(tupla); } GameObject modelo = getModeloNoSerializableReal(edi.modelo, vida.tablero[edi.posX, edi.posY].coordsVert); return(new Edificio(idSer, tipoEdif, posX, posY, eficiencia, numMetales, matrizRadioAccion, radioAccion, modelo, eneCons, compBaCons, compAvCons, matBioCons, eneProd, compBaProd, compAvProd, matBioProd, matBioSin)); }
public Tupla buscar(Tabla tabla, ComparadorTuplas comparador) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); bool encontre = false; Tupla tupla = null; while (archivo.Position < archivo.Length && !encontre) { //Tupla aux = (Tupla)formatter.Deserialize(archivo); Tupla aux = leerYavanzar(archivo, tabla); if (aux != null && comparador(aux)) { tupla = aux; encontre = true; } } archivo.Close(); //archivo.Position = 0; return(tupla); }
/// <summary> /// Busca la persona indicada, hace out de null si no estaba. /// El return true, especifica que no hubo error, false que si lo hubo /// </summary> /// <param name="baseDeDatos">Base de datos usada</param> /// <param name="dni">Dni de la persona a buscar</param> /// <param name="persona">Aqui se devuelve la persona</param> /// <returns>False si hubo error, true si no lo hubo</returns> public Boolean buscarPersona(BaseDatos baseDeDatos, String dni, out Persona persona) { int intentos = 5; persona = null; Transaccion transaccion = null; while (transaccion == null && intentos > 0) { try { transaccion = baseDeDatos.crearTransaccion(); } catch (LimiteCantidadTransaccionesException) { intentos--; } } if (transaccion != null) { intentos = 5; bool exito = false; while (intentos > 0 && !exito) { try { List <Object> condicion = new List <object>(); condicion.Add(dni); baseDeDatos.bloquear(transaccion, new CondicionPersona(0, dni), BaseDeDatos.ControlConcurrencia.TipoBloqueo.BLOQUEO_LECTURA); Tupla tupla = baseDeDatos.buscar(new TablaPersona(), new Archivo.ComparadorTuplas( delegate(Tupla t) { return(((Persona)t).Dni == dni); } )); //si no estaba, retorna null, y si se castea, quiza levante error if (tupla != null) { persona = (Persona)tupla; } baseDeDatos.commit(transaccion); return(true); } catch (AbortarEsperarMorirException) { intentos--; if (intentos > 0) { baseDeDatos.reiniciarTransaccin(transaccion); } } } return(false); } return(false); }
public void escribirEnRegistroTest() { Registro target = new Registro(); // TODO: Inicializar en un valor adecuado Transaccion transaccion = null; // TODO: Inicializar en un valor adecuado Tabla tabla = null; // TODO: Inicializar en un valor adecuado Tupla dato = null; // TODO: Inicializar en un valor adecuado target.escribirEnRegistro(transaccion, tabla, dato); Assert.Inconclusive("Un método que no devuelve ningún valor no se puede comprobar."); }
public Tupla <T1, T2>[] Zip <T1, T2>(T1[] lista1, T2[] lista2) { Tupla <T1, T2>[] arreglo = new Tupla <T1, T2> [Longitud <T1, T2>(lista1, lista2)]; for (int i = 0; i < arreglo.Length; i++) { arreglo[i] = new Tupla <T1, T2>(lista1[i], lista2[i]); } return(arreglo); }
public void escribirEnRegistro(Transaccion transaccion, Tabla tabla, Tupla dato) { lock (entradas) { EntradaRegistro ent = new EntradaEscribir(transaccion, tabla, dato); entradas.Add(ent); transaccion.agregarEntradaDeRegistro((EntradaEscribir)ent); } }
//retorno de un arreglo de tuplas public Tupla <T1, T2>[] Zip <T1, T2>(T1[] listaA, T2[] listaB) { Tupla <T1, T2>[] arreglo = new Tupla <T1, T2> [Longitud <T1, T2>(listaA, listaB)]; //agregando valores al arreglo for (int i = 0; i < arreglo.Length; i++) { arreglo[i] = new Tupla <T1, T2>(listaA[i], listaB[i]); } return(arreglo); }
/* Construye un archivo con los datos del tablero Vida a partir de * unos datos serializables. */ private static void rehacerVida(ref Vida vida, VidaSerializable vidaSerializable) { vida.idActualAnimal = vidaSerializable.idActualAnimal; vida.idActualEdificio = vidaSerializable.idActualEdificio; vida.idActualVegetal = vidaSerializable.idActualVegetal; vida.posicionesColindantes = new List <Tupla <int, int> >(); for (int i = 0; i < vidaSerializable.posicionesColindantes.Count; i++) { Tupla <int, int> tupla = new Tupla <int, int>(vidaSerializable.posicionesColindantes[i].e1, vidaSerializable.posicionesColindantes[i].e2); vida.posicionesColindantes.Add(tupla); } rehacerTablero(vidaSerializable.tablero, ref vida.tablero); }
public void testZip() { // Arrange int[] arr1 = new int[] { 1, 2, 3 }; string[] arr2 = new string[] { "hola", "mundo" }; Tupla <int, string>[] resultado = Program.Zip <int, string>(arr1, arr2); // El arreglo resultado debe ser [new Tupla(1,"hola"), new Tupla(2, "mundo")] Tupla <int, string> primer = resultado[0]; Assert.Equal(1, primer.Primero); Assert.Equal("hola", primer.Segundo); }
private async Task <HashSet <Tupla> > GetComments(Contribution c) { HashSet <Tupla> comments = new HashSet <Tupla>(); foreach (var com in c.Comments) { var com2 = await _context.Comments.Include(c2 => c2.Author).Include(c2 => c2.Comments).FirstOrDefaultAsync(c2 => c2.Id == com.Id); //_logger.LogInformation(com2.Content + " " + com2.Author.UserId); Tupla t = new Tupla(); t.Parent = com2; t.Children = await GetComments(com2); comments.Add(t); } return(comments); }
private Tupla leerYavanzar(FileStream archivo, Tabla tabla) { IFormatter formatter = new BinaryFormatter(); long posAnterior = archivo.Position; try { Tupla t = (Tupla)formatter.Deserialize(archivo); long meMovi = archivo.Position - posAnterior; archivo.Position += tabla.getCantidadBytesRegistros() - meMovi; return(t); } catch (SerializationException e) { //si entro aqui, estoy leyendo algo que se está escribiendo //asi que de seguro no es un registro que busco. Me lo garantiza //es control de bloqueo. Lo que yo leo, no se está modificando. archivo.Position = posAnterior + tabla.getCantidadBytesRegistros();//abanzo al siguiente registro return(null); } }
/// <summary> /// Escribe la persona en la base de datos (Agrega o modifica) /// <para>Puede levantar PersonaConDniYaExisteException</para> /// </summary> /// <param name="baseDeDatos">Base de datos usada</param> /// <param name="persona">Persona que se escribira</param> /// <returns>True si hubo exito, false en caso contrario</returns> public Boolean escribirPersona(BaseDatos baseDeDatos, Persona persona) { int intentos = 5; Transaccion transaccion = null; while (transaccion == null && intentos > 0) { try { transaccion = baseDeDatos.crearTransaccion(); } catch (LimiteCantidadTransaccionesException) { intentos--; } } if (transaccion != null) { intentos = 5; bool exito = false; while (intentos > 0 && !exito) { try { List <Object> condicion = new List <object>(); condicion.Add(persona.Dni); baseDeDatos.bloquear(transaccion, new CondicionPersona(0, persona.Dni), BaseDeDatos.ControlConcurrencia.TipoBloqueo.BLOQUEO_ESCRITURA); /* * Compruebo que no exista el dni */ Tupla tupla = baseDeDatos.buscar(new TablaPersona(), new Archivo.ComparadorTuplas( delegate(Tupla t) { Persona p = (Persona)t; return(p.Dni == persona.Dni && p.Id != persona.Id); //si es igual id, es modificacion } )); if (tupla != null) { baseDeDatos.abortarTransaccion(transaccion, new PersonaConDniYaExisteException().Message); throw new PersonaConDniYaExisteException(); } baseDeDatos.escribir(transaccion, new TablaPersona(), persona); baseDeDatos.commit(transaccion); exito = true; } catch (AbortarEsperarMorirException) { intentos--; if (intentos > 0) { baseDeDatos.reiniciarTransaccin(transaccion); } } } return(exito); } return(false); }
public EntradaEscribir(Transaccion transaccion, Tabla tabla, Tupla dato) : base(transaccion.Id) { this.tabla = tabla; this.dato = dato; }
public void escribir(Transaccion transaccion, Tabla tabla, Tupla dato) { dato.asignarID(); registro.escribirEnRegistro(transaccion, tabla, dato); }
public void escribir(Tabla tabla, Tupla dato) { FileStream archivo = null; //archivos.TryGetValue(tabla.getArchivo(), out archivo); archivo = new FileStream(tabla.getArchivo(), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); IFormatter formatter = new BinaryFormatter(); if (dato.getId() >= tabla.getSiguienteIdDisponible()) { //es id nuevo, inserta lock (semaforoInsertar) { archivo.Position = archivo.Length; long posicionAnterior = archivo.Position; tabla.guardarUltimoId(dato.getId()); formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } else { //modificacion Tupla t = null; //si o si va a estar, pues se usa borrado logico //pero puede no estar, si se está haciendo restauracion long posicion = 0; if (archivo.Position < archivo.Length) { posicion = archivo.Position; t = leerYavanzar(archivo, tabla); } while (archivo.Position < archivo.Length && t.getId() != dato.getId()) { posicion = archivo.Position; t = leerYavanzar(archivo, tabla); } if (t == null || t.getId() != dato.getId()) { //no estaba posicion = archivo.Length; lock (semaforoInsertar)//lock para insertar { long posicionAnterior = archivo.Position; formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } else { //estaba archivo.Position = posicion; long posicionAnterior = archivo.Position; formatter.Serialize(archivo, dato); //cada registro ocupa un maximo (Es estatico, si no hago esto es dinamico) //asi q agrego tantos byte como falten long cantidadQuefalta = tabla.getCantidadBytesRegistros() - (archivo.Position - posicionAnterior); archivo.Write(new byte[cantidadQuefalta], 0, (int)cantidadQuefalta); } } archivo.Flush(); archivo.Close(); //archivo.Position = 0; }
/* Construye un archivo con los datos del tablero Vida a partir de * unos datos serializables. */ private static void rehacerVida(ref Vida vida, VidaSerializable vidaSerializable) { vida.idActualAnimal = vidaSerializable.idActualAnimal; vida.idActualEdificio = vidaSerializable.idActualEdificio; vida.idActualVegetal = vidaSerializable.idActualVegetal; vida.posicionesColindantes = new List<Tupla<int,int>>(); for (int i = 0; i < vidaSerializable.posicionesColindantes.Count; i++) { Tupla<int,int> tupla = new Tupla<int, int>(vidaSerializable.posicionesColindantes[i].e1, vidaSerializable.posicionesColindantes[i].e2); vida.posicionesColindantes.Add(tupla); } rehacerTablero(vidaSerializable.tablero, ref vida.tablero); }
/* Construye un archivo con los datos de la clase Vida que es serializable * a partir de unos datos de Vida no serializables. */ private static void generarVidaSerializable(Vida vida, ref VidaSerializable vidaSerializable) { vidaSerializable = new VidaSerializable(); vidaSerializable.animales = new List<AnimalSerializable>(); for (int i = 0; i < vida.animales.Count; i++) { vidaSerializable.animales.Add(getAnimalSerializable(vida.animales[i])); } vidaSerializable.vegetales = new List<VegetalSerializable>(); for (int i = 0; i < vida.vegetales.Count; i++) { vidaSerializable.vegetales.Add(getVegetalSerializable(vida.vegetales[i])); } vidaSerializable.edificios = new List<EdificioSerializable>(); for (int i = 0; i < vida.edificios.Count; i++) { vidaSerializable.edificios.Add(getEdificioSerializable(vida.edificios[i])); } vidaSerializable.idActualAnimal = vida.idActualAnimal; vidaSerializable.idActualEdificio = vida.idActualEdificio; vidaSerializable.idActualVegetal = vida.idActualVegetal; vidaSerializable.posicionesColindantes = new List<Tupla<int,int>>(); for (int i = 0; i < vida.posicionesColindantes.Count; i++) { Tupla<int,int> tupla = new Tupla<int, int>(vida.posicionesColindantes[i].e1, vida.posicionesColindantes[i].e2); vidaSerializable.posicionesColindantes.Add(tupla); } generarTableroSerializable(vida.tablero, ref vidaSerializable.tablero); }
private static EdificioSerializable getEdificioSerializable(Edificio edi) { EdificioSerializable resultado = new EdificioSerializable(); resultado.compAvzConsumidosPorTurno = edi.compAvzConsumidosPorTurno; resultado.compAvzProducidosPorTurno = edi.compAvzProducidosPorTurno; resultado.compBasConsumidosPorTurno = edi.compBasConsumidosPorTurno; resultado.compBasProducidosPorTurno = edi.compBasProducidosPorTurno; resultado.energiaConsumidaPorTurno = edi.energiaConsumidaPorTurno; resultado.energiaProducidaPorTurno = edi.energiaProducidaPorTurno; resultado.matBioConsumidoPorTurno = edi.matBioConsumidoPorTurno; resultado.matBioProducidoPorTurno = edi.matBioProducidoPorTurno; resultado.idSer = edi.idSer; resultado.posX = edi.posX; resultado.posY = edi.posY; resultado.radioAccion = edi.radioAccion; resultado.modelo = getModeloSerializable(edi.tipo); resultado.tipo = getTipoEdifSerializable(edi.tipo); resultado.eficiencia = edi.eficiencia; resultado.numMetales = edi.numMetales; resultado.matBioSinProcesar = edi.matBioSinProcesar; resultado.radioAccion = edi.radioAccion; resultado.matrizRadioAccion = new List<Tupla<int, int, bool>>(); for (int i = 0; i < edi.matrizRadioAccion.Count; i++) { Tupla<int, int, bool> tupla = new Tupla<int, int, bool>(); tupla.e1 = edi.matrizRadioAccion[i].e1; tupla.e2 = edi.matrizRadioAccion[i].e2; tupla.e3 = edi.matrizRadioAccion[i].e3; resultado.matrizRadioAccion.Add(tupla); } return resultado; }
private static Edificio getEdificioNoSerializable(Vida vida, EdificioSerializable edi) { int idSer = edi.idSer; TipoEdificio tipoEdif = getTipoEdifNoSerializable(vida, edi.tipo); int posX = edi.posX; int posY = edi.posY; int eneCons = edi.energiaConsumidaPorTurno; int compBaCons = edi.compBasConsumidosPorTurno; int compAvCons = edi.compAvzConsumidosPorTurno; int matBioCons = edi.matBioConsumidoPorTurno; int eneProd = edi.energiaProducidaPorTurno; int compBaProd = edi.compBasProducidosPorTurno; int compAvProd = edi.compAvzProducidosPorTurno; int matBioProd = edi.matBioProducidoPorTurno; float eficiencia = edi.eficiencia; int numMetales = edi.numMetales; int matBioSin = edi.matBioSinProcesar; int radioAccion = edi.radioAccion; List<Tupla<int, int, bool>> matrizRadioAccion = new List<Tupla<int, int, bool>>(); for (int i = 0; i < edi.matrizRadioAccion.Count; i++) { Tupla<int, int, bool> tupla = new Tupla<int, int, bool>(); tupla.e1 = edi.matrizRadioAccion[i].e1; tupla.e2 = edi.matrizRadioAccion[i].e2; tupla.e3 = edi.matrizRadioAccion[i].e3; matrizRadioAccion.Add(tupla); } GameObject modelo = getModeloNoSerializableReal(edi.modelo, vida.tablero[edi.posX, edi.posY].coordsVert); return new Edificio(idSer, tipoEdif, posX, posY, eficiencia, numMetales, matrizRadioAccion, radioAccion, modelo, eneCons, compBaCons, compAvCons, matBioCons, eneProd, compBaProd, compAvProd, matBioProd, matBioSin); }